diff --git a/core/lib/Drupal/Core/Menu/ContextualLinkManagerInterface.php b/core/lib/Drupal/Core/Menu/ContextualLinkManagerInterface.php index bbbbce4..801990b 100644 --- a/core/lib/Drupal/Core/Menu/ContextualLinkManagerInterface.php +++ b/core/lib/Drupal/Core/Menu/ContextualLinkManagerInterface.php @@ -44,6 +44,7 @@ public function getContextualLinkPluginsByGroup($group_name); * - weight: The weight of the contextual link. * - localized_options: The options of the link, which will be passed * to the link generator. + * - metadata: The array of additional metadata that was passed in. */ public function getContextualLinksArrayByGroup($group_name, array $route_parameters, array $metadata = array()); diff --git a/core/modules/block/block.module b/core/modules/block/block.module index 6bc03f6..68af2d7 100644 --- a/core/modules/block/block.module +++ b/core/modules/block/block.module @@ -297,7 +297,7 @@ function _block_get_renderable_region($list = array()) { // to perform contextual actions on the help block, and the links needlessly // draw attention on it. if (isset($build[$key]) && !in_array($block->get('plugin'), array('system_help_block', 'system_main_block'))) { - $build[$key]['#contextual_links']['block.block'] = array( + $build[$key]['#contextual_links']['block'] = array( 'route_parameters' => array('block' => $key), ); diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockRenderController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockRenderController.php index 5c17396..76b8b34 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockRenderController.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockRenderController.php @@ -23,7 +23,7 @@ protected function alterBuild(array &$build, EntityInterface $entity, EntityDisp parent::alterBuild($build, $entity, $display, $view_mode, $langcode); // Add contextual links for this custom block. if (!empty($entity->id->value) && $view_mode == 'full') { - $build['#contextual_links']['custom_block.custom_block'] = array( + $build['#contextual_links']['custom_block'] = array( 'route_parameters' => array('custom_block' => $entity->id()), ); } diff --git a/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php b/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php index 8e0c4c3..9a4680c 100644 --- a/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php +++ b/core/modules/block/lib/Drupal/block/Tests/Views/DisplayBlockTest.php @@ -230,7 +230,7 @@ public function testBlockContextualLinks() { $block = $this->drupalPlaceBlock('views_block:test_view_block-block_1'); $this->drupalGet('test-page'); - $id = 'block:block:block=' . $block->id() . ':|views_ui:views_ui_edit:view=test_view_block:location=block&name=test_view_block&display_id=block_1'; + $id = 'block:block=' . $block->id() . ':|views_ui_edit:view=test_view_block:location=block&name=test_view_block&display_id=block_1'; // @see \Drupal\contextual\Tests\ContextualDynamicContextTest:assertContextualLinkPlaceHolder() $this->assertRaw('
', format_string('Contextual link placeholder with id @id exists.', array('@id' => $id))); diff --git a/core/modules/contextual/contextual.module b/core/modules/contextual/contextual.module index ae81f1c..1d5898d 100644 --- a/core/modules/contextual/contextual.module +++ b/core/modules/contextual/contextual.module @@ -238,16 +238,18 @@ function contextual_pre_render_placeholder($element) { * * @param $element * A renderable array containing a #contextual_links property, which is a - * keyed array. Each key is the string "$implementing_module:$group". The - * value contains an associative array containing the following keys: + * keyed array. Each key is the name of the group of contextual links to + * render (based on the 'group' key in the *.contextual_links.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: Some additional data needed in order to alter the link. + * - metadata: Any additional data needed in order to alter the link. * @code * array('#contextual_links' => array( - * 'block.block' => array( + * 'block' => array( * 'route_parameters' => array('block' => 'system.menu-tools'), * ), - * 'menu.menu' => array( + * 'menu' => array( * 'route_parameters' => array('menu' => 'tools'), * ), * )) @@ -265,33 +267,31 @@ function contextual_pre_render_links($element) { /** @var $contextual_links_manager \Drupal\Core\Menu\ContextualLinkManager */ $contextual_links_manager = \Drupal::service('plugin.manager.menu.contextual_link'); - foreach ($element['#contextual_links'] as $module_group => $args) { - list($module, $group) = explode('.', $module_group); + foreach ($element['#contextual_links'] as $group => $args) { $args += array( 'route_parameters' => array(), 'metadata' => array(), ); $contextual_links = $contextual_links_manager->getContextualLinksArrayByGroup($group, $args['route_parameters'], $args['metadata']); if (!empty($contextual_links)) { - unset($element['#contextual_links'][$module_group]); + // @todo Remove once all contextual links are converted. + unset($element['#contextual_links'][$group]); } $items += $contextual_links; } // @todo Remove once all contextual links are converted. - foreach ($element['#contextual_links'] as $module_group => $args) { - list($module, $group) = explode('.', $module_group); + foreach ($element['#contextual_links'] as $group => $args) { $args += array( 'route_parameters' => array(), ); - $items += menu_contextual_links($module, $group, array_values($args['route_parameters'])); + $items += menu_contextual_links($group, $group, array_values($args['route_parameters'])); } // Transform contextual links into parameters suitable for theme_links(). $links = array(); foreach ($items as $class => $item) { - $class = drupal_html_class($class); $links[$class] = array( 'title' => $item['title'], @@ -332,12 +332,12 @@ function contextual_contextual_links_view_alter(&$element, $items) { * Serializes #contextual_links property value array to a string. * * Examples: - * - node:node:node=1: - * - views_ui:views_ui_edit:view=frontpage:location=page&view_name=frontpage&view_display_id=page_1 - * - menu:menu:menu=tools:|block:block:block=bartik.tools: + * - node:node=1: + * - views_ui_edit:view=frontpage:location=page&view_name=frontpage&view_display_id=page_1 + * - menu:menu=tools:|block:block=bartik.tools: * * So, expressed in a pattern: - * ::: + * :: * * The route parameters and options are encoded as query strings. * @@ -350,11 +350,10 @@ function contextual_contextual_links_view_alter(&$element, $items) { */ function _contextual_links_to_id($contextual_links) { $ids = array(); - foreach ($contextual_links as $module_group => $args) { - list($module, $group) = explode('.', $module_group); + foreach ($contextual_links as $group => $args) { $route_parameters = Url::buildQuery($args['route_parameters']); $metadata = Url::buildQuery((isset($args['metadata'])) ? $args['metadata'] : array()); - $ids[] = "{$module}:{$group}:{$route_parameters}:{$metadata}"; + $ids[] = "{$group}:{$route_parameters}:{$metadata}"; } return implode('|', $ids); } @@ -374,13 +373,13 @@ function _contextual_id_to_links($id) { $contextual_links = array(); $contexts = explode('|', $id); foreach ($contexts as $context) { - list($module, $group, $route_parameters_raw, $metadata_raw) = explode(':', $context); + list($group, $route_parameters_raw, $metadata_raw) = explode(':', $context); parse_str($route_parameters_raw, $route_parameters); $metadata = array(); parse_str($metadata_raw, $metadata); - $contextual_links["$module.$group"] = array( + $contextual_links[$group] = array( 'route_parameters' => $route_parameters, - 'metadata' => $metadata + 'metadata' => $metadata, ); } return $contextual_links; diff --git a/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php b/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php index 413b298..4cbbca3 100644 --- a/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php +++ b/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php @@ -60,10 +60,10 @@ function testDifferentPermissions() { // Now, on the front page, all article nodes should have contextual links // placeholders, as should the view that contains them. $ids = array( - 'node:node:node=' . $node1->id() . ':', - 'node:node:node=' . $node2->id() . ':', - 'node:node:node=' . $node3->id() . ':', - 'views_ui:views_ui_edit:view=frontpage:location=page&name=frontpage&display_id=page_1', + 'node:node=' . $node1->id() . ':', + 'node:node=' . $node2->id() . ':', + 'node:node=' . $node3->id() . ':', + 'views_ui_edit:view=frontpage:location=page&name=frontpage&display_id=page_1', ); // Editor user: can access contextual links and can edit articles. diff --git a/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualUnitTest.php b/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualUnitTest.php index eb0a1f0..738f047 100644 --- a/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualUnitTest.php +++ b/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualUnitTest.php @@ -26,28 +26,28 @@ public static function getInfo() { */ function _contextual_links_id_testcases() { // Test branch conditions: - // - one module. + // - one group. // - one dynamic path argument. // - no metadata. $tests[] = array( 'links' => array( - 'node.node' => array( + 'node' => array( 'route_parameters' => array( 'node' => '14031991', ), 'metadata' => array() ), ), - 'id' => 'node:node:node=14031991:', + 'id' => 'node:node=14031991:', ); // Test branch conditions: - // - one module. + // - one group. // - multiple dynamic path arguments. // - no metadata. $tests[] = array( 'links' => array( - 'foo.baz' => array( + 'foo' => array( 'route_parameters'=> array( 'bar', 'key' => 'baz', @@ -56,16 +56,16 @@ function _contextual_links_id_testcases() { 'metadata' => array(), ), ), - 'id' => 'foo:baz:0=bar&key=baz&1=qux:', + 'id' => 'foo:0=bar&key=baz&1=qux:', ); // Test branch conditions: - // - one module. + // - one group. // - one dynamic path argument. // - metadata. $tests[] = array( 'links' => array( - 'views_ui.views_ui_edit' => array( + 'views_ui_edit' => array( 'route_parameters' => array( 'view' => 'frontpage' ), @@ -75,21 +75,21 @@ function _contextual_links_id_testcases() { ), ), ), - 'id' => 'views_ui:views_ui_edit:view=frontpage:location=page&display=page_1', + 'id' => 'views_ui_edit:view=frontpage:location=page&display=page_1', ); // Test branch conditions: - // - multiple modules. + // - multiple groups. // - multiple dynamic path arguments. $tests[] = array( 'links' => array( - 'node.node' => array( + 'node' => array( 'route_parameters' => array( 'node' => '14031991', ), 'metadata' => array(), ), - 'foo.baz' => array( + 'foo' => array( 'route_parameters' => array( 'bar', 'key' => 'baz', @@ -97,12 +97,12 @@ function _contextual_links_id_testcases() { ), 'metadata' => array(), ), - 'edge.edge' => array( + 'edge' => array( 'route_parameters' => array('20011988'), 'metadata' => array(), ), ), - 'id' => 'node:node:node=14031991:|foo:baz:0=bar&key=baz&1=qux:|edge:edge:0=20011988:', + 'id' => 'node:node=14031991:|foo:0=bar&key=baz&1=qux:|edge:0=20011988:', ); return $tests; diff --git a/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php b/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php index 616455e..fdcb63c 100644 --- a/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php +++ b/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php @@ -408,7 +408,7 @@ public function testBlockContextualLinks() { $block = $this->drupalPlaceBlock('system_menu_block:tools', array('label' => 'Tools', 'module' => 'system')); $this->drupalGet('test-page'); - $id = 'block:block:block=' . $block->id() . ':|menu:menu:menu=tools:'; + $id = 'block:block=' . $block->id() . ':|menu:menu=tools:'; // @see \Drupal\contextual\Tests\ContextualDynamicContextTest:assertContextualLinkPlaceHolder() $this->assertRaw('
', format_string('Contextual link placeholder with id @id exists.', array('@id' => $id))); diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module index 251c002..c48bb46 100644 --- a/core/modules/menu/menu.module +++ b/core/modules/menu/menu.module @@ -338,7 +338,7 @@ function menu_block_view_system_menu_block_alter(array &$build, BlockPluginInter list(, $menu_name) = explode(':', $block->getPluginId()); if (isset($menus[$menu_name]) && isset($build['content'])) { foreach (element_children($build['content']) as $key) { - $build['content']['#contextual_links']['menu.menu'] = array( + $build['content']['#contextual_links']['menu'] = array( 'route_parameters' => array('menu' => $build['content'][$key]['#original_link']['menu_name']), ); } diff --git a/core/modules/node/lib/Drupal/node/NodeRenderController.php b/core/modules/node/lib/Drupal/node/NodeRenderController.php index a37c5ff..9765735 100644 --- a/core/modules/node/lib/Drupal/node/NodeRenderController.php +++ b/core/modules/node/lib/Drupal/node/NodeRenderController.php @@ -83,7 +83,7 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang protected function alterBuild(array &$build, EntityInterface $entity, EntityDisplay $display, $view_mode, $langcode = NULL) { parent::alterBuild($build, $entity, $display, $view_mode, $langcode); if ($entity->id()) { - $build['#contextual_links']['node.node'] = array( + $build['#contextual_links']['node'] = array( 'route_parameters' =>array('node' => $entity->id()), ); } diff --git a/core/modules/node/lib/Drupal/node/Tests/Views/NodeContextualLinksTest.php b/core/modules/node/lib/Drupal/node/Tests/Views/NodeContextualLinksTest.php index f2f77e9..2cd0082 100644 --- a/core/modules/node/lib/Drupal/node/Tests/Views/NodeContextualLinksTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/Views/NodeContextualLinksTest.php @@ -47,10 +47,10 @@ public function testNodeContextualLinks() { $user = $this->drupalCreateUser(array('administer nodes', 'access contextual links')); $this->drupalLogin($user); - $response = $this->renderContextualLinks(array('node:node:node=1:'), 'node'); + $response = $this->renderContextualLinks(array('node:node=1:'), 'node'); $this->assertResponse(200); $json = Json::decode($response); - $this->drupalSetContent($json['node:node:node=1:']); + $this->drupalSetContent($json['node:node=1:']); $this->assertLinkByHref('node/1/contextual-links', 0, 'The contextual link to the view was found.'); $this->assertLink('Test contextual link', 0, 'The contextual link to the view was found.'); diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php index f52a814..18fa5e9 100644 --- a/core/modules/system/system.api.php +++ b/core/modules/system/system.api.php @@ -743,10 +743,10 @@ function hook_menu_contextual_links_alter(&$links, $router_item, $root_path) { * The group of contextual links being rendered. * @param array $route_parameters. * The route parameters passed to each route_name of the contextual links. - * So e.g. it is an array like that: - * @code - * node => $node->id(). - * @endcode + * For example: + * @code + * array('node' => $node->id()) + * @endcode * * @see \Drupal\Core\Menu\ContextualLinkManager */ diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php index c23391b..0df4dc4 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermRenderController.php @@ -54,7 +54,7 @@ protected function getBuildDefaults(EntityInterface $entity, $view_mode, $langco protected function alterBuild(array &$build, EntityInterface $entity, EntityDisplay $display, $view_mode, $langcode = NULL) { parent::alterBuild($build, $entity, $display, $view_mode, $langcode); $build['#attached']['css'][] = drupal_get_path('module', 'taxonomy') . '/css/taxonomy.module.css'; - $build['#contextual_links']['taxonomy.taxonomy_term'] = array( + $build['#contextual_links']['taxonomy_term'] = array( 'route_parameters' => array('taxonomy_term' => $entity->id()), ); } diff --git a/core/modules/views/lib/Drupal/views/Annotation/ViewsDisplay.php b/core/modules/views/lib/Drupal/views/Annotation/ViewsDisplay.php index 5c4b09a..fc6652e 100644 --- a/core/modules/views/lib/Drupal/views/Annotation/ViewsDisplay.php +++ b/core/modules/views/lib/Drupal/views/Annotation/ViewsDisplay.php @@ -86,7 +86,7 @@ class ViewsDisplay extends ViewsPluginAnnotationBase { public $uses_hook_block; /** - * A list of groups where contextual links should be added. + * A list of places where contextual links should be added. * For example: * @code * array( diff --git a/core/modules/views/views.module b/core/modules/views/views.module index 118f146..fd79b85 100644 --- a/core/modules/views/views.module +++ b/core/modules/views/views.module @@ -603,9 +603,7 @@ function views_add_contextual_links(&$render_element, $location, ViewExecutable $plugin['contextual_links_locations'][] = 'exposed_filter'; $has_links = !empty($plugin['contextual links']) && !empty($plugin['contextual_links_locations']); if ($has_links && in_array($location, $plugin['contextual_links_locations'])) { - foreach ($plugin['contextual links'] as $module_group => $link) { - list($module, $group) = explode('.', $module_group); - + foreach ($plugin['contextual links'] as $group => $link) { $args = array(); $valid = TRUE; if (!empty($link['route_parameters_names'])) { @@ -627,7 +625,7 @@ function views_add_contextual_links(&$render_element, $location, ViewExecutable // array. if ($valid) { $render_element['#views_contextual_links'] = TRUE; - $render_element['#contextual_links'][$module_group] = array( + $render_element['#contextual_links'][$group] = array( 'route_parameters' => $args, 'metadata' => array( 'location' => $location, diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayTest.php b/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayTest.php index a9bf1fa..905095a 100644 --- a/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayTest.php +++ b/core/modules/views_ui/lib/Drupal/views_ui/Tests/DisplayTest.php @@ -225,7 +225,7 @@ public function testDisplayPluginsAlter() { // Test the expected views_ui array exists on each definition. foreach ($definitions as $definition) { - $this->assertIdentical($definition['contextual links']['views_ui.views_ui_edit'], $expected, 'Expected views_ui array found in plugin definition.'); + $this->assertIdentical($definition['contextual links']['views_ui_edit'], $expected, 'Expected views_ui array found in plugin definition.'); } } @@ -288,7 +288,7 @@ public function testPageContextualLinks() { $view->enable()->save(); $this->drupalGet('test-display'); - $id = 'views_ui:views_ui_edit:view=test_display:location=page&name=test_display&display_id=page_1'; + $id = 'views_ui_edit:view=test_display:location=page&name=test_display&display_id=page_1'; // @see \Drupal\contextual\Tests\ContextualDynamicContextTest:assertContextualLinkPlaceHolder() $this->assertRaw('
', format_string('Contextual link placeholder with id @id exists.', array('@id' => $id))); diff --git a/core/modules/views_ui/views_ui.module b/core/modules/views_ui/views_ui.module index 7127037..bb873ed 100644 --- a/core/modules/views_ui/views_ui.module +++ b/core/modules/views_ui/views_ui.module @@ -317,7 +317,7 @@ function views_ui_views_plugins_display_alter(&$plugins) { // paths underneath "admin/structure/views/view/{$view->id()}" (i.e., paths // for editing and performing other contextual actions on the view). foreach ($plugins as &$display) { - $display['contextual links']['views_ui.views_ui_edit'] = array( + $display['contextual links']['views_ui_edit'] = array( 'route_name' => 'views_ui.edit', 'route_parameters_names' => array('view' => 'id'), );