annotate core/modules/content_moderation/src/Entity/ContentModerationState.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
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@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 }