Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\content_moderation\Entity;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Entity\ContentEntityBase;
|
Chris@0
|
6 use Drupal\Core\Entity\EntityInterface;
|
Chris@0
|
7 use Drupal\Core\Entity\EntityTypeInterface;
|
Chris@0
|
8 use Drupal\Core\Field\BaseFieldDefinition;
|
Chris@0
|
9 use Drupal\Core\TypedData\TranslatableInterface;
|
Chris@18
|
10 use Drupal\user\EntityOwnerTrait;
|
Chris@0
|
11
|
Chris@0
|
12 /**
|
Chris@0
|
13 * Defines the Content moderation state entity.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @ContentEntityType(
|
Chris@0
|
16 * id = "content_moderation_state",
|
Chris@0
|
17 * label = @Translation("Content moderation state"),
|
Chris@0
|
18 * label_singular = @Translation("content moderation state"),
|
Chris@0
|
19 * label_plural = @Translation("content moderation states"),
|
Chris@0
|
20 * label_count = @PluralTranslation(
|
Chris@0
|
21 * singular = "@count content moderation state",
|
Chris@0
|
22 * plural = "@count content moderation states"
|
Chris@0
|
23 * ),
|
Chris@0
|
24 * handlers = {
|
Chris@0
|
25 * "storage_schema" = "Drupal\content_moderation\ContentModerationStateStorageSchema",
|
Chris@0
|
26 * "views_data" = "\Drupal\views\EntityViewsData",
|
Chris@0
|
27 * "access" = "Drupal\content_moderation\ContentModerationStateAccessControlHandler",
|
Chris@0
|
28 * },
|
Chris@0
|
29 * base_table = "content_moderation_state",
|
Chris@0
|
30 * revision_table = "content_moderation_state_revision",
|
Chris@0
|
31 * data_table = "content_moderation_state_field_data",
|
Chris@0
|
32 * revision_data_table = "content_moderation_state_field_revision",
|
Chris@0
|
33 * translatable = TRUE,
|
Chris@14
|
34 * internal = TRUE,
|
Chris@0
|
35 * entity_keys = {
|
Chris@0
|
36 * "id" = "id",
|
Chris@0
|
37 * "revision" = "revision_id",
|
Chris@0
|
38 * "uuid" = "uuid",
|
Chris@0
|
39 * "uid" = "uid",
|
Chris@18
|
40 * "owner" = "uid",
|
Chris@0
|
41 * "langcode" = "langcode",
|
Chris@0
|
42 * }
|
Chris@0
|
43 * )
|
Chris@0
|
44 *
|
Chris@0
|
45 * @internal
|
Chris@0
|
46 * This entity is marked internal because it should not be used directly to
|
Chris@0
|
47 * alter the moderation state of an entity. Instead, the computed
|
Chris@0
|
48 * moderation_state field should be set on the entity directly.
|
Chris@0
|
49 */
|
Chris@0
|
50 class ContentModerationState extends ContentEntityBase implements ContentModerationStateInterface {
|
Chris@0
|
51
|
Chris@18
|
52 use EntityOwnerTrait;
|
Chris@18
|
53
|
Chris@0
|
54 /**
|
Chris@0
|
55 * {@inheritdoc}
|
Chris@0
|
56 */
|
Chris@0
|
57 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
|
Chris@0
|
58 $fields = parent::baseFieldDefinitions($entity_type);
|
Chris@18
|
59 $fields += static::ownerBaseFieldDefinitions($entity_type);
|
Chris@0
|
60
|
Chris@18
|
61 $fields['uid']
|
Chris@0
|
62 ->setLabel(t('User'))
|
Chris@0
|
63 ->setDescription(t('The username of the entity creator.'))
|
Chris@0
|
64 ->setRevisionable(TRUE);
|
Chris@0
|
65
|
Chris@0
|
66 $fields['workflow'] = BaseFieldDefinition::create('entity_reference')
|
Chris@0
|
67 ->setLabel(t('Workflow'))
|
Chris@0
|
68 ->setDescription(t('The workflow the moderation state is in.'))
|
Chris@0
|
69 ->setSetting('target_type', 'workflow')
|
Chris@0
|
70 ->setRequired(TRUE)
|
Chris@0
|
71 ->setRevisionable(TRUE);
|
Chris@0
|
72
|
Chris@0
|
73 $fields['moderation_state'] = BaseFieldDefinition::create('string')
|
Chris@0
|
74 ->setLabel(t('Moderation state'))
|
Chris@0
|
75 ->setDescription(t('The moderation state of the referenced content.'))
|
Chris@0
|
76 ->setRequired(TRUE)
|
Chris@0
|
77 ->setTranslatable(TRUE)
|
Chris@0
|
78 ->setRevisionable(TRUE);
|
Chris@0
|
79
|
Chris@0
|
80 $fields['content_entity_type_id'] = BaseFieldDefinition::create('string')
|
Chris@0
|
81 ->setLabel(t('Content entity type ID'))
|
Chris@0
|
82 ->setDescription(t('The ID of the content entity type this moderation state is for.'))
|
Chris@0
|
83 ->setRequired(TRUE)
|
Chris@0
|
84 ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH)
|
Chris@0
|
85 ->setRevisionable(TRUE);
|
Chris@0
|
86
|
Chris@0
|
87 $fields['content_entity_id'] = BaseFieldDefinition::create('integer')
|
Chris@0
|
88 ->setLabel(t('Content entity ID'))
|
Chris@0
|
89 ->setDescription(t('The ID of the content entity this moderation state is for.'))
|
Chris@0
|
90 ->setRequired(TRUE)
|
Chris@0
|
91 ->setRevisionable(TRUE);
|
Chris@0
|
92
|
Chris@0
|
93 $fields['content_entity_revision_id'] = BaseFieldDefinition::create('integer')
|
Chris@0
|
94 ->setLabel(t('Content entity revision ID'))
|
Chris@0
|
95 ->setDescription(t('The revision ID of the content entity this moderation state is for.'))
|
Chris@0
|
96 ->setRequired(TRUE)
|
Chris@0
|
97 ->setRevisionable(TRUE);
|
Chris@0
|
98
|
Chris@0
|
99 return $fields;
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * Creates or updates an entity's moderation state whilst saving that entity.
|
Chris@0
|
104 *
|
Chris@0
|
105 * @param \Drupal\content_moderation\Entity\ContentModerationState $content_moderation_state
|
Chris@0
|
106 * The content moderation entity content entity to create or save.
|
Chris@0
|
107 *
|
Chris@0
|
108 * @internal
|
Chris@0
|
109 * This method should only be called as a result of saving the related
|
Chris@0
|
110 * content entity.
|
Chris@0
|
111 */
|
Chris@0
|
112 public static function updateOrCreateFromEntity(ContentModerationState $content_moderation_state) {
|
Chris@0
|
113 $content_moderation_state->realSave();
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 /**
|
Chris@0
|
117 * Loads a content moderation state entity.
|
Chris@0
|
118 *
|
Chris@0
|
119 * @param \Drupal\Core\Entity\EntityInterface $entity
|
Chris@0
|
120 * A moderated entity object.
|
Chris@0
|
121 *
|
Chris@0
|
122 * @return \Drupal\content_moderation\Entity\ContentModerationStateInterface|null
|
Chris@0
|
123 * The related content moderation state or NULL if none could be found.
|
Chris@0
|
124 *
|
Chris@0
|
125 * @internal
|
Chris@0
|
126 * This method should only be called by code directly handling the
|
Chris@0
|
127 * ContentModerationState entity objects.
|
Chris@0
|
128 */
|
Chris@0
|
129 public static function loadFromModeratedEntity(EntityInterface $entity) {
|
Chris@0
|
130 $content_moderation_state = NULL;
|
Chris@0
|
131 $moderation_info = \Drupal::service('content_moderation.moderation_information');
|
Chris@0
|
132
|
Chris@0
|
133 if ($moderation_info->isModeratedEntity($entity)) {
|
Chris@0
|
134 /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
|
Chris@0
|
135 $storage = \Drupal::entityTypeManager()->getStorage('content_moderation_state');
|
Chris@0
|
136
|
Chris@0
|
137 $ids = $storage->getQuery()
|
Chris@0
|
138 ->condition('content_entity_type_id', $entity->getEntityTypeId())
|
Chris@0
|
139 ->condition('content_entity_id', $entity->id())
|
Chris@0
|
140 ->condition('workflow', $moderation_info->getWorkflowForEntity($entity)->id())
|
Chris@0
|
141 ->condition('content_entity_revision_id', $entity->getLoadedRevisionId())
|
Chris@0
|
142 ->allRevisions()
|
Chris@0
|
143 ->execute();
|
Chris@0
|
144
|
Chris@0
|
145 if ($ids) {
|
Chris@0
|
146 /** @var \Drupal\content_moderation\Entity\ContentModerationStateInterface $content_moderation_state */
|
Chris@0
|
147 $content_moderation_state = $storage->loadRevision(key($ids));
|
Chris@0
|
148 }
|
Chris@0
|
149 }
|
Chris@0
|
150
|
Chris@0
|
151 return $content_moderation_state;
|
Chris@0
|
152 }
|
Chris@0
|
153
|
Chris@0
|
154 /**
|
Chris@0
|
155 * Default value callback for the 'uid' base field definition.
|
Chris@0
|
156 *
|
Chris@0
|
157 * @see \Drupal\content_moderation\Entity\ContentModerationState::baseFieldDefinitions()
|
Chris@0
|
158 *
|
Chris@18
|
159 * @deprecated The ::getCurrentUserId method is deprecated in 8.6.x and will
|
Chris@18
|
160 * be removed before 9.0.0.
|
Chris@18
|
161 *
|
Chris@0
|
162 * @return array
|
Chris@0
|
163 * An array of default values.
|
Chris@0
|
164 */
|
Chris@0
|
165 public static function getCurrentUserId() {
|
Chris@18
|
166 @trigger_error('The ::getCurrentUserId method is deprecated in 8.6.x and will be removed before 9.0.0.', E_USER_DEPRECATED);
|
Chris@0
|
167 return [\Drupal::currentUser()->id()];
|
Chris@0
|
168 }
|
Chris@0
|
169
|
Chris@0
|
170 /**
|
Chris@0
|
171 * {@inheritdoc}
|
Chris@0
|
172 */
|
Chris@0
|
173 public function save() {
|
Chris@0
|
174 $related_entity = \Drupal::entityTypeManager()
|
Chris@0
|
175 ->getStorage($this->content_entity_type_id->value)
|
Chris@0
|
176 ->loadRevision($this->content_entity_revision_id->value);
|
Chris@0
|
177 if ($related_entity instanceof TranslatableInterface) {
|
Chris@0
|
178 $related_entity = $related_entity->getTranslation($this->activeLangcode);
|
Chris@0
|
179 }
|
Chris@0
|
180 $related_entity->moderation_state = $this->moderation_state;
|
Chris@0
|
181 return $related_entity->save();
|
Chris@0
|
182 }
|
Chris@0
|
183
|
Chris@0
|
184 /**
|
Chris@0
|
185 * Saves an entity permanently.
|
Chris@0
|
186 *
|
Chris@0
|
187 * When saving existing entities, the entity is assumed to be complete,
|
Chris@0
|
188 * partial updates of entities are not supported.
|
Chris@0
|
189 *
|
Chris@0
|
190 * @return int
|
Chris@0
|
191 * Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed.
|
Chris@0
|
192 *
|
Chris@0
|
193 * @throws \Drupal\Core\Entity\EntityStorageException
|
Chris@0
|
194 * In case of failures an exception is thrown.
|
Chris@0
|
195 */
|
Chris@0
|
196 protected function realSave() {
|
Chris@0
|
197 return parent::save();
|
Chris@0
|
198 }
|
Chris@0
|
199
|
Chris@14
|
200 /**
|
Chris@14
|
201 * {@inheritdoc}
|
Chris@14
|
202 */
|
Chris@14
|
203 protected function getFieldsToSkipFromTranslationChangesCheck() {
|
Chris@14
|
204 $field_names = parent::getFieldsToSkipFromTranslationChangesCheck();
|
Chris@14
|
205 // We need to skip the parent entity revision ID, since that will always
|
Chris@14
|
206 // change on every save, otherwise every translation would be marked as
|
Chris@14
|
207 // affected regardless of actual changes.
|
Chris@14
|
208 $field_names[] = 'content_entity_revision_id';
|
Chris@14
|
209 return $field_names;
|
Chris@14
|
210 }
|
Chris@14
|
211
|
Chris@0
|
212 }
|