在 Drupal 8 的用户配置文件页面上创建自定义菜单选项卡
Create custom menu tab on a users profile page in 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'
我已完成此操作并且路线正常运行,但是没有选项卡显示在我的用户的个人资料页面中。
它应该看起来像这样:
编辑 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',
]);
}
}
如果我用 1 替换我的路线路径的 {user} 部分,这将起作用。当我在路径中有 {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 ("user") to generate a URL for route ...
编辑 2
我还确保在我的控制器中为我的内容方法提供一个用户对象 $user,该对象实现了 AccountInterface,如下所述:https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes,但是,我仍然收到相同的错误消息。
你不需要钩子,我刚刚用你的 routing 和 _task 定义进行了测试,它对我来说工作正常。
这是我的控制器:
class MyModuleController {
public function content($user) {
return [
'#markup' => "user: $user"
];
}
}
这呈现为:“用户:1”在“/user/1/some_path”URL。
我认为您也在尝试使用 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]);
以防将来有人偶然发现这个问题,这里有一个更简单的方法,不需要 HOOK_menu_local_tasks_alter
实现,并更正 OP 代码中的拼写错误:
my_module.routing.yml
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'
my_module.task.yml
注意 OP 的 post.
中的单数 task
而不是 tasks
entity.my_entity.my_route:
route_name: entity.my_entity.my_route
base_route: entity.my_entity.canonical
title: 'My Route Title'
然后像在 @cesar-moore 的 post 中那样编写控制器,第一个参数向上转换,正如他指出的那样 MyEntity $my_entity
。无需任何改动。此路线现在将在您实体的每个页面上显示一个新选项卡:查看、编辑或类似选项卡。
我是 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'
我已完成此操作并且路线正常运行,但是没有选项卡显示在我的用户的个人资料页面中。
它应该看起来像这样:
编辑 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',
]);
}
}
如果我用 1 替换我的路线路径的 {user} 部分,这将起作用。当我在路径中有 {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 ("user") to generate a URL for route ...
编辑 2
我还确保在我的控制器中为我的内容方法提供一个用户对象 $user,该对象实现了 AccountInterface,如下所述:https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes,但是,我仍然收到相同的错误消息。
你不需要钩子,我刚刚用你的 routing 和 _task 定义进行了测试,它对我来说工作正常。
这是我的控制器:
class MyModuleController {
public function content($user) {
return [
'#markup' => "user: $user"
];
}
}
这呈现为:“用户:1”在“/user/1/some_path”URL。
我认为您也在尝试使用 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]);
以防将来有人偶然发现这个问题,这里有一个更简单的方法,不需要 HOOK_menu_local_tasks_alter
实现,并更正 OP 代码中的拼写错误:
my_module.routing.yml
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'
my_module.task.yml
注意 OP 的 post.
中的单数task
而不是 tasks
entity.my_entity.my_route:
route_name: entity.my_entity.my_route
base_route: entity.my_entity.canonical
title: 'My Route Title'
然后像在 @cesar-moore 的 post 中那样编写控制器,第一个参数向上转换,正如他指出的那样 MyEntity $my_entity
。无需任何改动。此路线现在将在您实体的每个页面上显示一个新选项卡:查看、编辑或类似选项卡。