diff --git a/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalTaskDeriver.php b/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalTaskDeriver.php new file mode 100644 index 0000000..de01c95 --- /dev/null +++ b/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalTaskDeriver.php @@ -0,0 +1,114 @@ +get('module_handler'), + $container->get('string_translation') + ); + } + + /** + * Constructs a StaticLocalTaskDeriver object. + * + * @param string $base_plugin_id + * The base plugin ID. + * @param\Drupal\Core\Extension\ModuleHandlerInterface $module_handler + * The module handler. + * @param \Drupal\Core\StringTranslation\TranslationManager translation_manager + * The translation manager. + */ + public function __construct($base_plugin_id, ModuleHandlerInterface $module_handler, TranslationManager $translation_manager) { + $this->basePluginId = $base_plugin_id; + $this->moduleHandler = $module_handler; + $this->translationManager = $translation_manager; + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) { + if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) { + return $this->derivatives[$derivative_id]; + } + $this->getDerivativeDefinitions($base_plugin_definition); + return $this->derivatives[$derivative_id]; + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinitions(array $base_plugin_definition) { + $yaml_discovery = new YamlDiscovery('local_tasks', $this->moduleHandler->getModuleDirectories()); + $required_keys = array('title' => 1, 'route_name' => 1, 'tab_root_id' => 1); + + foreach ($yaml_discovery->findAll() as $module => $local_tasks) { + if (!empty($local_tasks)) { + foreach ($local_tasks as $name => $info) { + if ($missing_keys = array_diff_key($required_keys, array_intersect_key($info, $required_keys))) { + throw new PluginException(String::format('Static local task @name is missing @keys', array('@name' => $name, '@keys' => implode(', ', array_keys($missing_keys))))); + } + + $info += array('provider' => $module); + // Make sure 'appears_on' is an array. + $info['title'] = $this->translationManager->translate($info['title']); + $this->derivatives[$name] = $info + $base_plugin_definition; + } + } + } + + return $this->derivatives; + } + +} diff --git a/core/lib/Drupal/Core/Menu/Plugin/Menu/LocalTask/StaticLocalTask.php b/core/lib/Drupal/Core/Menu/Plugin/Menu/LocalTask/StaticLocalTask.php new file mode 100644 index 0000000..1d35daf --- /dev/null +++ b/core/lib/Drupal/Core/Menu/Plugin/Menu/LocalTask/StaticLocalTask.php @@ -0,0 +1,21 @@ +assertLocalTasks(array( 'menu-local-task-test/tasks/settings/sub1', 'menu-local-task-test/tasks/settings/sub2', + 'menu-local-task-test/tasks/settings/sub3', ), 1); $result = $this->xpath('//ul[contains(@class, "tabs")]//a[contains(@class, "active")]'); @@ -176,6 +177,7 @@ public function testPluginLocalTask() { $this->assertLocalTasks(array( 'menu-local-task-test/tasks/settings/sub1', 'menu-local-task-test/tasks/settings/sub2', + 'menu-local-task-test/tasks/settings/sub3', ), 1); $result = $this->xpath('//ul[contains(@class, "tabs")]//a[contains(@class, "active")]'); diff --git a/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml b/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml new file mode 100644 index 0000000..f9bbd7c --- /dev/null +++ b/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml @@ -0,0 +1,6 @@ +menu_local_task_test_tasks_settings_sub3: + route_name: menu_local_task_test_tasks_settings_sub3 + title: sub3 + tab_root_id: menu_local_task_test_tasks_view + tab_parent_id: menu_local_task_test_tasks_settings + weight: 20 diff --git a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml index 2d701dc..43f008d 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml +++ b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml @@ -100,6 +100,13 @@ menu_local_task_test_tasks_settings_sub2: requirements: _access: 'TRUE' +menu_local_task_test_tasks_settings_sub3: + pattern: '/menu-local-task-test/tasks/settings/sub3' + defaults: + _content: '\Drupal\menu_test\TestControllers::test1' + requirements: + _access: 'TRUE' + menu_test_optional_placeholder: pattern: '/menu-test/optional/{placeholder}' defaults: diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsListTask.php b/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsListTask.php deleted file mode 100644 index f1237fc..0000000 --- a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsListTask.php +++ /dev/null @@ -1,25 +0,0 @@ -