class FieldInstance

Same name in this branch
  1. 11.x core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php \Drupal\field\Plugin\migrate\source\d6\FieldInstance
Same name in other branches
  1. 9 core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php \Drupal\field\Plugin\migrate\source\d6\FieldInstance
  2. 9 core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php \Drupal\field\Plugin\migrate\source\d7\FieldInstance
  3. 8.9.x core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php \Drupal\field\Plugin\migrate\source\d6\FieldInstance
  4. 8.9.x core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php \Drupal\field\Plugin\migrate\source\d7\FieldInstance
  5. 10 core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php \Drupal\field\Plugin\migrate\source\d6\FieldInstance
  6. 10 core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php \Drupal\field\Plugin\migrate\source\d7\FieldInstance

Drupal 7 field instances source from database.

If the Drupal 7 Title module is enabled, the fields it provides are not migrated. The values of those fields will be migrated to the base fields they were replacing.

Available configuration keys:

  • entity_type: (optional) The entity type (machine name) to filter field instances retrieved from the source. If omitted, all field instances are retrieved.
  • bundle: (optional) The bundle machine name to filter field instances retrieved from the source. It should be used in combination with entity_type property and will be ignored otherwise.

Examples:


source:
  plugin: d7_field_instance
  entity_type: node

In this example field instances of node entity type are retrieved from the source database.


source:
  plugin: d7_field_instance
  entity_type: node
  bundle: page

In this example field instances of page content type are retrieved from the source database.

For additional configuration keys, refer to the parent classes.

Hierarchy

Expanded class hierarchy of FieldInstance

See also

\Drupal\migrate\Plugin\migrate\source\SqlBase

\Drupal\migrate\Plugin\migrate\source\SourcePluginBase

1 file declares its use of FieldInstance
FieldDiscoveryTest.php in core/modules/migrate_drupal/tests/src/Kernel/d7/FieldDiscoveryTest.php

File

core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php, line 52

Namespace

Drupal\field\Plugin\migrate\source\d7
View source
class FieldInstance extends DrupalSqlBase {
    
    /**
     * {@inheritdoc}
     */
    public function query() {
        $query = $this->select('field_config_instance', 'fci')
            ->fields('fci')
            ->fields('fc', [
            'type',
            'translatable',
        ])
            ->condition('fc.active', 1)
            ->condition('fc.storage_active', 1)
            ->condition('fc.deleted', 0)
            ->condition('fci.deleted', 0);
        $query->join('field_config', 'fc', '[fci].[field_id] = [fc].[id]');
        // Optionally filter by entity type and bundle.
        if (isset($this->configuration['entity_type'])) {
            $query->condition('fci.entity_type', $this->configuration['entity_type']);
            if (isset($this->configuration['bundle'])) {
                $query->condition('fci.bundle', $this->configuration['bundle']);
            }
        }
        // The Title module fields are not migrated.
        if ($this->moduleExists('title')) {
            $title_fields = [
                'title_field',
                'name_field',
                'description_field',
                'subject_field',
            ];
            $query->condition('fc.field_name', $title_fields, 'NOT IN');
        }
        return $query;
    }
    
    /**
     * {@inheritdoc}
     */
    protected function initializeIterator() {
        $results = $this->prepareQuery()
            ->execute()
            ->fetchAll();
        // Group all instances by their base field.
        $instances = [];
        foreach ($results as $result) {
            $instances[$result['field_id']][] = $result;
        }
        // Add the array of all instances using the same base field to each row.
        $rows = [];
        foreach ($results as $result) {
            $result['instances'] = $instances[$result['field_id']];
            $rows[] = $result;
        }
        return new \ArrayIterator($rows);
    }
    
