storage = $storage; $this->bundles = $bundles; $this->supportsRollback = TRUE; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { $entity_type_id = static::getEntityTypeId($plugin_id); return new static( $configuration, $plugin_id, $plugin_definition, $migration, $container->get('entity.manager')->getStorage($entity_type_id), array_keys($container->get('entity.manager')->getBundleInfo($entity_type_id)) ); } /** * Finds the entity type from configuration or plugin ID. * * @param string $plugin_id * The plugin ID. * * @return string * The entity type. */ protected static function getEntityTypeId($plugin_id) { // Remove "entity:". return substr($plugin_id, 7); } /** * Gets the bundle for the row taking into account the default. * * @param \Drupal\migrate\Row $row * The current row we're importing. * * @return string * The bundle for this row. */ public function getBundle(Row $row) { $default_bundle = isset($this->configuration['default_bundle']) ? $this->configuration['default_bundle'] : ''; $bundle_key = $this->getKey('bundle'); return $row->getDestinationProperty($bundle_key) ?: $default_bundle; } /** * {@inheritdoc} */ public function fields(MigrationInterface $migration = NULL) { // TODO: Implement fields() method. } /** * Creates or loads an entity. * * @param \Drupal\migrate\Row $row * The row object. * @param array $old_destination_id_values * The old destination IDs. * * @return \Drupal\Core\Entity\EntityInterface * The entity we are importing into. */ protected function getEntity(Row $row, array $old_destination_id_values) { $entity_id = reset($old_destination_id_values) ?: $this->getEntityId($row); if (!empty($entity_id) && ($entity = $this->storage->load($entity_id))) { // Allow updateEntity() to change the entity. $entity = $this->updateEntity($entity, $row) ?: $entity; } else { // Attempt to ensure we always have a bundle. if ($bundle = $this->getBundle($row)) { $row->setDestinationProperty($this->getKey('bundle'), $bundle); } // Stubs might need some required fields filled in. if ($row->isStub()) { $this->processStubRow($row); } $entity = $this->storage->create($row->getDestination()); $entity->enforceIsNew(); } return $entity; } /** * Gets the entity ID of the row. * * @param \Drupal\migrate\Row $row * The row of data. * * @return string * The entity ID for the row that we are importing. */ protected function getEntityId(Row $row) { return $row->getDestinationProperty($this->getKey('id')); } /** * Returns a specific entity key. * * @param string $key * The name of the entity key to return. * * @return string|bool * The entity key, or FALSE if it does not exist. * * @see \Drupal\Core\Entity\EntityTypeInterface::getKeys() */ protected function getKey($key) { return $this->storage->getEntityType()->getKey($key); } /** * {@inheritdoc} */ public function rollback(array $destination_identifier) { // Delete the specified entity from Drupal if it exists. $entity = $this->storage->load(reset($destination_identifier)); if ($entity) { $entity->delete(); } } /** * {@inheritdoc} */ public function calculateDependencies() { $this->addDependency('module', $this->storage->getEntityType()->getProvider()); return $this->dependencies; } }