summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--core/modules/content_moderation/tests/src/Functional/WorkspaceContentModerationIntegrationTest.php12
-rw-r--r--core/modules/workspaces/src/EntityOperations.php8
-rw-r--r--core/modules/workspaces/workspaces.module7
3 files changed, 23 insertions, 4 deletions
diff --git a/core/modules/content_moderation/tests/src/Functional/WorkspaceContentModerationIntegrationTest.php b/core/modules/content_moderation/tests/src/Functional/WorkspaceContentModerationIntegrationTest.php
index 5446bf267544..4b4fbe2c7905 100644
--- a/core/modules/content_moderation/tests/src/Functional/WorkspaceContentModerationIntegrationTest.php
+++ b/core/modules/content_moderation/tests/src/Functional/WorkspaceContentModerationIntegrationTest.php
@@ -73,15 +73,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);
diff --git a/core/modules/workspaces/src/EntityOperations.php b/core/modules/workspaces/src/EntityOperations.php
index 4324d30f703e..5caccf4a34ff 100644
--- a/core/modules/workspaces/src/EntityOperations.php
+++ b/core/modules/workspaces/src/EntityOperations.php
@@ -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();
diff --git a/core/modules/workspaces/workspaces.module b/core/modules/workspaces/workspaces.module
index 39864fd9f3e2..2b6d101ca394 100644
--- a/core/modules/workspaces/workspaces.module
+++ b/core/modules/workspaces/workspaces.module
@@ -14,6 +14,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