From 857dd902ed90623e88c4e262af1fb2f9d3b49632 Mon Sep 17 00:00:00 2001 From: Daniel Wehner <daniel@tag1consulting.com> Date: Wed, 16 Dec 2015 11:46:17 +0100 Subject: [PATCH] add local tasks --- entity.links.task.yml | 3 + .../Derivative/RevisionsOverviewDeriver.php | 72 +++++++++++++++++++ .../RevisionOverviewIntegrationTest.php | 56 +++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 entity.links.task.yml create mode 100644 src/Plugin/Derivative/RevisionsOverviewDeriver.php create mode 100644 tests/Kernel/RevisionOverviewIntegrationTest.php diff --git a/entity.links.task.yml b/entity.links.task.yml new file mode 100644 index 0000000..8116ae3 --- /dev/null +++ b/entity.links.task.yml @@ -0,0 +1,3 @@ +entity.revisions_overview: + deriver: 'Drupal\entity\Plugin\Derivative\RevisionsOverviewDeriver' + weight: 100 diff --git a/src/Plugin/Derivative/RevisionsOverviewDeriver.php b/src/Plugin/Derivative/RevisionsOverviewDeriver.php new file mode 100644 index 0000000..b7e308b --- /dev/null +++ b/src/Plugin/Derivative/RevisionsOverviewDeriver.php @@ -0,0 +1,72 @@ +<?php + +/** + * @file + * Contains \Drupal\entity\Plugin\Derivative\RevisionsOverviewDeriver. + */ + +namespace Drupal\entity\Plugin\Derivative; + +use Drupal\Component\Plugin\Derivative\DeriverBase; +use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Provides local tasks for the revision overview. + */ +class RevisionsOverviewDeriver extends DeriverBase implements ContainerDeriverInterface { + + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * Creates a new RevisionsOverviewDeriver instance. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager + * The entity type manager. + */ + public function __construct(\Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager) { + $this->entityTypeManager = $entityTypeManager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, $base_plugin_id) { + return new static( + $container->get('entity_type.manager') + ); + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinitions($base_plugin_definition) { + $exclude = ['node']; + + $this->derivatives = []; + foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) { + if (in_array($entity_type_id, $exclude)) { + continue; + } + + if (!$entity_type->hasLinkTemplate('version-history')) { + continue; + } + + $this->derivatives[$entity_type_id] = [ + 'route_name' => "entity.$entity_type_id.version_history", + 'title' => 'Revisions', + 'base_route' => "entity.$entity_type_id.edit_form", + 'weight' => 20, + ] + $base_plugin_definition; + } + + return parent::getDerivativeDefinitions($base_plugin_definition); + } + +} diff --git a/tests/Kernel/RevisionOverviewIntegrationTest.php b/tests/Kernel/RevisionOverviewIntegrationTest.php new file mode 100644 index 0000000..7ab784d --- /dev/null +++ b/tests/Kernel/RevisionOverviewIntegrationTest.php @@ -0,0 +1,56 @@ +<?php + +/** + * @file + * Contains \Drupal\Tests\entity\Kernel\RevisionOverviewIntegrationTest. + */ + +namespace Drupal\Tests\entity\Kernel; + +use Drupal\KernelTests\KernelTestBase; +use Symfony\Component\Routing\Route; + +/** + * Tests some integration of the revision overview: + * + * - Are the routes added properly. + * - Are the local tasks added properly. + */ +class RevisionOverviewIntegrationTest extends KernelTestBase { + + /** + * {@inheritdoc} + */ + public static $modules = ['node', 'entity_module_test', 'entity', 'user', 'system']; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->installSchema('system', 'router'); + + \Drupal::service('router.builder')->rebuild(); + } + + public function testIntegration() { + /** @var \Drupal\Core\Menu\LocalTaskManagerInterface $local_tasks_manager */ + $local_tasks_manager = \Drupal::service('plugin.manager.menu.local_task'); + + $tasks = $local_tasks_manager->getDefinitions(); + $this->assertArrayHasKey('entity.revisions_overview:entity_test_enhanced', $tasks); + $this->assertArrayNotHasKey('entity.revisions_overview:node', $tasks, 'Node should have been excluded because it provides their own'); + + $this->assertEquals('entity.entity_test_enhanced.version_history', $tasks['entity.revisions_overview:entity_test_enhanced']['route_name']); + $this->assertEquals('entity.entity_test_enhanced.edit_form', $tasks['entity.revisions_overview:entity_test_enhanced']['base_route']); + + /** @var \Drupal\Core\Routing\RouteProviderInterface $route_provider */ + $route_provider = \Drupal::service('router.route_provider'); + + $route = $route_provider->getRouteByName('entity.entity_test_enhanced.version_history'); + $this->assertInstanceOf(Route::class, $route); + $this->assertEquals('\Drupal\entity\Controller\RevisionOverviewController::revisionOverviewController', $route->getDefault('_controller')); + } + +} -- GitLab