View source
<?php
namespace Drupal\migrate\Plugin\migrate\destination;
use Drupal\Component\Utility\Random;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\FieldTypePluginManagerInterface;
use Drupal\Core\TypedData\TypedDataInterface;
use Drupal\link\LinkItemInterface;
use Drupal\migrate\Entity\MigrationInterface;
use Drupal\migrate\MigrateException;
use Drupal\migrate\Plugin\MigrateIdMapInterface;
use Drupal\migrate\Row;
use Symfony\Component\DependencyInjection\ContainerInterface;
class EntityContentBase extends Entity {
protected $entityManager;
protected $fieldTypeManager;
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles);
$this->entityManager = $entity_manager;
$this->fieldTypeManager = $field_type_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
$entity_type = static::getEntityTypeId($plugin_id);
return new static($configuration, $plugin_id, $plugin_definition, $migration, $container
->get('entity.manager')
->getStorage($entity_type), array_keys($container
->get('entity.manager')
->getBundleInfo($entity_type)), $container
->get('entity.manager'), $container
->get('plugin.manager.field.field_type'));
}
public function import(Row $row, array $old_destination_id_values = array()) {
$this->rollbackAction = MigrateIdMapInterface::ROLLBACK_DELETE;
$entity = $this
->getEntity($row, $old_destination_id_values);
if (!$entity) {
throw new MigrateException('Unable to get entity');
}
return $this
->save($entity, $old_destination_id_values);
}
protected function save(ContentEntityInterface $entity, array $old_destination_id_values = array()) {
$entity
->save();
return array(
$entity
->id(),
);
}
public function getIds() {
$id_key = $this
->getKey('id');
$ids[$id_key]['type'] = 'integer';
return $ids;
}
protected function updateEntity(EntityInterface $entity, Row $row) {
if (isset($this->configuration['overwrite_properties'])) {
$clone = $row
->cloneWithoutDestination();
foreach ($this->configuration['overwrite_properties'] as $property) {
$clone
->setDestinationProperty($property, $row
->getDestinationProperty($property));
}
$row = $clone;
}
foreach ($row
->getDestination() as $field_name => $values) {
$field = $entity->{$field_name};
if ($field instanceof TypedDataInterface) {
$field
->setValue($values);
}
}
$this
->setRollbackAction($row
->getIdMap());
}
protected function processStubRow(Row $row) {
$bundle_key = $this
->getKey('bundle');
if ($bundle_key && empty($row
->getDestinationProperty($bundle_key))) {
if (empty($this->bundles)) {
throw new MigrateException('Stubbing failed, no bundles available for entity type: ' . $this->storage
->getEntityTypeId());
}
$row
->setDestinationProperty($bundle_key, reset($this->bundles));
}
$fields = $this->entityManager
->getFieldDefinitions($this->storage
->getEntityTypeId(), $bundle_key);
foreach ($fields as $field_name => $field_definition) {
if ($field_definition
->isRequired() && is_null($row
->getDestinationProperty($field_name))) {
if ($default_value = $field_definition
->getDefaultValueLiteral()) {
$values[] = $default_value;
}
else {
$field_type = $field_definition
->getType();
$field_type_class = $this->fieldTypeManager
->getPluginClass($field_definition
->getType());
$values = $field_type_class::generateSampleValue($field_definition);
if (is_null($values)) {
throw new MigrateException('Stubbing failed, unable to generate value for field ' . $field_name);
break;
}
}
$row
->setDestinationProperty($field_name, $values);
}
}
}
}