Commit a12f973e authored by Narendra Shenvi Desai's avatar Narendra Shenvi Desai Committed by Chris Matthews
Browse files

Issue #3208715 by n4r3n: Migrate Field formatter class third party settings from Drupal 7

parent b1060028
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
id: d7_field_formatter_class
label: 'Field formatter class settings'
migration_tags:
  - Drupal 7
  - Configuration
source:
  plugin: field_formatter_class_settings
process:
  entity_type: entity_type
  bundle:
    -
      plugin: migration_lookup
      migration: d7_field_instance
      source:
        - entity_type
        - bundle
        - field_name
    -
      plugin: extract
      index:
        - 1
  field_name: field_name
  view_mode:
    -
      plugin: migration_lookup
      migration: d7_view_modes
      source:
        - entity_type
        - view_mode
    -
      plugin: extract
      index:
        - 1
    -
      plugin: static_map
      bypass: true
      map:
        full: default
  field_formatter_class_data: 'formatter/settings/field_formatter_class'
destination:
  plugin: field_formatter_class_settings
migration_dependencies:
  required:
    - d7_field_formatter_settings
+48 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\field_formatter_class\Plugin\migrate\destination;

use Drupal\migrate\MigrateException;
use Drupal\migrate\Plugin\migrate\destination\PerComponentEntityDisplay;
use Drupal\migrate\Plugin\MigrationInterface;
use Drupal\migrate\Plugin\MigrateIdMapInterface;
use Drupal\migrate\Row;

/**
 * Persist field formatter class data to the config system.
 *
 * @MigrateDestination(
 *   id = "field_formatter_class_settings"
 * )
 */
class FieldFormatterClassSettings extends PerComponentEntityDisplay {

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\migrate\MigrateException
   */
  public function import(Row $row, array $old_destination_id_values = []) {
    $values = [];
    foreach (array_keys($this->getIds()) as $id) {
      $values[$id] = $row->getDestinationProperty($id);
    }
    $entity = $this->getEntity($values['entity_type'], $values['bundle'], $values[static::MODE_NAME]);
    $component = $entity->getComponent($values['field_name']);
    if ($component === NULL) {
      throw new MigrateException(
        sprintf('Cannot save field formatter class settings for a hidden field %s used in %s %s view mode %s', $values['field_name'], $values['entity_type'], $values['bundle'], $values[static::MODE_NAME]),
        0,
        NULL,
        MigrationInterface::MESSAGE_INFORMATIONAL,
        MigrateIdMapInterface::STATUS_IGNORED
      );
    }
    $component['third_party_settings']['field_formatter_class']['class'] =
      $row->getDestinationProperty('field_formatter_class_data');
    $entity->setComponent($values['field_name'], $component);
    $entity->save();
    return array_values($values);
  }

}
+39 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\field_formatter_class\Plugin\migrate\source;

use Drupal\field\Plugin\migrate\source\d7\FieldInstancePerViewMode;

/**
 * Migration source plugin for field formatter class settings.
 *
 * @MigrateSource(
 *   id = "field_formatter_class_settings",
 *   source_module = "field_formatter_class"
 * )
 */
class FieldFormatterClassSettings extends FieldInstancePerViewMode {

  /**
   * {@inheritdoc}
   */
  protected function initializeIterator() {
    $instances = parent::initializeIterator();
    $rows = [];
    foreach ($instances->getArrayCopy() as $instance) {
      // Returns only rows with field formatting classes.
      if (!empty($instance['formatter']['settings']['field_formatter_class'])) {
        $rows[] = $instance;
      }
    }
    return new \ArrayIterator($rows);
  }

  /**
   * {@inheritdoc}
   */
  protected function doCount() {
    return $this->initializeIterator()->count();
  }

}
+83 −0
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Contains SQL necessary to add field formatter class to third party settings.
 */

use Drupal\Core\Database\Database;

$connection = Database::getConnection();

/**
 * Updates field formatter data.
 */
