public function EntityOperations::entityPresave in Workbench Moderation 8.2
Same name and namespace in other branches
- 8 src/EntityOperations.php \Drupal\workbench_moderation\EntityOperations::entityPresave()
Acts on an entity and set published status based on the moderation state.
Parameters
\Drupal\Core\Entity\EntityInterface $entity: The entity being saved.
File
- src/EntityOperations.php, line 135 
Class
- EntityOperations
- Defines a class for reacting to entity events.
Namespace
Drupal\workbench_moderationCode
public function entityPresave(EntityInterface $entity) {
  if (!$this->moderationInfo
    ->isModeratableEntity($entity)) {
    return;
  }
  if ($entity->moderation_state->entity) {
    $published_state = $entity->moderation_state->entity
      ->isPublishedState();
    // This entity is default if it is new, the default revision, or the
    // default revision is not published.
    $update_default_revision = $entity
      ->isNew() || $entity->moderation_state->entity
      ->isDefaultRevisionState() || !$this
      ->isDefaultRevisionPublished($entity);
    // Fire per-entity-type logic for handling the save process.
    $this->entityTypeManager
      ->getHandler($entity
      ->getEntityTypeId(), 'moderation')
      ->onPresave($entity, $update_default_revision, $published_state);
    // There's currently a bug in core where $entity->original always points
    // to the default revision, for now work around this by loading the latest
    // revision.
    $latest_revision = $this->moderationInfo
      ->getLatestRevision($entity
      ->getEntityTypeId(), $entity
      ->id());
    $state_before = !empty($latest_revision) ? $latest_revision->moderation_state->target_id : NULL;
    // @todo: Revert to this simpler version when https://www.drupal.org/node/2700747 is fixed.
    // $state_before = isset($entity->original) ? $entity->original->moderation_state->target_id : NULL;
    $state_after = $entity->moderation_state->target_id;
    // Allow other modules to respond to the transition. Note that this
    // does not provide any mechanism to cancel the transition, since
    // Entity API doesn't allow hook_entity_presave to short-circuit a save.
    $event = new WorkbenchModerationTransitionEvent($entity, $state_before, $state_after);
    $this->eventDispatcher
      ->dispatch(WorkbenchModerationEvents::STATE_TRANSITION, $event);
  }
}