Skip to content

Instantly share code, notes, and snippets.

@chriscalip
Last active May 17, 2021 14:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chriscalip/17d4f8ac3160d878dd8f6d92d04bc7a0 to your computer and use it in GitHub Desktop.
Save chriscalip/17d4f8ac3160d878dd8f6d92d04bc7a0 to your computer and use it in GitHub Desktop.
<?php
<?php
namespace Drupal\rl_migrates\Plugin\migrate\source;
use Drupal\migrate_drupal\Plugin\migrate\source\ContentEntity;
/**
* ContentEntity migration source that accepts multiple bundles.
*
* This is a stop gap measure for:
* https://www.drupal.org/project/drupal/issues/2746541?page=1#comment-13715441
*
* @MigrateSource(
* id = "bundles_kontent_entity",
* source_module = "migrate_drupal",
* deriver = "\Drupal\migrate_drupal\Plugin\migrate\source\ContentEntityDeriver",
* )
*/
class BundlesKontentEntity extends ContentEntity {
/**
* Query to retrieve the entities.
*
* @return \Drupal\Core\Entity\Query\QueryInterface
* The query.
*/
public function query() {
$query = $this->entityTypeManager
->getStorage($this->entityType->id())
->getQuery()
->accessCheck(FALSE);
if (!empty($this->configuration['bundles'])) {
$query->condition($this->entityType->getKey('bundle'), $this->configuration['bundles'], 'IN');
}
if (!empty($this->configuration['include_allrevisions'])) {
$query->allRevisions();
}
return $query;
}
/**
* {@inheritdoc}
*/
public function getIds() {
$id_key = $this->entityType->getKey('id');
$ids[$id_key] = $this->getDefinitionFromEntity($id_key);
if ($this->entityType->isRevisionable()) {
$revision_key = $this->entityType->getKey('revision');
$ids[$revision_key] = $this->getDefinitionFromEntity($revision_key);
}
if ($this->entityType->isTranslatable()) {
$langcode_key = $this->entityType->getKey('langcode');
$ids[$langcode_key] = $this->getDefinitionFromEntity($langcode_key);
}
return $ids;
}
/**
* Initializes the iterator with the source data.
*
* @return \Generator
* A data generator for this source.
*/
protected function initializeIterator() {
$ids = $this->query()->execute();
$highWater = $this->getHighWater();
$highWaterProperty = $this->getHighWaterProperty();
$highWaterField = $this->getHighWaterField();
$shouldUseHighWater = (!empty($highWaterProperty) && !empty($highWater));
// Closure to check wheter intention is to do only-new or update all.
$intendsUpdateAll = function () : bool {
$shouldSkip = FALSE;
$arguments = $GLOBALS['argv'] ?? [];
foreach ($arguments as $argument) {
$shouldSkip = (strpos($argument, '--update') !== FALSE) ? TRUE : $shouldSkip;
}
return $shouldSkip;
};
// Array of ids is usually index by revision_id to a value of base_id.
$targetVariable = (in_array($highWaterField, ['revision_id', 'vid'])) ? 'key' : 'element';
// Filter only the array of ids that is higher than highwater.
$parsedIds = ($shouldUseHighWater && !$intendsUpdateAll()) ? array_filter($ids, function ($element, $key) use ($highWater, $targetVariable) {
$target = ${$targetVariable};
$isHigher = ($highWater <= $target);
return $isHigher;
}, ARRAY_FILTER_USE_BOTH) : $ids;
$outputYield = (!empty($this->configuration['include_allrevisions']) && method_exists($this, 'yieldEntityRevisions')) ? $this->yieldEntityRevisions($parsedIds) : $this->yieldEntities($parsedIds);
return $outputYield;
}
/**
* Loads and yields entities, one at a time.
*
* @param array $ids
* The entity IDs.
*
* @return \Generator
* An iterable of the loaded entities.
*/
protected function yieldEntities(array $ids) {
$storage = $this->entityTypeManager
->getStorage($this->entityType->id());
foreach ($ids as $id) {
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
$entity = $storage->load($id);
yield $this->toArray($entity);
if ($this->configuration['include_translations']) {
foreach ($entity->getTranslationLanguages(FALSE) as $language) {
yield $this->toArray($entity->getTranslation($language->getId()));
}
}
}
}
/**
* Loads and yields entities-revision sensitive., one at a time.
*
* @param array $ids
* The entity vid and entity ids.
*
* @return \Generator
* An iterable of the loaded entities.
*/
protected function yieldEntityRevisions(array $ids) {
$storage = $this->entityTypeManager
->getStorage($this->entityType->id());
foreach ($ids as $vid => $id) {
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
$entity = $storage->loadRevision($vid);
yield $this->toArray($entity);
if ($this->configuration['include_translations']) {
foreach ($entity->getTranslationLanguages(FALSE) as $language) {
yield $this->toArray($entity->getTranslation($language->getId()));
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment