Issue #2150257 by chx, mpgeek: Add a machine name process plugin.
parent
afb6c5aa38
commit
b833c53dc5
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\migrate\Plugin\migrate\process\MachineName.
|
||||
*/
|
||||
|
||||
namespace Drupal\migrate\Plugin\migrate\process;
|
||||
|
||||
use Drupal\Core\Language\Language;
|
||||
use Drupal\Core\Plugin\PluginBase;
|
||||
use Drupal\migrate\MigrateExecutable;
|
||||
use Drupal\migrate\Plugin\MigrateProcessInterface;
|
||||
use Drupal\migrate\Row;
|
||||
|
||||
/**
|
||||
* This plugin creates a machine name.
|
||||
*
|
||||
* The current value gets transliterated, non-alphanumeric characters removed
|
||||
* and replaced by an underscore and multiple underscores are collapsed into
|
||||
* one.
|
||||
*
|
||||
* @PluginId("machine_name")
|
||||
*/
|
||||
class MachineName extends PluginBase implements MigrateProcessInterface {
|
||||
|
||||
/**
|
||||
* @var \Drupal\Core\Transliteration\PHPTransliteration
|
||||
*/
|
||||
protected $transliteration;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function transform($value, MigrateExecutable $migrate_executable, Row $row, $destination_property) {
|
||||
$new_value = $this->getTransliteration()->transliterate($value, Language::LANGCODE_DEFAULT, '_');
|
||||
$new_value = strtolower($new_value);
|
||||
$new_value = preg_replace('/[^a-z0-9_]+/', '_', $new_value);
|
||||
return preg_replace('/_+/', '_', $new_value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Drupal\Core\Transliteration\PHPTransliteration
|
||||
*/
|
||||
protected function getTransliteration() {
|
||||
if (!isset($this->transliteration)) {
|
||||
$this->transliteration = \Drupal::transliteration();
|
||||
}
|
||||
return $this->transliteration;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\migrate\Tests\process\MachineNameTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\migrate\Tests\process;
|
||||
|
||||
use Drupal\migrate\Plugin\migrate\process\TestMachineName;
|
||||
|
||||
/**
|
||||
* Tests the machine name process plugin.
|
||||
*
|
||||
* @group migrate
|
||||
* @group Drupal
|
||||
*/
|
||||
class MachineNameTest extends MigrateProcessTestCase {
|
||||
|
||||
/**
|
||||
* The mock transliteration.
|
||||
*
|
||||
* @var \Drupal\Component\Transliteration\TransliterationInterface
|
||||
*/
|
||||
protected $transliteration;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected $mapJoinable = FALSE;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getInfo() {
|
||||
return array(
|
||||
'name' => 'Machine mame process plugin',
|
||||
'description' => 'Tests the machine name process plugin.',
|
||||
'group' => 'Migrate',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setUp() {
|
||||
$this->transliteration = $this->getMockBuilder('Drupal\Component\Transliteration\TransliterationInterface')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->row = $this->getMockBuilder('Drupal\migrate\Row')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->migrateExecutable = $this->getMockBuilder('Drupal\migrate\MigrateExecutable')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests machine name transformation of non-alphanumeric characters.
|
||||
*/
|
||||
public function testMachineNames() {
|
||||
|
||||
// Tests the following transformations:
|
||||
// - non-alphanumeric character (including spaces) -> underscore,
|
||||
// - Uppercase -> lowercase,
|
||||
// - Multiple consecutive underscore -> single underscore.
|
||||
$human_name_ascii = 'foo2, the.bar;2*&the%baz!YEE____HaW ';
|
||||
$human_name = $human_name_ascii .'áéő';
|
||||
$expected_result = 'foo2_the_bar_2_the_baz_yee_haw_aeo';
|
||||
// Test for calling transliterate on mock object.
|
||||
$this->transliteration
|
||||
->expects($this->once())
|
||||
->method('transliterate')
|
||||
->with($human_name)
|
||||
->will($this->returnValue($human_name_ascii . 'aeo'));
|
||||
|
||||
$plugin = new TestMachineName(array(), 'machine_name', array());
|
||||
$plugin->setTransliteration($this->transliteration);
|
||||
$value = $plugin->transform($human_name, $this->migrateExecutable, $this->row, 'destinationproperty');
|
||||
$this->assertEquals($expected_result, $value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace Drupal\migrate\Plugin\migrate\process;
|
||||
|
||||
use Drupal\Component\Transliteration\TransliterationInterface;
|
||||
|
||||
class TestMachineName extends MachineName {
|
||||
public function setTransliteration(TransliterationInterface $transliteration) {
|
||||
$this->transliteration = $transliteration;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue