Создание вкладки пользовательского меню на странице профиля пользователя в Drupal 8
Я новичок Drupal. Я написал пользовательский модуль в Drupal 8, и он работает и отображает некоторый контент.
Я хочу добавить вкладку в профиль пользователя, которая ссылается на мой пользовательский модуль.
Насколько я понимаю, мне нужно написать маршрут и задачу. Вот что я сделал :
my_module.маршрутизирующий.в формате 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.связи.задачи.в формате 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',
]);
}
}
Это работает, если я заменяю часть {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 ("user") to generate a URL for route ...
Правка 2
Я также позаботился о том, чтобы предоставить мой метод контента в моем контроллере с пользовательским объектом $user, который реализует AccountInterface, как описано здесь: https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes тем не менее, я все еще получаю то же сообщение об ошибке.
Ответы - Создание вкладки пользовательского меню на странице профиля пользователя в Drupal 8 / Create custom menu tab on a users profile page in Drupal 8

10.10.2018 09:09:13
Вам не нужен крюк, я просто проверил с вашими определениями маршрутизации и _task, и он отлично работает для меня.
Это мой контроллер:
class MyModuleController {
public function content($user) {
return [
'#markup' => "user: $user"
];
}
}
Это отображает как: "user: 1" в URL-адресе "/user/1/some_path".
Я думаю, что вы также пытаетесь использовать автоматическую настройку параметров Drupal, но это необязательно.
MissingMandatoryParametersException
Чтобы решить исключение (Symfony\Component\Routing\Exception\MissingMandatoryParametersException).
Вы должны добавить обязательный параметр в свой маршрут. Просто добавьте пользователя ( ['user' => 1]
):
$url = Drupal\Core\Url::fromRoute('my_module.some_route_name', ['user' => 1]);




01.11.2019 08:04:16
В случае, если кто-то наткнется на это в будущем, вот более простой способ, который не требует HOOK_menu_local_tasks_alter
my_module.задача.в формате 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'
, а не task
в сообщении OP.
tasks
Затем напишите свой контроллер, как вы бы в сообщении @cesar-moore, с первым параметром upcast, как он отмечает, как entity.my_entity.my_route:
route_name: entity.my_entity.my_route
base_route: entity.my_entity.canonical
title: 'My Route Title'
. Нет необходимости в каких-либо изменениях. Этот маршрут теперь будет показывать новую вкладку на каждой странице вашего объекта: просмотр, редактирование или аналогичное.