You are here

public function ConfigEntityRevisionsRevisionStorageHandler::createUpdateRevision in Config Entity Revisions 8.2

Create revision when a new config entity version is saved.

Parameters

\Drupal\config_entity_revisions\ConfigEntityRevisionsConfigEntityInterface $config_entity: The configuration entity.

Throws

\Drupal\Core\Entity\EntityStorageException

Overrides ConfigEntityRevisionsRevisionStorageHandlerInterface::createUpdateRevision

File

src/Entity/Handler/ConfigEntityRevisionsRevisionStorageHandler.php, line 340

Class

ConfigEntityRevisionsRevisionStorageHandler
Class ConfigEntityRevisionsRevisionStorageHandler.

Namespace

Drupal\config_entity_revisions\Entity\Handler

Code

public function createUpdateRevision(ConfigEntityRevisionsConfigEntityInterface $config_entity) {

  /* @var $revisionsEntity \Drupal\config_entity_revisions\ConfigEntityRevisionsConfigEntityInterface */
  $revisionsEntity = NULL;
  $previous_state = FALSE;
  $moderated = FALSE;
  if (!empty($config_entity
    ->getRevisionId())) {
    $revisionsEntity = $config_entity
      ->contentEntityStorage()
      ->loadRevision($config_entity
      ->getRevisionID());
    $moderated = $revisionsEntity
      ->hasField('moderation_state');
    if ($moderated) {
      $previous_state = $revisionsEntity->moderation_state->value;
    }
  }
  else {
    $contentID = $config_entity
      ->getContentEntityID();
    if (is_null($contentID)) {

      // No related content entity yet.
      return;
    }
    $revisionsEntity = $config_entity
      ->contentEntityStorage()
      ->load($contentID);
  }
  $revisionsEntity
    ->set('configuration', $this->serialiser
    ->serialize($config_entity, 'json'));
  $revisionsEntity
    ->setRevisionUserId($this->currentUser
    ->id());
  $revisionsEntity
    ->setRevisionCreationTime($this->dateTimeService
    ->getRequestTime());
  $new_message = $config_entity
    ->get('revision_log_message')[0]['value'];
  $new_revision = $config_entity
    ->get('revision');
  $moderation_state = $moderated ? $config_entity->moderation_state->value : NULL;
  $published = NULL;
  if (!is_null($moderation_state)) {
    $published = $moderation_state == 'published';
  }
  if (is_null($moderation_state) && is_null($new_revision)) {
    $new_revision = FALSE;
  }
  if (!is_null($new_message)) {
    $revisionsEntity
      ->setRevisionLogMessage($config_entity
      ->get('revision_log_message')[0]['value']);
  }
  $revisionsEntity
    ->setNewRevision($new_revision);
  if (!is_null($moderation_state)) {
    $revisionsEntity->moderation_state = $moderation_state;
  }
  if (!is_null($published)) {
    if ($published) {
      $revisionsEntity
        ->setPublished();
    }
    else {
      $revisionsEntity
        ->setUnpublished();
    }

    // @TODO Published <> default?
    $revisionsEntity
      ->isDefaultRevision($published);
  }
  $revisionsEntity
    ->save();
  if (($previous_state == 'published') !== $published) {

    // Modify another revision to be published and default if possible.
    $this
      ->resetDefaultRevision($revisionsEntity);
  }
  return $revisionsEntity
    ->getRevisionId();
}