Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
40.00% |
2 / 5 |
CRAP | |
86.27% |
44 / 51 |
| ViewsLocalTask | |
0.00% |
0 / 1 |
|
40.00% |
2 / 5 |
14.51 | |
86.27% |
44 / 51 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getDerivativeDefinitions | |
100.00% |
1 / 1 |
5 | |
100.00% |
20 / 20 |
|||
| alterLocalTasks | |
0.00% |
0 / 1 |
6.03 | |
90.91% |
20 / 22 |
|||
| getApplicableMenuViews | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\views\Plugin\Derivative\ViewsLocalTask. | |
| */ | |
| namespace Drupal\views\Plugin\Derivative; | |
| use Drupal\Core\Entity\EntityStorageInterface; | |
| use Drupal\Core\State\StateInterface; | |
| use Drupal\Component\Plugin\Derivative\DeriverBase; | |
| use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; | |
| use Drupal\Core\Routing\RouteProviderInterface; | |
| use Drupal\views\Views; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| /** | |
| * Provides local task definitions for all views configured as local tasks. | |
| */ | |
| class ViewsLocalTask extends DeriverBase implements ContainerDeriverInterface { | |
| /** | |
| * The route provider. | |
| * | |
| * @var \Drupal\Core\Routing\RouteProviderInterface | |
| */ | |
| protected $routeProvider; | |
| /** | |
| * The state key value store. | |
| * | |
| * @var \Drupal\Core\State\StateInterface | |
| */ | |
| protected $state; | |
| /** | |
| * The view storage. | |
| * | |
| * @var \Drupal\Core\Entity\EntityStorageInterface | |
| */ | |
| protected $viewStorage; | |
| /** | |
| * Constructs a \Drupal\views\Plugin\Derivative\ViewsLocalTask instance. | |
| * | |
| * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider | |
| * The route provider. | |
| * @param \Drupal\Core\State\StateInterface $state | |
| * The state key value store. | |
| * @param \Drupal\Core\Entity\EntityStorageInterface $view_storage | |
| * The view storage. | |
| */ | |
| public function __construct(RouteProviderInterface $route_provider, StateInterface $state, EntityStorageInterface $view_storage) { | |
| $this->routeProvider = $route_provider; | |
| $this->state = $state; | |
| $this->viewStorage = $view_storage; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function create(ContainerInterface $container, $base_plugin_id) { | |
| return new static( | |
| $container->get('router.route_provider'), | |
| $container->get('state'), | |
| $container->get('entity.manager')->getStorage('view') | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getDerivativeDefinitions($base_plugin_definition) { | |
| $this->derivatives = array(); | |
| $view_route_names = $this->state->get('views.view_route_names'); | |
| foreach ($this->getApplicableMenuViews() as $pair) { | |
| /** @var $executable \Drupal\views\ViewExecutable */ | |
| list($view_id, $display_id) = $pair; | |
| $executable = $this->viewStorage->load($view_id)->getExecutable(); | |
| $executable->setDisplay($display_id); | |
| $menu = $executable->display_handler->getOption('menu'); | |
| if (in_array($menu['type'], array('tab', 'default tab'))) { | |
| $plugin_id = 'view.' . $executable->storage->id() . '.' . $display_id; | |
| $route_name = $view_route_names[$executable->storage->id() . '.' . $display_id]; | |
| // Don't add a local task for views which override existing routes. | |
| // @todo Alternative it could just change the existing entry. | |
| if ($route_name != $plugin_id) { | |
| continue; | |
| } | |
| $this->derivatives[$plugin_id] = array( | |
| 'route_name' => $route_name, | |
| 'weight' => $menu['weight'], | |
| 'title' => $menu['title'], | |
| ) + $base_plugin_definition; | |
| // Default local tasks have themselves as root tab. | |
| if ($menu['type'] == 'default tab') { | |
| $this->derivatives[$plugin_id]['base_route'] = $route_name; | |
| } | |
| } | |
| } | |
| return $this->derivatives; | |
| } | |
| /** | |
| * Alters base_route and parent_id into the views local tasks. | |
| */ | |
| public function alterLocalTasks(&$local_tasks) { | |
| $view_route_names = $this->state->get('views.view_route_names'); | |
| foreach ($this->getApplicableMenuViews() as $pair) { | |
| list($view_id, $display_id) = $pair; | |
| /** @var $executable \Drupal\views\ViewExecutable */ | |
| $executable = $this->viewStorage->load($view_id)->getExecutable(); | |
| $executable->setDisplay($display_id); | |
| $menu = $executable->display_handler->getOption('menu'); | |
| // We already have set the base_route for default tabs. | |
| if (in_array($menu['type'], array('tab'))) { | |
| $plugin_id = 'view.' . $executable->storage->id() . '.' . $display_id; | |
| $view_route_name = $view_route_names[$executable->storage->id() . '.' . $display_id]; | |
| // Don't add a local task for views which override existing routes. | |
| if ($view_route_name != $plugin_id) { | |
| unset($local_tasks[$plugin_id]); | |
| continue; | |
| } | |
| // Find out the parent route. | |
| // @todo Find out how to find both the root and parent tab. | |
| $path = $executable->display_handler->getPath(); | |
| $split = explode('/', $path); | |
| array_pop($split); | |
| $path = implode('/', $split); | |
| $pattern = '/' . str_replace('%', '{}', $path); | |
| if ($routes = $this->routeProvider->getRoutesByPattern($pattern)) { | |
| foreach ($routes->all() as $name => $route) { | |
| $local_tasks['views_view:' . $plugin_id]['base_route'] = $name; | |
| // Skip after the first found route. | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| /** | |
| * Return a list of all views and display IDs that have a menu entry. | |
| * | |
| * @return array | |
| * A list of arrays containing the $view and $display_id. | |
| * @code | |
| * array( | |
| * array($view, $display_id), | |
| * array($view, $display_id), | |
| * ); | |
| * @endcode | |
| */ | |
| protected function getApplicableMenuViews() { | |
| return Views::getApplicableViews('uses_menu_links'); | |
| } | |
| } |