Chris@0: setLabel(t('User')) Chris@0: ->setDescription(t('The username of the entity creator.')) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@0: $fields['workflow'] = BaseFieldDefinition::create('entity_reference') Chris@0: ->setLabel(t('Workflow')) Chris@0: ->setDescription(t('The workflow the moderation state is in.')) Chris@0: ->setSetting('target_type', 'workflow') Chris@0: ->setRequired(TRUE) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@0: $fields['moderation_state'] = BaseFieldDefinition::create('string') Chris@0: ->setLabel(t('Moderation state')) Chris@0: ->setDescription(t('The moderation state of the referenced content.')) Chris@0: ->setRequired(TRUE) Chris@0: ->setTranslatable(TRUE) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@0: $fields['content_entity_type_id'] = BaseFieldDefinition::create('string') Chris@0: ->setLabel(t('Content entity type ID')) Chris@0: ->setDescription(t('The ID of the content entity type this moderation state is for.')) Chris@0: ->setRequired(TRUE) Chris@0: ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@0: $fields['content_entity_id'] = BaseFieldDefinition::create('integer') Chris@0: ->setLabel(t('Content entity ID')) Chris@0: ->setDescription(t('The ID of the content entity this moderation state is for.')) Chris@0: ->setRequired(TRUE) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@0: $fields['content_entity_revision_id'] = BaseFieldDefinition::create('integer') Chris@0: ->setLabel(t('Content entity revision ID')) Chris@0: ->setDescription(t('The revision ID of the content entity this moderation state is for.')) Chris@0: ->setRequired(TRUE) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@0: return $fields; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Creates or updates an entity's moderation state whilst saving that entity. Chris@0: * Chris@0: * @param \Drupal\content_moderation\Entity\ContentModerationState $content_moderation_state Chris@0: * The content moderation entity content entity to create or save. Chris@0: * Chris@0: * @internal Chris@0: * This method should only be called as a result of saving the related Chris@0: * content entity. Chris@0: */ Chris@0: public static function updateOrCreateFromEntity(ContentModerationState $content_moderation_state) { Chris@0: $content_moderation_state->realSave(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Loads a content moderation state entity. Chris@0: * Chris@0: * @param \Drupal\Core\Entity\EntityInterface $entity Chris@0: * A moderated entity object. Chris@0: * Chris@0: * @return \Drupal\content_moderation\Entity\ContentModerationStateInterface|null Chris@0: * The related content moderation state or NULL if none could be found. Chris@0: * Chris@0: * @internal Chris@0: * This method should only be called by code directly handling the Chris@0: * ContentModerationState entity objects. Chris@0: */ Chris@0: public static function loadFromModeratedEntity(EntityInterface $entity) { Chris@0: $content_moderation_state = NULL; Chris@0: $moderation_info = \Drupal::service('content_moderation.moderation_information'); Chris@0: Chris@0: if ($moderation_info->isModeratedEntity($entity)) { Chris@0: /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ Chris@0: $storage = \Drupal::entityTypeManager()->getStorage('content_moderation_state'); Chris@0: Chris@0: $ids = $storage->getQuery() Chris@0: ->condition('content_entity_type_id', $entity->getEntityTypeId()) Chris@0: ->condition('content_entity_id', $entity->id()) Chris@0: ->condition('workflow', $moderation_info->getWorkflowForEntity($entity)->id()) Chris@0: ->condition('content_entity_revision_id', $entity->getLoadedRevisionId()) Chris@0: ->allRevisions() Chris@0: ->execute(); Chris@0: Chris@0: if ($ids) { Chris@0: /** @var \Drupal\content_moderation\Entity\ContentModerationStateInterface $content_moderation_state */ Chris@0: $content_moderation_state = $storage->loadRevision(key($ids)); Chris@0: } Chris@0: } Chris@0: Chris@0: return $content_moderation_state; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Default value callback for the 'uid' base field definition. Chris@0: * Chris@0: * @see \Drupal\content_moderation\Entity\ContentModerationState::baseFieldDefinitions() Chris@0: * Chris@18: * @deprecated The ::getCurrentUserId method is deprecated in 8.6.x and will Chris@18: * be removed before 9.0.0. Chris@18: * Chris@0: * @return array Chris@0: * An array of default values. Chris@0: */ Chris@0: public static function getCurrentUserId() { Chris@18: @trigger_error('The ::getCurrentUserId method is deprecated in 8.6.x and will be removed before 9.0.0.', E_USER_DEPRECATED); Chris@0: return [\Drupal::currentUser()->id()]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function save() { Chris@0: $related_entity = \Drupal::entityTypeManager() Chris@0: ->getStorage($this->content_entity_type_id->value) Chris@0: ->loadRevision($this->content_entity_revision_id->value); Chris@0: if ($related_entity instanceof TranslatableInterface) { Chris@0: $related_entity = $related_entity->getTranslation($this->activeLangcode); Chris@0: } Chris@0: $related_entity->moderation_state = $this->moderation_state; Chris@0: return $related_entity->save(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Saves an entity permanently. Chris@0: * Chris@0: * When saving existing entities, the entity is assumed to be complete, Chris@0: * partial updates of entities are not supported. Chris@0: * Chris@0: * @return int Chris@0: * Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed. Chris@0: * Chris@0: * @throws \Drupal\Core\Entity\EntityStorageException Chris@0: * In case of failures an exception is thrown. Chris@0: */ Chris@0: protected function realSave() { Chris@0: return parent::save(); Chris@0: } Chris@0: Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: protected function getFieldsToSkipFromTranslationChangesCheck() { Chris@14: $field_names = parent::getFieldsToSkipFromTranslationChangesCheck(); Chris@14: // We need to skip the parent entity revision ID, since that will always Chris@14: // change on every save, otherwise every translation would be marked as Chris@14: // affected regardless of actual changes. Chris@14: $field_names[] = 'content_entity_revision_id'; Chris@14: return $field_names; Chris@14: } Chris@14: Chris@0: }