    /**
     * {@inheritdoc}
     */
    public function fields() {
        return [
            'id' => $this->t('The field instance ID.'),
            'field_id' => $this->t('The field ID.'),
            'field_name' => $this->t('The field name.'),
            'entity_type' => $this->t('The entity type.'),
            'bundle' => $this->t('The entity bundle.'),
            'data' => $this->t('The field instance data.'),
            'deleted' => $this->t('Deleted'),
            'type' => $this->t('The field type'),
            'instances' => $this->t('The field instances.'),
            'field_definition' => $this->t('The field definition.'),
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    public function prepareRow(Row $row) {
        foreach (unserialize($row->getSourceProperty('data')) as $key => $value) {
            $row->setSourceProperty($key, $value);
        }
        $field_definition = $this->select('field_config', 'fc')
            ->fields('fc')
            ->condition('id', $row->getSourceProperty('field_id'))
            ->execute()
            ->fetch();
        $row->setSourceProperty('field_definition', $field_definition);
        // Determine the translatable setting.
        $translatable = FALSE;
        if ($row->getSourceProperty('entity_type') == 'node') {
            $language_content_type_bundle = (int) $this->variableGet('language_content_type_' . $row->getSourceProperty('bundle'), 0);
            // language_content_type_[bundle] may be
            // - 0: no language support
            // - 1: language assignment support
            // - 2: node translation support
            // - 4: entity translation support
            if ($language_content_type_bundle === 2 || $language_content_type_bundle === 4 && $row->getSourceProperty('translatable')) {
                $translatable = TRUE;
            }
        }
        else {
            // This is not a node entity. Get the translatable value from the source
            // field_config table.
            $field_data = unserialize($field_definition['data']);
            $translatable = $field_data['translatable'];
        }
        // Check if this is an i18n synchronized field.
        $synchronized_fields = $this->variableGet('i18n_sync_node_type_' . $row->getSourceProperty('bundle'), NULL);
        if ($synchronized_fields) {
            if (in_array($row->getSourceProperty('field_name'), $synchronized_fields)) {
                $translatable = FALSE;
            }
        }
        $row->setSourceProperty('translatable', $translatable);
        // Get the vid for each allowed value for taxonomy term reference fields
        // which is used in a migration_lookup in the process pipeline.
        if ($row->getSourceProperty('type') == 'taxonomy_term_reference') {
            $vocabulary = [];
            $data = unserialize($field_definition['data']);
            foreach ($data['settings']['allowed_values'] as $allowed_value) {
                $vocabulary[] = $allowed_value['vocabulary'];
            }
            $query = $this->select('taxonomy_vocabulary', 'v')
                ->fields('v', [
                'vid',
            ])
                ->condition('machine_name', $vocabulary, 'IN');
            $allowed_vid = $query->execute()
                ->fetchAllAssoc('vid');
            $row->setSourceProperty('allowed_vid', $allowed_vid);
            // If there is an i18n_mode use it to determine if this field is
            // translatable. It is TRUE for i18n_modes 'Vocab Fixed' and  'Translate',
            // for all others it is FALSE. When there is a term reference field with
            // two vocabularies where one vocabulary is translatable and other is not
            // the field itself is set to not translatable. Note mode '5' is not used
            // for taxonomy but is listed here for completeness.
            // - 0: No multilingual options.
            // - 1: Localize. Localizable object.
            // - 2: Fixed Language.
            // - 4: Translate. Multilingual objects.
            // - 5: Objects are translatable, if they have language or localizable
            // if not)
            if ($this->getDatabase()
                ->schema()
                ->fieldExists('taxonomy_vocabulary', 'i18n_mode')) {
                $query = $this->select('taxonomy_vocabulary', 'v')
                    ->fields('v', [
                    'i18n_mode',
                ])
                    ->condition('machine_name', $vocabulary, 'IN');
                $results = $query->execute()
                    ->fetchAllAssoc('i18n_mode');
                $translatable = FALSE;
                foreach ($results as $result) {
                    if ($result['i18n_mode'] == '2' || $result['i18n_mode'] == '4') {
                        $translatable = TRUE;
                    }
                }
                $row->setSourceProperty('translatable', $translatable);
            }
        }
        // Get the user roles for user reference fields.
        if ($row->getSourceProperty('type') == 'user_reference') {
            $data = unserialize($field_definition['data']);
            if (!empty($data['settings']['referenceable_roles'])) {
                $rid = $data['settings']['referenceable_roles'];
                $query = $this->select('role', 'r')
                    ->fields('r')
                    ->condition('rid', $rid, 'IN');
                $results = $query->execute()
                    ->fetchAll();
                $row->setSourceProperty('roles', $results);
            }
        }
        return parent::prepareRow($row);
    }
    
    /**
     * {@inheritdoc}
     */
    public function getIds() {
        return [
            'entity_type' => [
                'type' => 'string',
                'alias' => 'fci',
            ],
            'bundle' => [
                'type' => 'string',
                'alias' => 'fci',
            ],
            'field_name' => [
                'type' => 'string',
                'alias' => 'fci',
            ],
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    protected function doCount() {
        return $this->initializeIterator()
            ->count();
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
DependencyTrait::$dependencies protected property The object's dependencies.
DependencyTrait::addDependencies protected function Adds multiple dependencies.
DependencyTrait::addDependency protected function Adds a dependency.
DrupalSqlBase::$entityTypeManager protected property The entity type manager.
DrupalSqlBase::$requirements protected property If the source provider is missing.
DrupalSqlBase::$systemData protected property The contents of the system table.
DrupalSqlBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
DrupalSqlBase::checkRequirements public function Checks if requirements for this plugin are OK. Overrides SqlBase::checkRequirements 4
DrupalSqlBase::create public static function Creates an instance of the plugin. Overrides SqlBase::create 2
DrupalSqlBase::getModuleSchemaVersion protected function Retrieves a module schema_version from the source Drupal database.
DrupalSqlBase::getSystemData public function Retrieves all system data information from the source Drupal database.
DrupalSqlBase::moduleExists protected function Checks if a given module is enabled in the source Drupal database.
DrupalSqlBase::variableGet protected function Reads a variable from a source Drupal database.
DrupalSqlBase::__construct public function Overrides SqlBase::__construct 5
FieldInstance::doCount protected function Gets the source count using countQuery(). Overrides SqlBase::doCount
FieldInstance::fields public function Returns available fields on the source. Overrides MigrateSourceInterface::fields 2
FieldInstance::getIds public function Defines the source fields uniquely identifying a source row. Overrides MigrateSourceInterface::getIds 3
FieldInstance::initializeIterator protected function Initializes the iterator with the source data. Overrides SqlBase::initializeIterator 2
FieldInstance::prepareRow public function Adds additional data to the row. Overrides SourcePluginBase::prepareRow
FieldInstance::query public function Prepares query object to retrieve data from the source database. Overrides SqlBase::query
MigrateSourceInterface::NOT_COUNTABLE constant Indicates that the source is not countable.
PluginInspectionInterface::getPluginDefinition public function Gets the definition of the plugin implementation. 7
PluginInspectionInterface::getPluginId public function Gets the plugin ID of the plugin instance. 3
SourcePluginBase::$cache protected property The backend cache.
SourcePluginBase::$cacheCounts protected property Whether this instance should cache the source count. 1
SourcePluginBase::$cacheKey protected property Key to use for caching counts.
SourcePluginBase::$currentRow protected property The current row from the query.
SourcePluginBase::$currentSourceIds protected property The primary key of the current row.
SourcePluginBase::$highWaterProperty protected property Information on the property used as the high-water mark.
SourcePluginBase::$highWaterStorage protected property The key-value storage for the high-water value.
SourcePluginBase::$idMap protected property The migration ID map.
SourcePluginBase::$iterator protected property The iterator to iterate over the source rows.
SourcePluginBase::$mapRowAdded protected property Flags whether source plugin will read the map row and add to data row.
SourcePluginBase::$migration protected property The entity migration object.
SourcePluginBase::$moduleHandler protected property The module handler service. 2
SourcePluginBase::$originalHighWater protected property The high water mark at the beginning of the import operation.
SourcePluginBase::$skipCount protected property Whether this instance should not attempt to count the source. 1
SourcePluginBase::$trackChanges protected property Flags whether to track changes to incoming data. 1
SourcePluginBase::aboveHighWater protected function Check if the incoming data is newer than what we've previously imported.
SourcePluginBase::count public function Gets the source count. 3
SourcePluginBase::current public function
SourcePluginBase::getCache protected function Gets the cache object.
SourcePluginBase::getCurrentIds public function Gets the currentSourceIds data member.
SourcePluginBase::getHighWater protected function The current value of the high water mark.
SourcePluginBase::getHighWaterField protected function Get the name of the field used as the high watermark.
SourcePluginBase::getHighWaterProperty protected function Get information on the property used as the high watermark.
SourcePluginBase::getHighWaterStorage protected function Get the high water storage object.
SourcePluginBase::getIterator protected function Returns the iterator that will yield the row arrays to be processed.
SourcePluginBase::getModuleHandler protected function Gets the module handler.
SourcePluginBase::getSourceModule public function Gets the source module providing the source data. Overrides MigrateSourceInterface::getSourceModule
SourcePluginBase::key public function Gets the iterator key.
SourcePluginBase::next public function
SourcePluginBase::postRollback public function Performs post-rollback tasks. Overrides RollbackAwareInterface::postRollback
SourcePluginBase::preRollback public function Performs pre-rollback tasks. Overrides RollbackAwareInterface::preRollback
SourcePluginBase::rowChanged protected function Checks if the incoming row has changed since our last import.
SourcePluginBase::saveHighWater protected function Save the new high water mark.
SourcePluginBase::valid public function Checks whether the iterator is currently valid.
SqlBase::$batch protected property The count of the number of batches run.
SqlBase::$batchSize protected property Number of records to fetch from the database during each batch.
SqlBase::$database protected property The database object. 1
SqlBase::$query protected property The query string. 83
SqlBase::$state protected property State service for retrieving database info.
SqlBase::fetchNextBatch protected function Prepares query for the next set of data from the source database.
SqlBase::fetchNextRow protected function Position the iterator to the following row. Overrides SourcePluginBase::fetchNextRow
SqlBase::getDatabase public function Gets the database connection object. 2
SqlBase::mapJoinable protected function Checks if we can join against the map table. 1
SqlBase::prepareQuery protected function Adds tags and metadata to the query. 1
SqlBase::rewind public function Rewinds the iterator. Overrides SourcePluginBase::rewind
SqlBase::select protected function Wrapper for database select.
SqlBase::setUpDatabase protected function Gets a connection to the referenced database.
SqlBase::__sleep public function
SqlBase::__toString public function Prints the query string when the object is used as a string. Overrides MigrateSourceInterface::__toString

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.