namespace Drupal\content_moderation\Plugin\Field;
use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityPublishedInterface;
use Drupal\Core\Field\FieldItemList;
/**
// the node type form creates a fake Node entity to get default values.
// @see \Drupal\node\NodeTypeForm::form()
$workflow = $moderation_info->getWorkFlowForEntity($entity);
- return $workflow ? $workflow->getTypePlugin()->getInitialState($workflow, $entity)->id() : NULL;
+ return $workflow ? $workflow->getTypePlugin()->getInitialState($entity)->id() : NULL;
}
/**
* @param \Drupal\Core\Entity\ContentEntityInterface $entity
* The entity the content moderation state entity will be loaded from.
*
- * @return \Drupal\content_moderation\ContentModerationStateInterface|null
+ * @return \Drupal\content_moderation\Entity\ContentModerationStateInterface|null
* The content_moderation_state revision or FALSE if none exists.
*/
protected function loadContentModerationStateRevision(ContentEntityInterface $entity) {
return NULL;
}
- /** @var \Drupal\content_moderation\ContentModerationStateInterface $content_moderation_state */
+ /** @var \Drupal\content_moderation\Entity\ContentModerationStateInterface $content_moderation_state */
$content_moderation_state = $content_moderation_storage->loadRevision(key($revisions));
if ($entity->getEntityType()->hasKey('langcode')) {
$langcode = $entity->language()->getId();
}
}
+ /**
+ * {@inheritdoc}
+ */
+ public function onChange($delta) {
+ $this->updateModeratedEntity($this->list[$delta]->value);
+
+ parent::onChange($delta);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setValue($values, $notify = TRUE) {
+ parent::setValue($values, $notify);
+
+ if (isset($this->list[0])) {
+ $this->updateModeratedEntity($this->list[0]->value);
+ }
+ }
+
+ /**
+ * Updates the default revision flag and the publishing status of the entity.
+ *
+ * @param string $moderation_state_id
+ * The ID of the new moderation state.
+ */
+ protected function updateModeratedEntity($moderation_state_id) {
+ $entity = $this->getEntity();
+
+ /** @var \Drupal\content_moderation\ModerationInformationInterface $content_moderation_info */
+ $content_moderation_info = \Drupal::service('content_moderation.moderation_information');
+ $workflow = $content_moderation_info->getWorkflowForEntity($entity);
+
+ // Change the entity's default revision flag and the publishing status only
+ // if the new workflow state is a valid one.
+ if ($workflow && $workflow->getTypePlugin()->hasState($moderation_state_id)) {
+ /** @var \Drupal\content_moderation\ContentModerationState $current_state */
+ $current_state = $workflow->getTypePlugin()->getState($moderation_state_id);
+
+ // This entity is default if it is new, a new translation, the default
+ // revision state, or the default revision is not published.
+ $update_default_revision = $entity->isNew()
+ || $entity->isNewTranslation()
+ || $current_state->isDefaultRevisionState()
+ || !$content_moderation_info->isDefaultRevisionPublished($entity);
+
+ $entity->isDefaultRevision($update_default_revision);
+
+ // Update publishing status if it can be updated and if it needs updating.
+ $published_state = $current_state->isPublishedState();
+ if (($entity instanceof EntityPublishedInterface) && $entity->isPublished() !== $published_state) {
+ $published_state ? $entity->setPublished() : $entity->setUnpublished();
+ }
+ }
+ }
+
}