Loading core/modules/content_moderation/content_moderation.links.task.yml +0 −6 Original line number Diff line number Diff line Loading @@ -6,9 +6,3 @@ content_moderation.content: title: 'Overview' route_name: system.admin_content parent_id: system.admin_content content_moderation.moderated_content: title: 'Moderated content' route_name: content_moderation.admin_moderated_content parent_id: system.admin_content weight: 1 core/modules/content_moderation/content_moderation.routing.yml +1 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ content_moderation.admin_moderated_content: _controller: '\Drupal\content_moderation\Controller\ModeratedContentController::nodeListing' _title: 'Moderated content' requirements: _module_dependencies: 'node' _permission: 'view any unpublished content' content_moderation.workflow_type_edit_form: Loading core/modules/content_moderation/src/Plugin/Derivative/DynamicLocalTasks.php +25 −2 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslationInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Routing\RouterInterface; /** * Generates moderation-related local tasks. Loading Loading @@ -39,6 +40,13 @@ class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface */ protected $moderationInfo; /** * The router. * * @var \Symfony\Component\Routing\RouterInterface */ protected $router; /** * Creates a FieldUiLocalTask object. * Loading @@ -50,12 +58,15 @@ class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface * The translation manager. * @param \Drupal\content_moderation\ModerationInformationInterface $moderation_information * The moderation information service. * @param \Symfony\Component\Routing\RouterInterface $router * The router. */ public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information) { public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information, RouterInterface $router) { $this->entityTypeManager = $entity_type_manager; $this->stringTranslation = $string_translation; $this->basePluginId = $base_plugin_id; $this->moderationInfo = $moderation_information; $this->router = $router; } /** Loading @@ -66,7 +77,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) { $base_plugin_id, $container->get('entity_type.manager'), $container->get('string_translation'), $container->get('content_moderation.moderation_information') $container->get('content_moderation.moderation_information'), $container->get('router') ); } Loading @@ -76,6 +88,17 @@ public static function create(ContainerInterface $container, $base_plugin_id) { public function getDerivativeDefinitions($base_plugin_definition) { $this->derivatives = []; // Add the moderated content task if the route exists. if ($this->router->getRouteCollection()->get('content_moderation.admin_moderated_content') !== NULL) { $this->derivatives['content_moderation.moderated_content'] = [ 'route_name' => 'content_moderation.admin_moderated_content', 'title' => $this->t('Moderated content'), 'parent_id' => 'system.admin_content', 'weight' => 1, ]; } // Add the latest version tab to entities. $latest_version_entities = array_filter($this->entityTypeManager->getDefinitions(), function (EntityTypeInterface $type) { return $this->moderationInfo->canModerateEntitiesOfEntityType($type) && $type->hasLinkTemplate('latest-version'); }); Loading core/modules/content_moderation/tests/src/Functional/ModeratedContentLocalTaskTest.php 0 → 100644 +71 −0 Original line number Diff line number Diff line <?php namespace Drupal\Tests\content_moderation\Functional; use Drupal\Tests\BrowserTestBase; /** * Tests moderated content dynamic local task. * * @group content_moderation */ class ModeratedContentLocalTaskTest extends BrowserTestBase { /** * A user to test with. * * @var \Drupal\Core\Session\AccountInterface */ protected $adminUser; /** * {@inheritdoc} */ protected static $modules = [ 'block', 'content_moderation', 'node', ]; /** * {@inheritdoc} */ protected $defaultTheme = 'stark'; /** * {@inheritdoc} */ public function setUp(): void { parent::setUp(); $this->drupalPlaceBlock('local_tasks_block'); $this->adminUser = $this->drupalCreateUser([ 'access administration pages', 'access content overview', 'view any unpublished content', ]); } /** * Tests the moderated content local task appears. */ public function testModeratedContentLocalTask() { $this->drupalLogin($this->adminUser); // Verify the moderated content tab exists. $this->drupalGet('admin/content'); $this->assertSession()->statusCodeEquals(200); $this->assertSession()->linkExists('Moderated content'); // Uninstall the node module which should also remove the tab. $this->container->get('module_installer')->uninstall(['node']); // Verify the moderated content local task does not exist without the node // module installed. $this->drupalGet('admin/content'); $this->assertSession()->statusCodeEquals(200); $this->assertSession()->linkNotExists('Moderated content'); } } Loading
core/modules/content_moderation/content_moderation.links.task.yml +0 −6 Original line number Diff line number Diff line Loading @@ -6,9 +6,3 @@ content_moderation.content: title: 'Overview' route_name: system.admin_content parent_id: system.admin_content content_moderation.moderated_content: title: 'Moderated content' route_name: content_moderation.admin_moderated_content parent_id: system.admin_content weight: 1
core/modules/content_moderation/content_moderation.routing.yml +1 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ content_moderation.admin_moderated_content: _controller: '\Drupal\content_moderation\Controller\ModeratedContentController::nodeListing' _title: 'Moderated content' requirements: _module_dependencies: 'node' _permission: 'view any unpublished content' content_moderation.workflow_type_edit_form: Loading
core/modules/content_moderation/src/Plugin/Derivative/DynamicLocalTasks.php +25 −2 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslationInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Routing\RouterInterface; /** * Generates moderation-related local tasks. Loading Loading @@ -39,6 +40,13 @@ class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface */ protected $moderationInfo; /** * The router. * * @var \Symfony\Component\Routing\RouterInterface */ protected $router; /** * Creates a FieldUiLocalTask object. * Loading @@ -50,12 +58,15 @@ class DynamicLocalTasks extends DeriverBase implements ContainerDeriverInterface * The translation manager. * @param \Drupal\content_moderation\ModerationInformationInterface $moderation_information * The moderation information service. * @param \Symfony\Component\Routing\RouterInterface $router * The router. */ public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information) { public function __construct($base_plugin_id, EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation, ModerationInformationInterface $moderation_information, RouterInterface $router) { $this->entityTypeManager = $entity_type_manager; $this->stringTranslation = $string_translation; $this->basePluginId = $base_plugin_id; $this->moderationInfo = $moderation_information; $this->router = $router; } /** Loading @@ -66,7 +77,8 @@ public static function create(ContainerInterface $container, $base_plugin_id) { $base_plugin_id, $container->get('entity_type.manager'), $container->get('string_translation'), $container->get('content_moderation.moderation_information') $container->get('content_moderation.moderation_information'), $container->get('router') ); } Loading @@ -76,6 +88,17 @@ public static function create(ContainerInterface $container, $base_plugin_id) { public function getDerivativeDefinitions($base_plugin_definition) { $this->derivatives = []; // Add the moderated content task if the route exists. if ($this->router->getRouteCollection()->get('content_moderation.admin_moderated_content') !== NULL) { $this->derivatives['content_moderation.moderated_content'] = [ 'route_name' => 'content_moderation.admin_moderated_content', 'title' => $this->t('Moderated content'), 'parent_id' => 'system.admin_content', 'weight' => 1, ]; } // Add the latest version tab to entities. $latest_version_entities = array_filter($this->entityTypeManager->getDefinitions(), function (EntityTypeInterface $type) { return $this->moderationInfo->canModerateEntitiesOfEntityType($type) && $type->hasLinkTemplate('latest-version'); }); Loading
core/modules/content_moderation/tests/src/Functional/ModeratedContentLocalTaskTest.php 0 → 100644 +71 −0 Original line number Diff line number Diff line <?php namespace Drupal\Tests\content_moderation\Functional; use Drupal\Tests\BrowserTestBase; /** * Tests moderated content dynamic local task. * * @group content_moderation */ class ModeratedContentLocalTaskTest extends BrowserTestBase { /** * A user to test with. * * @var \Drupal\Core\Session\AccountInterface */ protected $adminUser; /** * {@inheritdoc} */ protected static $modules = [ 'block', 'content_moderation', 'node', ]; /** * {@inheritdoc} */ protected $defaultTheme = 'stark'; /** * {@inheritdoc} */ public function setUp(): void { parent::setUp(); $this->drupalPlaceBlock('local_tasks_block'); $this->adminUser = $this->drupalCreateUser([ 'access administration pages', 'access content overview', 'view any unpublished content', ]); } /** * Tests the moderated content local task appears. */ public function testModeratedContentLocalTask() { $this->drupalLogin($this->adminUser); // Verify the moderated content tab exists. $this->drupalGet('admin/content'); $this->assertSession()->statusCodeEquals(200); $this->assertSession()->linkExists('Moderated content'); // Uninstall the node module which should also remove the tab. $this->container->get('module_installer')->uninstall(['node']); // Verify the moderated content local task does not exist without the node // module installed. $this->drupalGet('admin/content'); $this->assertSession()->statusCodeEquals(200); $this->assertSession()->linkNotExists('Moderated content'); } }