在Drupal 8的用户个人资料页面上创建自定义菜单选项卡

时间:2018-10-10 12:13:46

标签: drupal drupal-modules drupal-8

我是Drupal新手。我已经在Drupal 8中编写了一个自定义模块,该模块可以工作并显示一些内容。

我想在用户个人资料中添加一个标签,以链接到我的自定义模块。

据我了解,我需要写一条路线和一条任务。这就是我所做的:

my_module.routing.yml

my_module.some_route_name:
  path: '/user/{user}/some_path'
  defaults:
    _controller: '\Drupal\my_module\Controller\MyModuleController::content'
    _title: 'Some Title'
  requirements:
    _permission: 'access content'
  options:
    user: \d+

my_module.links.tasks.yml

my_module.some_task_name:
  route_name: my_module.some_route_name
  base_route: entity.user.canonical
  title: 'Some Title'

我已完成此操作,并且路由正常运行,但是在用户的个人资料页面中未显示任何标签

它应该看起来像这样:

enter image description here

编辑1

我已经通过根据Drupal API 8.6(menu_local_tasks_alter)创建一个钩子解决了部分问题,这就是我写的内容:

function my_module_menu_local_tasks_alter(&$data, $route_name, \Drupal\Core\Cache\RefinableCacheableDependencyInterface &$cacheability) {

$url = Drupal\Core\Url::fromRoute('my_module.some_route_name');

if ($route_name == 'entity.user.canonical') {
$data['tabs'][0]['my_module.some_route_name'] = [
    '#theme' => 'menu_local_task',
    '#link' => [
    'title' => t('Some Title'),
    'url' => $url,
    'localized_options' => [
        'attributes' => [
        'title' => t('Add content'),
        ],
    ],
    ],
];

// The tab we're adding is dependent on a user's access to add content.
$cacheability
    ->addCacheTags([
    'user.permissions',
]);
}

}

如果我将路由路径的{user}部分替换为1,则此方法有效。当路径中有{user}时,它现在出现以下错误:

The website encountered an unexpected error. Please try again later.</br></br><em class="placeholder">Symfony\Component\Routing\Exception\MissingMandatoryParametersException</em>: Some mandatory parameters are missing (&quot;user&quot;) to generate a URL for route ...

编辑2

我还确保在控制器中为我的content方法提供了一个用户对象$ user,该对象实现了AccountInterface,如下所述:https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes,但是,我仍然收到相同的错误消息。

2 个答案:

答案 0 :(得分:1)

您不需要挂钩,我只是用您的 routing 和_task定义进行了测试,对我来说很好用。

这是我的控制者:

class MyModuleController {

  public function content($user) {
    return [
      '#markup' => "user: $user"
    ];
  }

}

这表示为“ / user / 1 / some_path ” URL中的“ user:1 ”。

我认为您也在尝试使用Drupal's automatic paramater upcasting,但这是可选的。

MissingMandatoryParametersException

解决异常(Symfony \ Component \ Routing \ Exception \ MissingMandatoryParametersException)。 您必须在路线中添加必填参数。只需添加用户(['user' => 1]):

$url = Drupal\Core\Url::fromRoute('my_module.some_route_name', ['user' => 1]);

答案 1 :(得分:0)

万一将来有人偶然发现此问题,这是一种不需要extension CMFormatDescription: Equatable { public static func == (lhs: CMFormatDescription, rhs: CMFormatDescription) -> Bool { return CMFormatDescriptionEqual(lhs, otherFormatDescription: rhs) } } 实现的简单方法,并且可以纠正OP代码中的错字:

my_module.routing.yml

HOOK_menu_local_tasks_alter

my_module.task.yml

请注意OP帖子中的单数entity.my_entity.my_route: path: '/admin/my_entity/{my_entity}/my_route' # Or similar defaults: _controller: '\Drupal\my_module\Controller\MyController::content' _title: 'My Route Title' options: parameters: my_entity: type: entity:my_entity requirements: _permission: 'my_permission' 而不是task

tasks

然后像在@ cesar-moore的帖子中那样编写控制器,正如他指出的那样,将第一个参数向上转换为entity.my_entity.my_route: route_name: entity.my_entity.my_route base_route: entity.my_entity.canonical title: 'My Route Title' 。无需任何更改。现在,此路线将在实体的每个页面上显示一个新标签:查看,修改或类似内容。