Issue #2050227 by damiankloip, pwolanin: Add local action plugin deriver to use YAML discovery for static definitions.
parent
6cfcb25b78
commit
7827f1d7dd
|
@ -0,0 +1,115 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \Drupal\Core\Menu\Plugin\Derivative\StaticLocalActionDeriver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\Core\Menu\Plugin\Derivative;
|
||||||
|
|
||||||
|
use Drupal\Core\Extension\ModuleHandlerInterface;
|
||||||
|
use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
|
||||||
|
use Drupal\Component\Plugin\Exception\PluginException;
|
||||||
|
use Drupal\Core\StringTranslation\TranslationManager;
|
||||||
|
use Drupal\Component\Utility\String;
|
||||||
|
use Drupal\Component\Discovery\YamlDiscovery;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides plugin derivatives for local actions provided in YAML files.
|
||||||
|
*/
|
||||||
|
class StaticLocalActionDeriver implements ContainerDerivativeInterface {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of derivative definitions.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $derivatives = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base plugin ID.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $basePluginId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The module handler.
|
||||||
|
*
|
||||||
|
* @var \Drupal\Core\Extension\ModuleHandlerInterface
|
||||||
|
*/
|
||||||
|
protected $moduleHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The translation manager.
|
||||||
|
*
|
||||||
|
* @var \Drupal\Core\StringTranslation\TranslationManager
|
||||||
|
*/
|
||||||
|
protected $translationManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static function create(ContainerInterface $container, $base_plugin_id) {
|
||||||
|
return new static(
|
||||||
|
$base_plugin_id,
|
||||||
|
$container->get('module_handler'),
|
||||||
|
$container->get('string_translation')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a StaticLocalActionDeriver 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_actions', $this->moduleHandler->getModuleDirectories());
|
||||||
|
$required_keys = array('title' => 1, 'route_name' => 1, 'appears_on' => 1);
|
||||||
|
|
||||||
|
foreach ($yaml_discovery->findAll() as $module => $local_actions) {
|
||||||
|
if (!empty($local_actions)) {
|
||||||
|
foreach ($local_actions as $name => $info) {
|
||||||
|
if ($missing_keys = array_diff_key($required_keys, array_intersect_key($info, $required_keys))) {
|
||||||
|
throw new PluginException(String::format('Static local action @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['appears_on'] = (array) $info['appears_on'];
|
||||||
|
$info['title'] = $this->translationManager->translate($info['title']);
|
||||||
|
$this->derivatives[$name] = $info + $base_plugin_definition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->derivatives;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \Drupal\Core\Annotation\StaticLocalAction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\Core\Menu\Plugin\Menu\LocalAction;
|
||||||
|
|
||||||
|
use Drupal\Core\Annotation\Menu\LocalAction;
|
||||||
|
use Drupal\Core\Menu\LocalActionBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @LocalAction(
|
||||||
|
* id = "local_action_static",
|
||||||
|
* derivative = "Drupal\Core\Menu\Plugin\Derivative\StaticLocalActionDeriver"
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
class StaticLocalAction extends LocalActionBase {
|
||||||
|
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ class LocalActionTest extends WebTestBase {
|
||||||
'menu-test-local-action/dynamic-title' => 'My dynamic-title action',
|
'menu-test-local-action/dynamic-title' => 'My dynamic-title action',
|
||||||
'menu-test-local-action/hook_menu' => 'My hook_menu action',
|
'menu-test-local-action/hook_menu' => 'My hook_menu action',
|
||||||
'menu-test-local-action/routing' => 'My routing action',
|
'menu-test-local-action/routing' => 'My routing action',
|
||||||
|
'menu-test-local-action/routing' => 'My YAML discovery action',
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
menu_test_local_action4:
|
||||||
|
route_name: menu_test_local_action3
|
||||||
|
title: 'My YAML discovery action'
|
||||||
|
appears_on:
|
||||||
|
- menu_test_local_action1
|
|
@ -1,24 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* Contains \Drupal\views_ui\Plugin\Menu\AddViewLocalAction.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Drupal\views_ui\Plugin\Menu\LocalAction;
|
|
||||||
|
|
||||||
use Drupal\Core\Annotation\Translation;
|
|
||||||
use Drupal\Core\Menu\LocalActionBase;
|
|
||||||
use Drupal\Core\Annotation\Menu\LocalAction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @LocalAction(
|
|
||||||
* id = "views_add_local_action",
|
|
||||||
* route_name = "views_ui.add",
|
|
||||||
* title = @Translation("Add new view"),
|
|
||||||
* appears_on = {"views_ui.list"}
|
|
||||||
* )
|
|
||||||
*/
|
|
||||||
class AddViewLocalAction extends LocalActionBase {
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
views_add_local_action:
|
||||||
|
route_name: views_ui.add
|
||||||
|
title: 'Add new view'
|
||||||
|
appears_on:
|
||||||
|
- views_ui.list
|
Loading…
Reference in New Issue