FieldableEntity.php

Same filename and directory in other branches
  1. 9 core/modules/migrate_drupal/src/Plugin/migrate/source/d7/FieldableEntity.php
  2. 8.9.x core/modules/migrate_drupal/src/Plugin/migrate/source/d7/FieldableEntity.php
  3. 10 core/modules/migrate_drupal/src/Plugin/migrate/source/d7/FieldableEntity.php

Namespace

Drupal\migrate_drupal\Plugin\migrate\source\d7

File

core/modules/migrate_drupal/src/Plugin/migrate/source/d7/FieldableEntity.php

View source
<?php

namespace Drupal\migrate_drupal\Plugin\migrate\source\d7;

use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;

/**
 * Base class for D7 source plugins which need to collect field values.
 *
 * Field values are collected from the Field API.
 *
 * Refer to the existing implementations for examples:
 * @see \Drupal\node\Plugin\migrate\source\d7\Node
 * @see \Drupal\user\Plugin\migrate\source\d7\User
 *
 * For available configuration keys, refer to the parent classes.
 *
 * @see \Drupal\migrate\Plugin\migrate\source\SqlBase
 * @see \Drupal\migrate\Plugin\migrate\source\SourcePluginBase
 */
abstract class FieldableEntity extends DrupalSqlBase {
    
    /**
     * Cached field and field instance definitions.
     *
     * @var array
     */
    protected $fieldInfo;
    
    /**
     * Returns all non-deleted field instances attached to a specific entity type.
     *
     * Typically, getFields() is used in the prepareRow method of a source plugin
     * to get a list of all the field instances of the entity. A source plugin can
     * then loop through the list of fields to do any other preparation before
     * processing the row. Typically, a source plugin will use getFieldValues()
     * to get the values of each field.
     *
     * @param string $entity_type
     *   The entity type ID.
     * @param string|null $bundle
     *   (optional) The bundle.
     *
     * @return array[]
     *   The field instances, keyed by field name.
     */
    protected function getFields($entity_type, $bundle = NULL) {
        $cid = $entity_type . ':' . ($bundle ?? '');
        if (!isset($this->fieldInfo[$cid])) {
            $query = $this->select('field_config_instance', 'fci')
                ->fields('fci')
                ->condition('fci.entity_type', $entity_type)
                ->condition('fci.bundle', $bundle ?? $entity_type)
                ->condition('fci.deleted', 0);
            // Join the 'field_config' table and add the 'translatable' setting to the
            // query.
            $query->leftJoin('field_config', 'fc', '[fci].[field_id] = [fc].[id]');
            $query->addField('fc', 'translatable');
            $this->fieldInfo[$cid] = $query->execute()
                ->fetchAllAssoc('field_name');
        }
        return $this->fieldInfo[$cid];
    }
    
    /**
     * Retrieves field values for a single field of a single entity.
     *
     * Typically, getFieldValues() is used in the prepareRow method of a source
     * plugin where the return values are placed on the row source.
     *
     * @param string $entity_type
     *   The entity type.
     * @param string $field
     *   The field name.
     * @param int $entity_id
     *   The entity ID.
     * @param int|null $revision_id
     *   (optional) The entity revision ID.
     * @param string $language
     *   (optional) The field language.
     *
     * @return array
     *   The raw field values, keyed and sorted by delta.
     */
    protected function getFieldValues($entity_type, $field, $entity_id, $revision_id = NULL, $language = NULL) {
        $table = (isset($revision_id) ? 'field_revision_' : 'field_data_') . $field;
        $query = $this->select($table, 't')
            ->fields('t')
            ->condition('entity_type', $entity_type)
            ->condition('entity_id', $entity_id)
            ->condition('deleted', 0)
            ->orderBy('delta');
        if (isset($revision_id)) {
            $query->condition('revision_id', $revision_id);
        }
        // Add 'language' as a query condition if it has been defined by Entity
        // Translation.
        if ($language) {
            $query->condition('language', $language);
        }
        $values = [];
        foreach ($query->execute() as $row) {
            foreach ($row as $key => $value) {
                $delta = $row['delta'];
                if (str_starts_with($key, $field)) {
                    $column = substr($key, strlen($field) + 1);
                    $values[$delta][$column] = $value;
                }
            }
        }
        return $values;
    }
    
    /**
     * Checks if an entity type uses Entity Translation.
     *
     * @param string $entity_type
     *   The entity type.
     *
     * @return bool
     *   Whether the entity type uses entity translation.
     */
    protected function isEntityTranslatable($entity_type) {
        return in_array($entity_type, $this->variableGet('entity_translation_entity_types', []), TRUE);
    }
    
    /**
     * Gets an entity source language from the 'entity_translation' table.
     *
     * @param string $entity_type
     *   The entity type.
     * @param int $entity_id
     *   The entity ID.
     *
     * @return string|bool
     *   The entity source language or FALSE if no source language was found.
     */
    protected function getEntityTranslationSourceLanguage($entity_type, $entity_id) {
        try {
            return $this->select('entity_translation', 'et')
                ->fields('et', [
                'language',
            ])
                ->condition('entity_type', $entity_type)
                ->condition('entity_id', $entity_id)
                ->condition('source', '')
                ->execute()
                ->fetchField();
        } catch (\Exception $e) {
            return FALSE;
        }
    }

}

Classes

Title Deprecated Summary
FieldableEntity Base class for D7 source plugins which need to collect field values.

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