Mercurial > hg > isophonics-drupal-site
diff core/modules/contextual/src/Element/ContextualLinks.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/contextual/src/Element/ContextualLinks.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,115 @@ +<?php + +namespace Drupal\contextual\Element; + +use Drupal\Component\Utility\Html; +use Drupal\Core\Render\Element\RenderElement; +use Drupal\Core\Url; + +/** + * Provides a contextual_links element. + * + * @RenderElement("contextual_links") + */ +class ContextualLinks extends RenderElement { + + /** + * {@inheritdoc} + */ + public function getInfo() { + $class = get_class($this); + return [ + '#pre_render' => [ + [$class, 'preRenderLinks'], + ], + '#theme' => 'links__contextual', + '#links' => [], + '#attributes' => ['class' => ['contextual-links']], + '#attached' => [ + 'library' => [ + 'contextual/drupal.contextual-links', + ], + ], + ]; + } + + /** + * Pre-render callback: Builds a renderable array for contextual links. + * + * @param array $element + * A renderable array containing a #contextual_links property, which is a + * keyed array. Each key is the name of the group of contextual links to + * render (based on the 'group' key in the *.links.contextual.yml files for + * all enabled modules). The value contains an associative array containing + * the following keys: + * - route_parameters: The route parameters passed to the url generator. + * - metadata: Any additional data needed in order to alter the link. + * @code + * array('#contextual_links' => array( + * 'block' => array( + * 'route_parameters' => array('block' => 'system.menu-tools'), + * ), + * 'menu' => array( + * 'route_parameters' => array('menu' => 'tools'), + * ), + * )) + * @endcode + * + * @return array + * A renderable array representing contextual links. + */ + public static function preRenderLinks(array $element) { + // Retrieve contextual menu links. + $items = []; + + $contextual_links_manager = static::contextualLinkManager(); + + foreach ($element['#contextual_links'] as $group => $args) { + $args += [ + 'route_parameters' => [], + 'metadata' => [], + ]; + $items += $contextual_links_manager->getContextualLinksArrayByGroup($group, $args['route_parameters'], $args['metadata']); + } + + // Transform contextual links into parameters suitable for links.html.twig. + $links = []; + foreach ($items as $class => $item) { + $class = Html::getClass($class); + $links[$class] = [ + 'title' => $item['title'], + 'url' => Url::fromRoute(isset($item['route_name']) ? $item['route_name'] : '', isset($item['route_parameters']) ? $item['route_parameters'] : [], $item['localized_options']), + ]; + } + $element['#links'] = $links; + + // Allow modules to alter the renderable contextual links element. + static::moduleHandler()->alter('contextual_links_view', $element, $items); + + // If there are no links, tell drupal_render() to abort rendering. + if (empty($element['#links'])) { + $element['#printed'] = TRUE; + } + + return $element; + } + + /** + * Wraps the contextual link manager. + * + * @return \Drupal\Core\Menu\ContextualLinkManager + */ + protected static function contextualLinkManager() { + return \Drupal::service('plugin.manager.menu.contextual_link'); + } + + /** + * Wraps the module handler. + * + * @return \Drupal\Core\Extension\ModuleHandlerInterface + */ + protected static function moduleHandler() { + return \Drupal::moduleHandler(); + } + +}