EmbeddedUpdateRunner.php in Scheduled Updates 8
File
src/Plugin/UpdateRunner/EmbeddedUpdateRunner.php
View source
<?php
namespace Drupal\scheduled_updates\Plugin\UpdateRunner;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\scheduled_updates\Entity\ScheduledUpdate;
use Drupal\scheduled_updates\Plugin\BaseUpdateRunner;
use Drupal\scheduled_updates\Plugin\EntityMonitorUpdateRunnerInterface;
use Drupal\scheduled_updates\ScheduledUpdateInterface;
class EmbeddedUpdateRunner extends BaseUpdateRunner implements EntityMonitorUpdateRunnerInterface {
protected function getEmbeddedUpdates() {
$updates = [];
if ($entity_ids = $this
->getEntityIdsReferencingReadyUpdates()) {
if ($entities = $this
->loadEntitiesToUpdate($entity_ids)) {
$field_ids = $this
->getReferencingFieldIds();
foreach ($entities as $entity) {
$entity_update_ids = [];
$field_update_ids = [];
foreach ($field_ids as $field_id) {
$field_update_ids[$field_id] = $this
->getEntityReferenceTargetIds($entity, $field_id);
$entity_update_ids += $field_update_ids[$field_id];
}
$ready_update_ids = $this
->getReadyUpdateIds($entity_update_ids);
foreach ($field_update_ids as $field_id => $update_ids) {
$field_ready_update_ids = array_intersect($update_ids, $ready_update_ids);
foreach ($field_ready_update_ids as $field_ready_update_id) {
$updates[] = [
'update_id' => $field_ready_update_id,
'entity_ids' => $entity
->getRevisionId() ? [
$entity
->getRevisionId() => $entity
->id(),
] : [
$entity
->id(),
],
'field_id' => $field_id,
'entity_type' => $this
->updateEntityType(),
];
}
}
}
}
}
return $updates;
}
protected function getAllUpdates() {
return $this
->getEmbeddedUpdates();
}
public function onEntityUpdate(ContentEntityInterface $entity) {
if ($this->updateUtils
->supportsRevisionUpdates($this->scheduled_update_type)) {
$this
->deactivateUpdates($entity);
$this
->reactivateUpdates($entity);
}
}
protected function deactivateUpdates(ContentEntityInterface $entity) {
$current_update_ids = $this
->getUpdateIdsOnEntity($entity);
$revisions = $this
->getPreviousRevisionsWithUpdates($entity);
if (empty($revisions)) {
return;
}
$all_revisions_update_ids = [];
foreach ($revisions as $revision) {
$all_revisions_update_ids = array_merge($all_revisions_update_ids, $this
->getUpdateIdsOnEntity($revision));
}
$all_revisions_update_ids = array_unique($all_revisions_update_ids);
$updates_ids_not_on_current = array_diff($all_revisions_update_ids, $current_update_ids);
if ($updates_ids_not_on_current) {
$storage = $this->entityTypeManager
->getStorage('scheduled_update');
foreach ($updates_ids_not_on_current as $update_id) {
$update = $storage
->load($update_id);
$update->status = ScheduledUpdateInterface::STATUS_INACTIVE;
$update
->save();
}
}
}
protected function reactivateUpdates(ContentEntityInterface $entity) {
if ($update_ids = $this
->getUpdateIdsOnEntity($entity)) {
$storage = $this->entityTypeManager
->getStorage('scheduled_update');
$query = $storage
->getQuery();
$query
->condition('status', [
ScheduledUpdateInterface::STATUS_UNRUN,
ScheduledUpdateInterface::STATUS_REQUEUED,
], 'NOT IN');
$query
->condition($this->entityTypeManager
->getDefinition('scheduled_update')
->getKey('id'), $update_ids, 'IN');
$non_active_update_ids = $query
->execute();
$non_active_updates = $storage
->loadMultiple($non_active_update_ids);
foreach ($non_active_updates as $non_active_update) {
$non_active_update->status = ScheduledUpdateInterface::STATUS_UNRUN;
}
}
}
protected function getUpdateIdsOnEntity(ContentEntityInterface $entity, $include_inactive = FALSE) {
$field_ids = $this
->getReferencingFieldIds();
$update_ids = [];
foreach ($field_ids as $field_id) {
$field_update_ids = $this
->getEntityReferenceTargetIds($entity, $field_id);
foreach ($field_update_ids as $field_update_id) {
$update = $this->entityTypeManager
->getStorage('scheduled_update')
->load($field_update_id);
if ($update && $update
->bundle() == $this->scheduled_update_type
->id()) {
if (!$include_inactive) {
if ($update->status->value == ScheduledUpdateInterface::STATUS_INACTIVE) {
continue;
}
}
$update_ids[$field_update_id] = $field_update_id;
}
}
}
return $update_ids;
}
protected function getPreviousRevisionsWithUpdates(ContentEntityInterface $entity) {
$revisions = [];
$type = $entity
->getEntityType();
$query = $this->entityTypeManager
->getStorage($entity
->getEntityTypeId())
->getQuery();
$query
->allRevisions()
->condition($type
->getKey('id'), $entity
->id())
->condition($type
->getKey('revision'), $entity
->getRevisionId(), '<')
->sort($type
->getKey('revision'), 'DESC');
if ($revision_ids = $query
->execute()) {
$revision_ids = array_keys($revision_ids);
$storage = $this->entityTypeManager
->getStorage($entity
->getEntityTypeId());
foreach ($revision_ids as $revision_id) {
$revision = $storage
->loadRevision($revision_id);
if ($update_ids = $this
->getUpdateIdsOnEntity($revision)) {
$revisions[$revision_id] = $revision;
}
}
}
return $revisions;
}
}