diff -u b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php b/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php --- b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php +++ b/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php @@ -5,88 +5,14 @@ -use Drupal\Core\Plugin\ContainerFactoryPluginInterface; -use Drupal\migrate\Plugin\MigrationInterface; -use Drupal\migrate\MigrateExecutableInterface; -use Drupal\migrate\Plugin\MigrateProcessInterface; -use Drupal\migrate\ProcessPluginBase; -use Drupal\migrate\Row; -use Symfony\Component\DependencyInjection\ContainerInterface; +@trigger_error('CckFile is deprecated in Drupal 8.3.x and will be +be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\process\d6\FieldFile +instead.', E_USER_DEPRECATED); + /** * @MigrateProcessPlugin( - * id = "d6_field_file" + * id = "d6_cck_file" * ) + * + * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use + * \Drupal\file\Plugin\migrate\process\d6\FieldFile instead. */ -class FieldFile extends ProcessPluginBase implements ContainerFactoryPluginInterface { - - /** - * The migration process plugin, configured for lookups in d6_file. - * - * @var \Drupal\migrate\Plugin\MigrateProcessInterface - */ - protected $migrationPlugin; - - /** - * Constructs a FieldFile plugin instance. - * - * @param array $configuration - * The plugin configuration. - * @param string $plugin_id - * The plugin ID. - * @param mixed $plugin_definition - * The plugin definition. - * @param \Drupal\migrate\Plugin\MigrationInterface $migration - * The current migration. - * @param \Drupal\migrate\Plugin\MigrateProcessInterface $migration_plugin - * An instance of the 'migration' process plugin. - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrateProcessInterface $migration_plugin) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - $this->migration = $migration; - $this->migrationPlugin = $migration_plugin; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { - // Configure the migration process plugin to look up migrated IDs from - // a d6 file migration. - $migration_plugin_configuration = $configuration + [ - 'migration' => 'd6_file', - 'source' => ['fid'], - ]; - - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $migration, - $container->get('plugin.manager.migrate.process')->createInstance('migration', $migration_plugin_configuration, $migration) - ); - } - - /** - * {@inheritdoc} - */ - public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { - $options = unserialize($value['data']); - - // Try to look up the ID of the migrated file. If one cannot be found, it - // means the file referenced by the current field item did not migrate for - // some reason -- file migration is notoriously brittle -- and we do NOT - // want to send invalid file references into the field system (it causes - // fatals), so return an empty item instead. - if ($fid = $this->migrationPlugin->transform($value['fid'], $migrate_executable, $row, $destination_property)) { - return [ - 'target_id' => $fid, - 'display' => $value['list'], - 'description' => isset($options['description']) ? $options['description'] : '', - 'alt' => isset($options['alt']) ? $options['alt'] : '', - 'title' => isset($options['title']) ? $options['title'] : '', - ]; - } - else { - return []; - } - } - -} +class CckFile extends FieldFile {} diff -u b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php --- b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php +++ b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php @@ -0,0 +1,165 @@ +plugin = new TextField([], 'text', []); + + $migration = $this->prophesize(MigrationInterface::class); + + // The plugin's processCckFieldValues() method will call + // setProcessOfProperty() and return nothing. So, in order to examine the + // process pipeline created by the plugin, we need to ensure that + // getProcess() always returns the last input to setProcessOfProperty(). + $migration->setProcessOfProperty(Argument::type('string'), Argument::type('array')) + ->will(function($arguments) use ($migration) { + $migration->getProcess()->willReturn($arguments[1]); + }); + + $this->migration = $migration->reveal(); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessFilteredTextFieldValues() { + $field_info = [ + 'widget_type' => 'text_textfield', + ]; + $this->plugin->processCckFieldValues($this->migration, 'body', $field_info); + + $process = $this->migration->getProcess(); + $this->assertSame('iterator', $process['plugin']); + $this->assertSame('body', $process['source']); + $this->assertSame('value', $process['process']['value']); + + // Ensure that filter format IDs will be looked up in the filter format + // migrations. + $lookup = $process['process']['format'][2]; + $this->assertSame('migration', $lookup['plugin']); + $this->assertContains('d6_filter_format', $lookup['migration']); + $this->assertContains('d7_filter_format', $lookup['migration']); + $this->assertSame('format', $lookup['source']); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessBooleanTextImplicitValues() { + $info = [ + 'widget_type' => 'optionwidgets_onoff', + 'global_settings' => [ + 'allowed_values' => "foo\nbar", + ] + ]; + $this->plugin->processCckFieldValues($this->migration, 'field', $info); + + $expected = [ + 'value' => [ + 'plugin' => 'static_map', + 'source' => 'value', + 'default_value' => 0, + 'map' => [ + 'bar' => 1, + ], + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()['process']); + } + + /** + * @covers ::processCckFieldValues + */ + public function testProcessBooleanTextExplicitValues() { + $info = [ + 'widget_type' => 'optionwidgets_onoff', + 'global_settings' => [ + 'allowed_values' => "foo|Foo\nbaz|Baz", + ] + ]; + $this->plugin->processCckFieldValues($this->migration, 'field', $info); + + $expected = [ + 'value' => [ + 'plugin' => 'static_map', + 'source' => 'value', + 'default_value' => 0, + 'map' => [ + 'baz' => 1, + ], + ], + ]; + $this->assertSame($expected, $this->migration->getProcess()['process']); + } + + /** + * Data provider for testGetFieldType(). + */ + public function getFieldTypeProvider() { + return [ + ['string_long', 'text_textfield', [ + 'text_processing' => FALSE, + ]], + ['string', 'text_textfield', [ + 'text_processing' => FALSE, + 'max_length' => 128, + ]], + ['string_long', 'text_textfield', [ + 'text_processing' => FALSE, + 'max_length' => 4096, + ]], + ['text_long', 'text_textfield', [ + 'text_processing' => TRUE, + ]], + ['text', 'text_textfield', [ + 'text_processing' => TRUE, + 'max_length' => 128, + ]], + ['text_long', 'text_textfield', [ + 'text_processing' => TRUE, + 'max_length' => 4096, + ]], + ['list_string', 'optionwidgets_buttons'], + ['list_string', 'optionwidgets_select'], + ['boolean', 'optionwidgets_onoff'], + ['text_long', 'text_textarea'], + [NULL, 'undefined'], + ]; + } + + /** + * @covers ::getFieldType + * @dataProvider getFieldTypeProvider + */ + public function testGetFieldType($expected_type, $widget_type, array $settings = []) { + $row = new Row(['widget_type' => $widget_type], ['widget_type' => []]); + $row->setSourceProperty('global_settings', $settings); + $this->assertSame($expected_type, $this->plugin->getFieldType($row)); + } + +} @@ -12,7 +177,7 @@ * @coversDefaultClass \Drupal\text\Plugin\migrate\cckfield\TextField * @group text */ -class TextCckTest extends UnitTestCase { +class TextFieldTest extends UnitTestCase { /** * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface @@ -147,7 +312,12 @@ ['list_string', 'optionwidgets_buttons'], ['list_string', 'optionwidgets_select'], ['boolean', 'optionwidgets_onoff'], - ['text_long', 'text_textarea'], + ['text_long', 'text_textarea', [ + 'text_processing' => TRUE, + ]], + ['string_long', 'text_textarea', [ + 'text_processing' => FALSE, + ]], [NULL, 'undefined'], ]; } @@ -157,7 +327,8 @@ * @dataProvider getFieldTypeProvider */ public function testGetFieldType($expected_type, $widget_type, array $settings = []) { - $row = new Row(['widget_type' => $widget_type], ['widget_type' => []]); + $row = new Row(); + $row->setSourceProperty('widget_type', $widget_type); $row->setSourceProperty('global_settings', $settings); $this->assertSame($expected_type, $this->plugin->getFieldType($row)); } only in patch2: unchanged: --- /dev/null +++ b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php @@ -0,0 +1,92 @@ +migration = $migration; + $this->migrationPlugin = $migration_plugin; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { + // Configure the migration process plugin to look up migrated IDs from + // a d6 file migration. + $migration_plugin_configuration = $configuration + [ + 'migration' => 'd6_file', + 'source' => ['fid'], + ]; + + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $migration, + $container->get('plugin.manager.migrate.process')->createInstance('migration', $migration_plugin_configuration, $migration) + ); + } + + /** + * {@inheritdoc} + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + $options = unserialize($value['data']); + + // Try to look up the ID of the migrated file. If one cannot be found, it + // means the file referenced by the current field item did not migrate for + // some reason -- file migration is notoriously brittle -- and we do NOT + // want to send invalid file references into the field system (it causes + // fatals), so return an empty item instead. + if ($fid = $this->migrationPlugin->transform($value['fid'], $migrate_executable, $row, $destination_property)) { + return [ + 'target_id' => $fid, + 'display' => $value['list'], + 'description' => isset($options['description']) ? $options['description'] : '', + 'alt' => isset($options['alt']) ? $options['alt'] : '', + 'title' => isset($options['title']) ? $options['title'] : '', + ]; + } + else { + return []; + } + } + +}