content_sync-8.x-2.x-dev/src/DependencyResolver/ExportQueueResolver.php
src/DependencyResolver/ExportQueueResolver.php
<?php
namespace Drupal\content_sync\DependencyResolver;
use Drupal\content_sync\Content\ContentDatabaseStorage;
/**
* Class ImportQueueResolver.
*
* @package Drupal\content_sync\DependencyResolver
*/
class ExportQueueResolver implements ContentSyncResolverInterface {
/**
* The normalized data.
* @var array
*/
protected $normalizedEntities;
/**
* Queue variable.
* @var array
*/
protected $visited;
/**
* Constructs an ExportQueueResolver object.
*
* @param array $normalized_entities
* The normalized data.
* @param array $visited
* Queue variable.
*/
public function __construct(array $normalized_entities, array $visited) {
$this->normalizedEntities = $normalized_entities;
$this->visited = [];
}
/**
* Builds a graph placing the deepest vertexes at the first place.
*
* @param array $visited
* Array of vertexes to return.
* @param array $identifiers
* Array of entity identifiers to process.
* @param array $normalized_entities
* Parsed entities to import.
*/
protected function depthFirstSearch(array &$visited, array $identifiers, array $normalized_entities) {
foreach ($identifiers as $identifier) {
// Get a decoded entity.
$entity = $entity = $this->getEntity($identifier, $normalized_entities);
// Process dependencies first.
if (!empty($entity['_content_sync']['entity_dependencies'])) {
foreach ($entity['_content_sync']['entity_dependencies'] as $ref_entity_type_id => $references) {
$this->depthFirstSearch($visited, $references, $normalized_entities);
}
}
// Process translations' dependencies if any.
if (!empty($entity["_translations"])) {
foreach ($entity["_translations"] as $translation) {
if (!empty($translation['_content_sync']['entity_dependencies'])) {
foreach ($translation['_content_sync']['entity_dependencies'] as $ref_entity_type_id => $references) {
$this->depthFirstSearch($visited, $references, $normalized_entities);
}
}
}
}
if (!isset($visited[$identifier])) {
[$entity_type_id, $bundle, $uuid] = explode('.', $identifier);
$visited[$identifier] = [
'entity_type' => $entity_type_id,
'entity_uuid' => $uuid,
];
}
}
}
/**
* Gets an entity.
*
* @param $identifier
* An entity identifier to process.
* @param $normalized_entities
* An array of entity identifiers to process.
*
* @return bool|array
* Array of entity data to export or FALSE if no entity found (db error).
*/
protected function getEntity($identifier, $normalized_entities) {
if (!empty($normalized_entities[$identifier])) {
$entity = $normalized_entities[$identifier];
}
else {
$activeStorage = new ContentDatabaseStorage(\Drupal::database(), 'cs_db_snapshot');
$entity = $activeStorage->cs_read($identifier);
}
return $entity;
}
/**
* Creates a queue.
*
* @param array $normalized_entities
* Parsed entities to import.
*
* @return array
* Queue to be processed within a batch process.
*/
public function resolve() {
foreach ($this->normalizedEntities as $identifier => $entity) {
$this->depthFirstSearch($this->visited, [$identifier], $this->normalizedEntities);
}
// Reverse the array to adjust it to an array_pop-driven iterator.
return array_reverse($this->visited);
}
}