$update_data = [
  [
    "field_name" => "field_tags",
    "entity_type" => "node",
    "bundle" => "article",
    "class" => "classtest1",
  ],
  [
    "field_name" => "field_image",
    "entity_type" => "node",
    "bundle" => "article",
    "class" => "classtest1 classtest2",
  ],
  [
    "field_name" => "comment_body",
    "entity_type" => "comment",
    "bundle" => "comment_node_book",
    "class" => "class test",
  ],
];

foreach ($update_data as $update) {
  $config = $connection->select('field_config_instance', 'fci')
    ->fields('fci')
    ->condition('field_name', $update['field_name'])
    ->condition('entity_type', $update['entity_type'])
    ->condition('bundle', $update['bundle'])
    ->execute()
    ->fetchAssoc();

  $data = unserialize($config['data']);

  $data['display']['default']['settings']["field_formatter_class"] = $update['class'];

  $connection->update('field_config_instance')
    ->fields(['data' => serialize($data)])
    ->condition('field_name', $update['field_name'])
    ->condition('entity_type', $update['entity_type'])
    ->condition('bundle', $update['bundle'])
    ->execute();
}

/**
 * Enable field_formatter_class module.
 */
$connection->insert('system')
  ->fields([
    'filename',
    'name',
    'type',
    'owner',
    'status',
    'bootstrap',
    'schema_version',
    'weight',
    'info',
  ])
  ->values([
    'filename' => 'sites/all/modules/contrib/field_formatter_class/field_formatter_class.module',
    'name' => 'field_formatter_class',
    'type' => 'module',
    'owner' => '',
    'status' => '1',
    'bootstrap' => '0',
    'schema_version' => '0',
    'weight' => '0',
    'info' => 'a:10:{s:4:"name";s:21:"Field Formatter Class";s:11:"description";s:48:"Allows custom HTML classes for field formatters.";s:4:"core";s:3:"7.x";s:7:"package";s:6:"Fields";s:12:"dependencies";a:2:{i:0;s:5:"field";i:1;s:24:"field_formatter_settings";}s:5:"mtime";i:1617867192;s:7:"version";N;s:3:"php";s:5:"5.2.4";s:5:"files";a:0:{}s:9:"bootstrap";i:0;}',
  ])
  ->execute();
+80 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\field_formatter_class\Kernel\Migrate\d7;

use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;

/**
 * Tests the migration of Drupal 7 field formatter class settings.
 *
 * @group field_formatter_class
 */
class MigrateFieldFormatterClassSettingsTest extends MigrateDrupal7TestBase {

  /**
   * {@inheritdoc}
   */
  public static $modules = [
    'field_formatter_class',
    'field',
    'comment',
    'datetime',
    'image',
    'link',
    'menu_ui',
    'node',
    'taxonomy',
    'telephone',
    'text',
  ];

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();
    $this->migrateFields();
    $this->loadFixture(implode(DIRECTORY_SEPARATOR, [
      DRUPAL_ROOT,
      drupal_get_path('module', 'field_formatter_class'),
      'tests',
      'fixtures',
      'update',
      'drupal7.php',
    ]));
    $migrations = [
      'd7_field_instance',
      'd7_view_modes',
      'd7_field_formatter_settings',
      'd7_field_formatter_class',
    ];
    $this->executeMigrations($migrations);
  }

  /**
   * Asserts module aspects of a particular component of a view display.
   *
   * @param string $display_id
   *   The view display ID.
   * @param string $field_id
   *   The field ID.
   * @param string $class
   *   The expected class name.
   */
  protected function assertComponent($display_id, $field_id, $class) {
    $component = EntityViewDisplay::load($display_id)->getComponent($field_id);
    $this->assertIsArray($component);
    $this->assertIdentical($class, $component['third_party_settings']['field_formatter_class']['class']);
  }

  /**
   * Tests that all expected configuration gets migrated.
   */
  public function testConfigurationMigration() {
    $this->assertComponent('node.article.default', 'field_tags', 'classtest1');
    $this->assertComponent('node.article.default', 'field_image', 'classtest1 classtest2');
    $this->assertComponent('comment.comment_node_book.default', 'comment_body', 'class test');
  }

}