annotate core/modules/content_moderation/src/Entity/ContentModerationState.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents 1fec387a4317
children af1871eacc83
rev   line source
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 }