Создание вкладки пользовательского меню на странице профиля пользователя в Drupal 8

Создание вкладки пользовательского меню на странице профиля пользователя в Drupal 8

10.10.2018 03:13:46 Просмотров 53 Источник

Я новичок 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'

Я сделал это, и маршрут работает так, как должен, однако вкладка не отображается на странице профиля моего пользователя.

Это должно выглядеть примерно так :

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

Я также позаботился о том, чтобы предоставить мой метод контента в моем контроллере с пользовательским объектом $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

Является ответом!
Cesar Moore

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]);
https://stackoverflow.com/questions/52740007/create-custom-menu-tab-on-a-users-profile-page-in-drupal-8/52746354#comment92417899_52746354
Да ! Спасибо это работает. Я изменил его, чтобы получить текущего пользователя, вошедшего в систему, как это : $пользователь = Друпал::текущий пользователь(); $URL-адрес = Друпал\ядро\адрес::fromRoute('мой_модуль.some_route_name', ['пользователь' => $пользователь->идентификатор()]);
https://stackoverflow.com/questions/52740007/create-custom-menu-tab-on-a-users-profile-page-in-drupal-8/52746354#comment92418059_52746354
спасибо, я занят проверкой, могу ли я снять крючок.
https://stackoverflow.com/questions/52740007/create-custom-menu-tab-on-a-users-profile-page-in-drupal-8/52746354#comment92418316_52746354
Спасибо, я удалил дополнительные параметры из моего контроллера, который не является упрощенным, как вы объяснили. Однако, похоже, мне все еще нужен крюк, иначе локальная задача / вкладка не отображается на моей странице профиля пользователя как одна из вкладок... В любом случае, вы мне очень помогли !
Tyler Shuster

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' . Нет необходимости в каких-либо изменениях. Этот маршрут теперь будет показывать новую вкладку на каждой странице вашего объекта: просмотр, редактирование или аналогичное.

Закрыть X