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 }
|