Создание пользовательской вкладки меню на странице профиля пользователя в Drupal 8 - PullRequest
0 голосов
/ 10 октября 2018

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

Edit 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 $ user, который реализует AccountInterface, как описано здесь: https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes однако я все еще получаю то же сообщение об ошибке.

1 Ответ

0 голосов
/ 10 октября 2018

Тебе не нужен хук, я только что проверил с твоими маршрутизацией и определениями _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]);
...