- Quy trình công việc của tôi là soạn thảo và xuất bản.
- Tôi tạo và xuất bản một trang.
- Tôi tạo một bản nháp của trang.
Hiện đã có trang được xuất bản, nhưng bản sửa đổi mới nhất là bản nháp.
Làm cách nào để tôi lập trình đặt là bản sửa đổi mới nhất đã xuất bản?
Mã này xuất bản nút.
$node = Nút::load(nid);
// Xuất bản và lưu nút.
if ($node->hasField('moderation_state')) {
$node->set('moderation_state', 'published');
}
$node->setPublished();
$node->save();
Nút đã được xuất bản. Tôi muốn xuất bản bản nháp/bản sửa đổi mới nhất của nút.
Truy vấn này có một số khả năng.
// Xuất bản bản thảo của một nút.
$query = \Drupal::database()->select('content_moderation_state_field_revision', 'cm');
// $query->fields('cm', ['moderation_state']);
$query->field('cm');
$query->condition('cm.content_entity_id', $node->id());
$query->condition('cm.moderation_state', 'draft');
$result = $query->execute();
$record = $result->fetchAssoc();
print_r($record);
Vì các nút có thể có nhiều hơn một bản nháp nên tôi có thể thêm GIỚI HẠN và ĐẶT HÀNG THEO vào truy vấn. Chỉ cần thay đổimode_state trong bảng content_moderation_state_field_revision và xây dựng lại bộ nhớ cache sẽ không xuất bản bản sửa đổi mới nhất.
Mã này, được thay đổi một chút từ EntityModerationForm.php, đã hoạt động một lần nhưng sau đó không hoạt động trở lại.
/** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
$storage = \Drupal::entityTypeManager()->getStorage($node->getEntityTypeId());
$entity = $storage->createRevision($node, $node->isDefaultRevision());
$new_state = 'đã xuất bản';
$entity->set('moderation_state', $new_state);
if ($entity instanceof RevisionLogInterface) {
$entity->setRevisionCreationTime(\Drupal::time()->getRequestTime());
$entity->setRevisionLogMessage('Bản nháp được tạo tự động');
$entity->setRevisionUserId(\Drupal::currentUser()->id());
}
// $node->setNewRevision(FALSE);
$entity->save();