- Мой рабочий процесс черновик и публикация.
- Я создаю и публикую страницу.
- Я создаю черновик страницы.
Теперь есть опубликованная страница, но последняя редакция — это черновик.
Как программно установить последнюю версию как опубликованную?
Этот код публикует узел.
$node = Node::load(nid);
// Публикуем и сохраняем узел.
если ($node->hasField('moderation_state')) {
$node->set('moderation_state', 'опубликовано');
}
$узел->setPublished();
$узел->сохранить();
Узел уже опубликован. Я хочу опубликовать черновик/последнюю версию узла.
Этот запрос имеет некоторые возможности.
// Публикуем черновик узла.
$query = \Drupal::database()->select('content_moderation_state_field_revision', 'cm');
// $query->fields('cm', ['moderation_state']);
$запрос->поля('см');
$query->условие('cm.content_entity_id', $node->id());
$query->условие('cm.moderation_state', 'черновик');
$результат = $запрос->выполнить();
$record = $result->fetchAssoc();
print_r ($ запись);
Поскольку узлы могут иметь более одного черновика, я мог бы добавить к запросу LIMIT и ORDER BY. Простое изменение moderation_state в таблице content_moderation_state_field_revision и перестроение кеша не публикует последнюю версию.
Этот код, немного измененный из EntityModerationForm.php, работал один раз, но потом снова не работал.
/** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
$storage = \Drupal::entityTypeManager()->getStorage($node->getEntityTypeId());
$entity = $storage->createRevision($node, $node->isDefaultRevision());
$new_state = 'опубликовано';
$entity->set('moderation_state', $new_state);
if ($entity instanceof RevisionLogInterface) {
$entity->setRevisionCreationTime(\Drupal::time()->getRequestTime());
$entity->setRevisionLogMessage('Черновик создан автоматически');
$entity->setRevisionUserId(\Drupal::currentUser()->id());
}
// $node->setNewRevision(FALSE);
$сущность->сохранить();