DRUPAL模块开发 - DRUPAL8 自定义contextual links菜单API

翻译者:长风Drupal开发:Drupal8 contextual links菜单

原文链接:https://www.drupal.org/docs/8/api/menu-api/providing-module-defined-contextual-links
在Drupal8中,和local tasks非常类似,Drupal8 contextual links菜单 也已经从hook_menu()中被移除,使用contextual links为在前端出现的常见Drupal对象周围的用户提供上下文操作。

定义contextual links

contextual links 通过YAML格式被定义,使用用模块名字来命名这个YAML格式的文件,比如,block.links.contextual.yml的内容如下:

 

block_configure:
  title: 'Configure block'
  route_name: 'block.admin_edit'
  group: 'block'

对于contextual links,
contextual 动作路由通过route_name 来提供。这是用户单击链接后将结束的路径。标题通过title关键词来被定义。上下文链接的关键概念是组。当显示上下文链接时,输出生成系统检索属于要显示的组的链接。weight关键词可用于同一组中的上下文链接排序。

渲染上下文链接(contextual links)

上下文链接呈现过程从渲染数组中的 #contextual_links关键字中提取组。例如在BlockViewBuilder中提供如下的contextual links,

public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) {
    $build = array();
    foreach ($entities as $key => $entity) {
      // ...
      $build[$entity_id] = [
        '#theme' => 'block',
        // ...
        '#contextual_links' => [
          'block' => [
            'route_parameters' => ['block' => $entity->id()],
          ],
        ],
        // ...
      ];
    }
    // ...
  }

 #contextual_links 中的'block'关键词渲染数组建理'block'组。属于'block'的所有链接将被作为contextual links显示。由key关键词提供的值是一个包含路由参数的数组,以便能够将与此块相关的路由转换为链接的路径。比如block.admin_edit路由在上面的路由中被关联,例子如下:

block.admin_edit:
  path: '/admin/structure/block/manage/{block}'
  defaults:
    _entity_form: 'block.default'
    _title: 'Configure block'
  requirements:
    _entity_access: 'block.update'

修改contextual links

如果想修改一个已经存在的contextual links,使用hook_contextual_links_view_alter().要向还没有上下文链接(contextual links)组的现有站点组件添加上下文链接,需要通过更改构建数组、定义新键和提供适当的路由参数集来建立新组。这样做的确切过程取决于如何和在何处呈现渲染阵列。使用新组更改渲染数组的示例是菜单如何将菜单组获取到块上下文链接中。

function menu_ui_block_view_system_menu_block_alter(array &$build, BlockPluginInterface $block) {
  // Add contextual links for system menu blocks.
  $menus = menu_list_system_menus();
  $menu_name = $block->getDerivativeId();
  if (isset($menus[$menu_name])) {
    $build['#contextual_links']['menu'] = [
      'route_parameters' => array('menu' => $menu_name),
    ];
  }
}

 动态contextual link的生成

由于动态contextual link 在Drupal8开发过程中用得比较少,这里就不进行详细介绍,如果您感兴趣,可以查看这个例子:https://www.drupal.org/node/2122253