Рейтинг:1

Как создать автоматический псевдоним URL для таксономии/термина/%tid/канала

флаг bd

Как установить автоматические псевдонимы URL для фидов таксономии?

Скажем, у меня есть термин с время = 1, по имени каникулы, с системным URL-адресом /таксономия/термин/1 который доступен по псевдониму URL /каникулы. Затем я хочу, чтобы rss-канал для этого термина был доступен по псевдониму URL. /праздники/подача или же /праздники/rss.xml. Это звучало довольно просто, когда я впервые подумал об этом, но кажется, что путьавто не поддерживает это (или я пропустил это). Я знаю, что могу создать псевдоним вручную, но, учитывая количество терминов X на сайте, я бы предпочел использовать шаблон для автоматического создания.

Единственные вопросы по этой теме, которые я смог найти, устарели:

Что-то, что я пропустил, или какой-либо вспомогательный модуль, который я не видел, который обеспечивает эту функциональность?

hotwebmatter avatar
флаг nr
Сборы Pathauto не очень хорошо сочетаются с представлением терминов таксономии по умолчанию. У меня пока нет ответа, но я дам ссылку на свой вопрос (похожий на ваш, но более сложный, потому что я имею дело с иерархической таксономией
hotwebmatter avatar
флаг nr
https://drupal.stackexchange.com/a/304279/80164
4uk4 avatar
флаг cn
Если у вас уже есть псевдонимы, такие как `/holidays`, вы можете написать собственный обработчик пути, применяющий эти псевдонимы без приложения /feed или /rss.xml. Расширьте https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/class/AliasPathProcessor/9.2.x, а затем либо замените класс в сервис-контейнере, либо зарегистрируйте свой собственный тегированный обработчик пути обслуживает входящие и исходящие потоки.
berliner avatar
флаг bd
@hotwebmatter Спасибо за ссылку, но я думаю, что ваши проблемы несколько отличаются от моих.
berliner avatar
флаг bd
@ 4k4 Спасибо за предложение. Я ищу решение, которое не требует пользовательского кода, если это возможно. Я буду иметь в виду вашу идею, но подожду, если кто-то придумает более простой способ добиться этого. Все еще надеюсь, что есть решение, которого я еще не видел.
4uk4 avatar
флаг cn
Пользовательский код включает только манипуляции со строками пути. Не так уж и важно.
berliner avatar
флаг bd
@ 4k4 Предлагаемое вами решение также применимо к исходящим URL-адресам? Я также хочу показать ссылку на RSS-канал на странице со списком терминов.
4uk4 avatar
флаг cn
Да, в пользовательском обработчике пути, основанном на связанном AliasPathProcessor, вы должны реализовать processOutbound(), который удаляет /feed из пути, вызывает getAliasByPath() и затем снова добавляет /feed.
berliner avatar
флаг bd
@ 4k4 Хорошо, я попробовал, и все работает правильно. Существуют ли какие-либо компромиссы в производительности между этим решением и фактическим созданием псевдонимов путей?
4uk4 avatar
флаг cn
Нет, эта довольно простая обработка пути не является проблемой производительности, вы не заметите эти несколько циклов процессора, а результат также кэшируется, как входящий как сопоставление маршрута, так и исходящий как отображаемые ссылки. Но вы экономите много места в таблице псевдонимов.
berliner avatar
флаг bd
@4k4 Спасибо за ценный отзыв. Я разместил свое решение на основе ваших предложений в качестве ответа.
Рейтинг:2
флаг bd

Основываясь на предложениях @4k4 в разделе комментариев к вопросу, я решил эту проблему, внедрив собственный PathProcessor.

Я поделюсь минимальным кодом для выполнения этой работы в виде пользовательского модуля (называемого term_feed_alias для этого примера), для которого вам нужно 3 файла.

term_feed_alias.info.yml

name: 'Псевдоним фида терминов'
description: «Предоставляет автоматические псевдонимы для фидов терминов таксономии»
версия: '8.x-1.0'
core_version_requirement: ^8.8 || ^9
тип: модуль
зависимости:
  - 'Псевдоним_пути:псевдоним_пути'

term_feed_alias.services.yml

Сервисы:
  term_feed_alias.path_processor:
    класс: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
    аргументы: ['@path_alias.manager']
    теги:
      - {имя: path_processor_inbound}
      - {имя: path_processor_outbound}

Служебные теги также могут получать приоритет, см. https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags Это может понадобиться для правильной интеграции логики псевдонимов с другими службами, такими как, например, переводы. Также см. первый комментарий @4k4.

scr/PathProcessorFeedAlias.php

<?php

пространство имен Drupal\term_feed_alias\PathProcessor;

используйте Drupal\Core\PathProcessor\InboundPathProcessorInterface;
используйте Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
используйте Drupal\Core\Render\BubbleableMetadata;
используйте Drupal\path_alias\AliasManager;
используйте Symfony\Component\HttpFoundation\Request;

/**
 * Обеспечьте обработчик пути для обработки псевдонимов для фидов терминов таксономии.
 */
класс PathProcessorFeedAlias ​​реализует InboundPathProcessorInterface, OutboundPathProcessorInterface {

  /**
   * Диспетчер псевдонимов, кэширующий поиск псевдонимов на основе запроса.
   *
   * @var \Drupal\path_alias\AliasManager
   */
  защищенный $aliasManager;

  /**
   * Создает новый экземпляр PathProcessorFeedAlias.
   *
   * @param \Drupal\path_alias\AliasManager $alias_manager
   * Менеджер псевдонимов.
   */
  общедоступная функция __construct(AliasManager $alias_manager) {
    $this->aliasManager = $alias_manager;
  }

  /**
   * {@inheritdoc}
   */
  общедоступная функция processInbound ($ путь, запрос $ запрос) {
    $args = взорвать ('/', обрезать ($ path, '/'));
    если (конец ($ args) == 'канал') {
      массив_поп ($ аргументы);
      $system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
      вернуть $system_path && strpos($system_path, '/taxonomy/term/') === 0 ? $системный_путь . '/канал': $путь;
    }
    вернуть $путь;
  }

  /**
   * {@inheritdoc}
   */
  публичная функция processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
    $args = взорвать('/', ltrim($path, '/'));
    if ($args[0] == 'таксономия' && $args[1] == 'term' && end($args) == 'канал') {
      массив_поп ($ аргументы);
      $alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
      возвращаться '/' . $ псевдоним . '/подача';
    }

    вернуть $путь;
  }
}
4uk4 avatar
флаг cn
Отличный пример кода. Предложение для многоязычных сайтов. Установите приоритет `{ name: path_processor_outbound, priority: 200 }`. Код работает только тогда, когда языковой префикс еще не добавлен (с приоритетом 100). В этом случае вам также понадобится параметр языка: https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/function/AliasPathProcessor%3A%3AprocessOutbound/9.2.x
berliner avatar
флаг bd
@ 4k4 Я обновил ответ, добавив примечание о приоритетах и ​​ссылку на документацию по служебным тегам на drupal.org. Сначала я намеренно убрал приоритеты, чтобы свести пример к строгому минимуму, но я полагаю, что это та проблема, которую сложнее понять при попытке повторного использования кода примера, поэтому примечание о это не больно.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.