annotate core/modules/content_moderation/src/ParamConverter/EntityRevisionConverter.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\content_moderation\ParamConverter;
Chris@0 4
Chris@0 5 use Drupal\Core\Entity\EntityInterface;
Chris@0 6 use Drupal\Core\Entity\EntityManagerInterface;
Chris@0 7 use Drupal\Core\ParamConverter\EntityConverter;
Chris@0 8 use Drupal\Core\TypedData\TranslatableInterface;
Chris@0 9 use Drupal\content_moderation\ModerationInformationInterface;
Chris@0 10 use Symfony\Component\Routing\Route;
Chris@0 11
Chris@0 12 /**
Chris@0 13 * Defines a class for making sure the edit-route loads the current draft.
Chris@0 14 */
Chris@0 15 class EntityRevisionConverter extends EntityConverter {
Chris@0 16
Chris@0 17 /**
Chris@0 18 * Moderation information service.
Chris@0 19 *
Chris@0 20 * @var \Drupal\content_moderation\ModerationInformationInterface
Chris@0 21 */
Chris@0 22 protected $moderationInformation;
Chris@0 23
Chris@0 24 /**
Chris@0 25 * EntityRevisionConverter constructor.
Chris@0 26 *
Chris@0 27 * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
Chris@0 28 * The entity manager, needed by the parent class.
Chris@0 29 * @param \Drupal\content_moderation\ModerationInformationInterface $moderation_info
Chris@0 30 * The moderation info utility service.
Chris@0 31 */
Chris@0 32 public function __construct(EntityManagerInterface $entity_manager, ModerationInformationInterface $moderation_info) {
Chris@0 33 parent::__construct($entity_manager);
Chris@0 34 $this->moderationInformation = $moderation_info;
Chris@0 35 }
Chris@0 36
Chris@0 37 /**
Chris@0 38 * {@inheritdoc}
Chris@0 39 */
Chris@0 40 public function applies($definition, $name, Route $route) {
Chris@0 41 return $this->hasPendingRevisionFlag($definition) || $this->isEditFormPage($route);
Chris@0 42 }
Chris@0 43
Chris@0 44 /**
Chris@0 45 * Determines if the route definition includes a pending revision flag.
Chris@0 46 *
Chris@0 47 * This is a custom flag defined by the Content Moderation module to load
Chris@0 48 * pending revisions rather than the default revision on a given route.
Chris@0 49 *
Chris@0 50 * @param array $definition
Chris@0 51 * The parameter definition provided in the route options.
Chris@0 52 *
Chris@0 53 * @return bool
Chris@0 54 * TRUE if the pending revision flag is set, FALSE otherwise.
Chris@0 55 */
Chris@0 56 protected function hasPendingRevisionFlag(array $definition) {
Chris@0 57 return (isset($definition['load_pending_revision']) && $definition['load_pending_revision']);
Chris@0 58 }
Chris@0 59
Chris@0 60 /**
Chris@0 61 * Determines if a given route is the edit-form for an entity.
Chris@0 62 *
Chris@0 63 * @param \Symfony\Component\Routing\Route $route
Chris@0 64 * The route definition.
Chris@0 65 *
Chris@0 66 * @return bool
Chris@0 67 * Returns TRUE if the route is the edit form of an entity, FALSE otherwise.
Chris@0 68 */
Chris@0 69 protected function isEditFormPage(Route $route) {
Chris@0 70 if ($default = $route->getDefault('_entity_form')) {
Chris@0 71 // If no operation is provided, use 'default'.
Chris@0 72 $default .= '.default';
Chris@0 73 list($entity_type_id, $operation) = explode('.', $default);
Chris@0 74 if (!$this->entityManager->hasDefinition($entity_type_id)) {
Chris@0 75 return FALSE;
Chris@0 76 }
Chris@0 77 $entity_type = $this->entityManager->getDefinition($entity_type_id);
Chris@0 78 return $operation == 'edit' && $entity_type && $entity_type->isRevisionable();
Chris@0 79 }
Chris@0 80 }
Chris@0 81
Chris@0 82 /**
Chris@0 83 * {@inheritdoc}
Chris@0 84 */
Chris@0 85 public function convert($value, $definition, $name, array $defaults) {
Chris@0 86 $entity = parent::convert($value, $definition, $name, $defaults);
Chris@0 87
Chris@0 88 if ($entity && $this->moderationInformation->isModeratedEntity($entity) && !$this->moderationInformation->isLatestRevision($entity)) {
Chris@0 89 $entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults);
Chris@0 90 $latest_revision = $this->moderationInformation->getLatestRevision($entity_type_id, $value);
Chris@0 91
Chris@0 92 if ($latest_revision instanceof EntityInterface) {
Chris@0 93 // If the entity type is translatable, ensure we return the proper
Chris@0 94 // translation object for the current context.
Chris@0 95 if ($entity instanceof TranslatableInterface) {
Chris@0 96 $latest_revision = $this->entityManager->getTranslationFromContext($latest_revision, NULL, ['operation' => 'entity_upcast']);
Chris@0 97 }
Chris@0 98 $entity = $latest_revision;
Chris@0 99 }
Chris@0 100 }
Chris@0 101
Chris@0 102 return $entity;
Chris@0 103 }
Chris@0 104
Chris@0 105 }