Issue #3487482 by amateescu, catch, benjifisher, ekes, finn lewis, fabianx, larowlan: Creating a published moderated entity in a workspace shouldn't make it published in Live
(cherry picked from commit 9aaa66646a
)
merge-requests/3858/head
parent
c26c5ee413
commit
a917ab3a1b
|
@ -70,15 +70,19 @@ class WorkspaceContentModerationIntegrationTest extends ModerationStateTestBase
|
|||
|
||||
$first_article = $this->drupalGetNodeByTitle('First article - published', TRUE);
|
||||
$this->assertEquals('published', $first_article->moderation_state->value);
|
||||
$this->assertTrue($first_article->isPublished());
|
||||
|
||||
$second_article = $this->drupalGetNodeByTitle('Second article - draft', TRUE);
|
||||
$this->assertEquals('draft', $second_article->moderation_state->value);
|
||||
$this->assertFalse($second_article->isPublished());
|
||||
|
||||
// Check that neither of them are visible in Live.
|
||||
// Check that neither of them are published in Live.
|
||||
$this->switchToLive();
|
||||
$this->drupalGet('<front>');
|
||||
$this->assertSession()->pageTextNotContains('First article');
|
||||
$this->assertSession()->pageTextNotContains('Second article');
|
||||
$first_article = $this->drupalGetNodeByTitle('First article - published', TRUE);
|
||||
$this->assertFalse($first_article->isPublished());
|
||||
|
||||
$second_article = $this->drupalGetNodeByTitle('Second article - draft', TRUE);
|
||||
$this->assertFalse($second_article->isPublished());
|
||||
|
||||
// Switch back to Stage.
|
||||
$this->switchToWorkspace($stage);
|
||||
|
|
|
@ -4,6 +4,7 @@ namespace Drupal\workspaces;
|
|||
|
||||
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\Core\Entity\EntityPublishedInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Entity\RevisionableInterface;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
|
@ -189,6 +190,7 @@ class EntityOperations implements ContainerInjectionInterface {
|
|||
return;
|
||||
}
|
||||
|
||||
assert($entity instanceof RevisionableInterface && $entity instanceof EntityPublishedInterface);
|
||||
$this->workspaceAssociation->trackEntity($entity, $this->workspaceManager->getActiveWorkspace());
|
||||
|
||||
// When a published entity is created in a workspace, it should remain
|
||||
|
@ -200,6 +202,12 @@ class EntityOperations implements ContainerInjectionInterface {
|
|||
// entities where there is already a valid default revision for the live
|
||||
// workspace.
|
||||
if (isset($entity->_initialPublished)) {
|
||||
// Ensure that the default revision of an entity saved in a workspace is
|
||||
// unpublished.
|
||||
if ($entity->isPublished()) {
|
||||
throw new \RuntimeException('The default revision of an entity created in a workspace cannot be published.');
|
||||
}
|
||||
|
||||
$entity->setPublished();
|
||||
$entity->isDefaultRevision(FALSE);
|
||||
$entity->save();
|
||||
|
|
|
@ -45,6 +45,13 @@ function workspaces_module_implements_alter(&$implementations, $hook): void {
|
|||
if ($hook === 'entity_presave') {
|
||||
$implementation = $implementations['workspaces'];
|
||||
$implementations = ['workspaces' => $implementation] + $implementations;
|
||||
|
||||
// Move Content Moderation's implementation before Workspaces, so we can
|
||||
// alter the publishing status for the default revision.
|
||||
if (isset($implementations['content_moderation'])) {
|
||||
$implementation = $implementations['content_moderation'];
|
||||
$implementations = ['content_moderation' => $implementation] + $implementations;
|
||||
}
|
||||
}
|
||||
|
||||
// Move our 'hook_entity_insert' implementation at the end to ensure that
|
||||
|
|
Loading…
Reference in New Issue