Более одного псевдонима пути на узел


У меня есть система продажи билетов, в которой псевдонимы путей задаются как ticket/[node ID], напримерhttp://example.com/ticket/1234.

Я хотел бы создать несколько псевдонимов путей для одного и того же узла и иметь доступ к нему также как discussion/[node ID], например http://example.com/discussion/1234.

Я буду использовать разные шаблоны узлов в зависимости от пути.

Есть ли какой-либо способ установить несколько псевдонимов путей для одного и того же узла?

Author: 4k4, 2017-02-25

3 answers

Чтобы иметь рабочий пример кода для подхода маршрутизации.

Сначала в MYMODULE.routing.yml напишите:

ticket.view:
  path: '/ticket/{node}'
  defaults:
    _controller: '\Drupal\node\Controller\NodeViewController::view'
  requirements:
    node: \d+
    _entity_access: 'node.view'
discussion.view:
  path: '/discussion/{node}'
  defaults:
    _controller: '\Drupal\node\Controller\NodeViewController::view'
  requirements:
    node: \d+
    _entity_access: 'node.view'

Затем в MYMODULE.module вы должны добавить предложения по шаблону следующим образом:

/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function MYMODULE_theme_suggestions_node_alter(array &$suggestions, array $variables) {

  if (\Drupal::routeMatch()->getRouteName() == 'ticket.view') {
    $suggestions[] = 'ticket'; // Would take ticket.html.twig
  }

  if (\Drupal::routeMatch()->getRouteName() == 'discussion.view') {
    $suggestions[] = 'discussion'; // Would take discussion.html.twig
  }

}

Или, может быть, если все, что требуется, - это несколько разных стилей, просто добавьте класс тела в зависимости от маршрута:

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_html(&$variables) {

  if (\Drupal::routeMatch()->getRouteName() == 'ticket.view') {
    $variables['attributes']['class'][] = 'ticket';
  }

  if (\Drupal::routeMatch()->getRouteName() == 'discussion.view') {
    $variables['attributes']['class'][] = 'discussion';
  }

}

И последнее, но не менее важное, ознакомьтесь с этой блестящей статьей https://thinkshout.com/blog/2016/07/drupal-8-routing-tricks-for-better-admin-urls /, внутри есть еще несколько вкусностей маршрута вам может понравиться.

 1
Author: leymannx, 2017-02-25 23:01:21

Вы можете установить несколько псевдонимов путей для одного узла, это не проблема. Если вы не можете сделать это с помощью Pathauto, то это возможно с помощью пользовательского кода при сохранении узла.

Но в вашем случае может быть более эффективным настроить разные маршруты для /ticket/{node} и /discussion/{node}. Вы можете либо установить фиксированный параметр маршрута, либо использовать пользовательский контроллер узла для установки маркера, который можно использовать в предложении имени темы для выбора пользовательского шаблона.

Другим решением было бы создать представление с контекстный фильтр для узла и два дисплея с разными путями. Выберите для каждого отдельный режим просмотра, чтобы получить разные шаблоны. Технически это почти то же самое, но вам не нужен пользовательский модуль, потому что Views настраивает маршруты для вас.

 2
Author: 4k4, 2017-02-25 16:02:30

Еще лучшим подходом было бы по-прежнему использовать пользовательские маршруты и устанавливать различные режимы отображения для каждого маршрута. Благодаря этому у вас будет вся поддержка тем от core с небольшим или нулевым количеством пользовательского кода.

 0
Author: Kirill Roskolii, 2020-04-29 06:06:31