ScheduledTransitionsNewRevision.php in Scheduled Transitions 2.x
File
src/EventSubscriber/ScheduledTransitionsNewRevision.php
View source
<?php
declare (strict_types=1);
namespace Drupal\scheduled_transitions\EventSubscriber;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\TypedData\TranslatableInterface;
use Drupal\scheduled_transitions\Entity\ScheduledTransition;
use Drupal\scheduled_transitions\Event\ScheduledTransitionsEvents;
use Drupal\scheduled_transitions\Event\ScheduledTransitionsNewRevisionEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ScheduledTransitionsNewRevision implements EventSubscriberInterface {
protected $entityTypeManager;
protected $logger;
public function __construct(EntityTypeManagerInterface $entityTypeManager, LoggerInterface $logger) {
$this->entityTypeManager = $entityTypeManager;
$this->logger = $logger;
}
public function newRevision(ScheduledTransitionsNewRevisionEvent $event) : void {
$scheduledTransition = $event
->getScheduledTransition();
$scheduledTransitionId = $scheduledTransition
->id();
$targs = [
'@id' => $scheduledTransitionId,
];
$entity = $scheduledTransition
->getEntity();
if (!$entity) {
$this->logger
->info('Entity does not exist for scheduled transition #@id', $targs);
return;
}
$entityRevisionId = $scheduledTransition
->getEntityRevisionId();
if (!$entityRevisionId) {
$this->logger
->debug('New revision will be determined dynamically for scheduled transition #@id', $targs);
return;
}
$entityStorage = $this->entityTypeManager
->getStorage($entity
->getEntityTypeId());
$newRevision = $entityStorage
->loadRevision($entityRevisionId);
if (!isset($newRevision)) {
$this->logger
->info('Target revision does not exist for scheduled transition #@id', $targs);
return;
}
$entityRevisionLanguage = $scheduledTransition
->getEntityRevisionLanguage();
if ($entityRevisionLanguage && $newRevision instanceof TranslatableInterface && $newRevision
->hasTranslation($entityRevisionLanguage)) {
$newRevision = $newRevision
->getTranslation($entityRevisionLanguage);
}
$event
->setNewRevision($newRevision);
}
public function latestRevision(ScheduledTransitionsNewRevisionEvent $event) : void {
$scheduledTransition = $event
->getScheduledTransition();
$options = $scheduledTransition
->getOptions();
if (!isset($options[ScheduledTransition::OPTION_LATEST_REVISION])) {
return;
}
$entity = $scheduledTransition
->getEntity();
if ($entity) {
$entityStorage = $this->entityTypeManager
->getStorage($entity
->getEntityTypeId());
$latestRevisionId = $entityStorage
->getLatestRevisionId($entity
->id());
if ($latestRevisionId) {
$newRevision = $entityStorage
->loadRevision($latestRevisionId);
}
}
if (!isset($newRevision)) {
return;
}
$entityRevisionLanguage = $scheduledTransition
->getEntityRevisionLanguage();
if ($entityRevisionLanguage && $newRevision instanceof TranslatableInterface && $newRevision
->hasTranslation($entityRevisionLanguage)) {
$newRevision = $newRevision
->getTranslation($entityRevisionLanguage);
}
$this->logger
->debug('Latest revision was loaded for for scheduled transition #@id', [
'@id' => $scheduledTransition
->id(),
]);
$event
->setNewRevision($newRevision);
$event
->stopPropagation();
}
public static function getSubscribedEvents() : array {
$events[ScheduledTransitionsEvents::NEW_REVISION][] = [
'latestRevision',
1000,
];
$events[ScheduledTransitionsEvents::NEW_REVISION][] = [
'newRevision',
];
return $events;
}
}