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@0
|
10 use Drupal\user\UserInterface;
|
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@0
|
40 * "langcode" = "langcode",
|
Chris@0
|
41 * }
|
Chris@0
|
42 * )
|
Chris@0
|
43 *
|
Chris@0
|
44 * @internal
|
Chris@0
|
45 * This entity is marked internal because it should not be used directly to
|
Chris@0
|
46 * alter the moderation state of an entity. Instead, the computed
|
Chris@0
|
47 * moderation_state field should be set on the entity directly.
|
Chris@0
|
48 */
|
Chris@0
|
49 class ContentModerationState extends ContentEntityBase implements ContentModerationStateInterface {
|
Chris@0
|
50
|
Chris@0
|
51 /**
|
Chris@0
|
52 * {@inheritdoc}
|
Chris@0
|
53 */
|
Chris@0
|
54 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
|
Chris@0
|
55 $fields = parent::baseFieldDefinitions($entity_type);
|
Chris@0
|
56
|
Chris@0
|
57 $fields['uid'] = BaseFieldDefinition::create('entity_reference')
|
Chris@0
|
58 ->setLabel(t('User'))
|
Chris@0
|
59 ->setDescription(t('The username of the entity creator.'))
|
Chris@0
|
60 ->setSetting('target_type', 'user')
|
Chris@0
|
61 ->setDefaultValueCallback('Drupal\content_moderation\Entity\ContentModerationState::getCurrentUserId')
|
Chris@0
|
62 ->setTranslatable(TRUE)
|
Chris@0
|
63 ->setRevisionable(TRUE);
|
Chris@0
|
64
|
Chris@0
|
65 $fields['workflow'] = BaseFieldDefinition::create('entity_reference')
|
Chris@0
|
66 ->setLabel(t('Workflow'))
|
Chris@0
|
67 ->setDescription(t('The workflow the moderation state is in.'))
|
Chris@0
|
68 ->setSetting('target_type', 'workflow')
|
Chris@0
|
69 ->setRequired(TRUE)
|
Chris@0
|
70 ->setRevisionable(TRUE);
|
Chris@0
|
71
|
Chris@0
|
72 $fields['moderation_state'] = BaseFieldDefinition::create('string')
|
Chris@0
|
73 ->setLabel(t('Moderation state'))
|
Chris@0
|
74 ->setDescription(t('The moderation state of the referenced content.'))
|
Chris@0
|
75 ->setRequired(TRUE)
|
Chris@0
|
76 ->setTranslatable(TRUE)
|
Chris@0
|
77 ->setRevisionable(TRUE);
|
Chris@0
|
78
|
Chris@0
|
79 $fields['content_entity_type_id'] = BaseFieldDefinition::create('string')
|
Chris@0
|
80 ->setLabel(t('Content entity type ID'))
|
Chris@0
|
81 ->setDescription(t('The ID of the content entity type this moderation state is for.'))
|
Chris@0
|
82 ->setRequired(TRUE)
|
Chris@0
|
83 ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH)
|
Chris@0
|
84 ->setRevisionable(TRUE);
|
Chris@0
|
85
|
Chris@0
|
86 $fields['content_entity_id'] = BaseFieldDefinition::create('integer')
|
Chris@0
|
87 ->setLabel(t('Content entity ID'))
|
Chris@0
|
88 ->setDescription(t('The ID of the content entity this moderation state is for.'))
|
Chris@0
|
89 ->setRequired(TRUE)
|
Chris@0
|
90 ->setRevisionable(TRUE);
|
Chris@0
|
91
|
Chris@0
|
92 $fields['content_entity_revision_id'] = BaseFieldDefinition::create('integer')
|
Chris@0
|
93 ->setLabel(t('Content entity revision ID'))
|
Chris@0
|
94 ->setDescription(t('The revision ID of the content entity this moderation state is for.'))
|
Chris@0
|
95 ->setRequired(TRUE)
|
Chris@0
|
96 ->setRevisionable(TRUE);
|
Chris@0
|
97
|
Chris@0
|
98 return $fields;
|
Chris@0
|
99 }
|
Chris@0
|
100
|
Chris@0
|
101 /**
|
Chris@0
|
102 * {@inheritdoc}
|
Chris@0
|
103 */
|
Chris@0
|
104 public function getOwner() {
|
Chris@0
|
105 return $this->get('uid')->entity;
|
Chris@0
|
106 }
|
Chris@0
|
107
|
Chris@0
|
108 /**
|
Chris@0
|
109 * {@inheritdoc}
|
Chris@0
|
110 */
|
Chris@0
|
111 public function getOwnerId() {
|
Chris@0
|
112 return $this->getEntityKey('uid');
|
Chris@0
|
113 }
|
Chris@0
|
114
|
Chris@0
|
115 /**
|
Chris@0
|
116 * {@inheritdoc}
|
Chris@0
|
117 */
|
Chris@0
|
118 public function setOwnerId($uid) {
|
Chris@0
|
119 $this->set('uid', $uid);
|
Chris@0
|
120 return $this;
|
Chris@0
|
121 }
|
Chris@0
|
122
|
Chris@0
|
123 /**
|
Chris@0
|
124 * {@inheritdoc}
|
Chris@0
|
125 */
|
Chris@0
|
126 public function setOwner(UserInterface $account) {
|
Chris@0
|
127 $this->set('uid', $account->id());
|
Chris@0
|
128 return $this;
|
Chris@0
|
129 }
|
Chris@0
|
130
|
Chris@0
|
131 /**
|
Chris@0
|
132 * Creates or updates an entity's moderation state whilst saving that entity.
|
Chris@0
|
133 *
|
Chris@0
|
134 * @param \Drupal\content_moderation\Entity\ContentModerationState $content_moderation_state
|
Chris@0
|
135 * The content moderation entity content entity to create or save.
|
Chris@0
|
136 *
|
Chris@0
|
137 * @internal
|
Chris@0
|
138 * This method should only be called as a result of saving the related
|
Chris@0
|
139 * content entity.
|
Chris@0
|
140 */
|
Chris@0
|
141 public static function updateOrCreateFromEntity(ContentModerationState $content_moderation_state) {
|
Chris@0
|
142 $content_moderation_state->realSave();
|
Chris@0
|
143 }
|
Chris@0
|
144
|
Chris@0
|
145 /**
|
Chris@0
|
146 * Loads a content moderation state entity.
|
Chris@0
|
147 *
|
Chris@0
|
148 * @param \Drupal\Core\Entity\EntityInterface $entity
|
Chris@0
|
149 * A moderated entity object.
|
Chris@0
|
150 *
|
Chris@0
|
151 * @return \Drupal\content_moderation\Entity\ContentModerationStateInterface|null
|
Chris@0
|
152 * The related content moderation state or NULL if none could be found.
|
Chris@0
|
153 *
|
Chris@0
|
154 * @internal
|
Chris@0
|
155 * This method should only be called by code directly handling the
|
Chris@0
|
156 * ContentModerationState entity objects.
|
Chris@0
|
157 */
|
Chris@0
|
158 public static function loadFromModeratedEntity(EntityInterface $entity) {
|
Chris@0
|
159 $content_moderation_state = NULL;
|
Chris@0
|
160 $moderation_info = \Drupal::service('content_moderation.moderation_information');
|
Chris@0
|
161
|
Chris@0
|
162 if ($moderation_info->isModeratedEntity($entity)) {
|
Chris@0
|
163 /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
|
Chris@0
|
164 $storage = \Drupal::entityTypeManager()->getStorage('content_moderation_state');
|
Chris@0
|
165
|
Chris@0
|
166 $ids = $storage->getQuery()
|
Chris@0
|
167 ->condition('content_entity_type_id', $entity->getEntityTypeId())
|
Chris@0
|
168 ->condition('content_entity_id', $entity->id())
|
Chris@0
|
169 ->condition('workflow', $moderation_info->getWorkflowForEntity($entity)->id())
|
Chris@0
|
170 ->condition('content_entity_revision_id', $entity->getLoadedRevisionId())
|
Chris@0
|
171 ->allRevisions()
|
Chris@0
|
172 ->execute();
|
Chris@0
|
173
|
Chris@0
|
174 if ($ids) {
|
Chris@0
|
175 /** @var \Drupal\content_moderation\Entity\ContentModerationStateInterface $content_moderation_state */
|
Chris@0
|
176 $content_moderation_state = $storage->loadRevision(key($ids));
|
Chris@0
|
177 }
|
Chris@0
|
178 }
|
Chris@0
|
179
|
Chris@0
|
180 return $content_moderation_state;
|
Chris@0
|
181 }
|
Chris@0
|
182
|
Chris@0
|
183 /**
|
Chris@0
|
184 * Default value callback for the 'uid' base field definition.
|
Chris@0
|
185 *
|
Chris@0
|
186 * @see \Drupal\content_moderation\Entity\ContentModerationState::baseFieldDefinitions()
|
Chris@0
|
187 *
|
Chris@0
|
188 * @return array
|
Chris@0
|
189 * An array of default values.
|
Chris@0
|
190 */
|
Chris@0
|
191 public static function getCurrentUserId() {
|
Chris@0
|
192 return [\Drupal::currentUser()->id()];
|
Chris@0
|
193 }
|
Chris@0
|
194
|
Chris@0
|
195 /**
|
Chris@0
|
196 * {@inheritdoc}
|
Chris@0
|
197 */
|
Chris@0
|
198 public function save() {
|
Chris@0
|
199 $related_entity = \Drupal::entityTypeManager()
|
Chris@0
|
200 ->getStorage($this->content_entity_type_id->value)
|
Chris@0
|
201 ->loadRevision($this->content_entity_revision_id->value);
|
Chris@0
|
202 if ($related_entity instanceof TranslatableInterface) {
|
Chris@0
|
203 $related_entity = $related_entity->getTranslation($this->activeLangcode);
|
Chris@0
|
204 }
|
Chris@0
|
205 $related_entity->moderation_state = $this->moderation_state;
|
Chris@0
|
206 return $related_entity->save();
|
Chris@0
|
207 }
|
Chris@0
|
208
|
Chris@0
|
209 /**
|
Chris@0
|
210 * Saves an entity permanently.
|
Chris@0
|
211 *
|
Chris@0
|
212 * When saving existing entities, the entity is assumed to be complete,
|
Chris@0
|
213 * partial updates of entities are not supported.
|
Chris@0
|
214 *
|
Chris@0
|
215 * @return int
|
Chris@0
|
216 * Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed.
|
Chris@0
|
217 *
|
Chris@0
|
218 * @throws \Drupal\Core\Entity\EntityStorageException
|
Chris@0
|
219 * In case of failures an exception is thrown.
|
Chris@0
|
220 */
|
Chris@0
|
221 protected function realSave() {
|
Chris@0
|
222 return parent::save();
|
Chris@0
|
223 }
|
Chris@0
|
224
|
Chris@14
|
225 /**
|
Chris@14
|
226 * {@inheritdoc}
|
Chris@14
|
227 */
|
Chris@14
|
228 protected function getFieldsToSkipFromTranslationChangesCheck() {
|
Chris@14
|
229 $field_names = parent::getFieldsToSkipFromTranslationChangesCheck();
|
Chris@14
|
230 // We need to skip the parent entity revision ID, since that will always
|
Chris@14
|
231 // change on every save, otherwise every translation would be marked as
|
Chris@14
|
232 // affected regardless of actual changes.
|
Chris@14
|
233 $field_names[] = 'content_entity_revision_id';
|
Chris@14
|
234 return $field_names;
|
Chris@14
|
235 }
|
Chris@14
|
236
|
Chris@0
|
237 }
|