Drupal 8 | Используется неверный псевдоним

Bonjour,

У меня есть проблема на Drupal 8, которую я не могу решить, поэтому я призываю вас.

У меня есть 2 псевдонима для одного и того же узла:

  • / Общественности / событие /10
  • / Про / событие /10

У меня есть block_1, который появляется только на страницах " /public/* ", а block_2 - на страницах " /pro/* ".

Когда я получаю доступ к URL "/pro/event/10", отображается block_1, а не block_2.

Я заключаю, что Drupal выбирает псевдоним "/public/event/10" (вероятно, первый, который он находит), пока я нахожусь на странице "/pro/event/10".

Как программно указать Drupal правильный псевдоним для использования?

Спасибо заранее за вашу помощь.

2 ответа

Решение

Возможно, вы захотите создать свой собственный path_processor_outbound обслуживание путем реализации OutboundPathProcessorInterface,
Эта реализация может работать на /node/{id} пути, если текущий путь запросов совпадает /public/event/** или же /pro/event/**,
Анализ сущности узла на предмет его типа (связки): если это event генерировать и возвращать желаемый путь; если это не так event не манипулируйте путем и верните оригинал.

Написание реальной реализации в коде PHP может быть вашим собственным удовольствием;-)

Вот код, если он может кому-то помочь

class OOutboundPathProcessor implements OutboundPathProcessorInterface 
{
    function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) 
    {
        // Only for nodes
        if (!isset($options['entity_type']) OR $options['entity_type'] !== 'node') 
        {
            return $path;
        }

        // Get current 'space'
        $espace = \Drupal::service('session')->get('espace');   

        // Get the node to process
        $node = $options['entity'];

        // New path
        $str_path = "/%s/%s/%s";
        $new_path = sprintf($str_path, $espace, $node->bundle(), $node->id());

        // Check new path
        $isValid = \Drupal::service('path.validator')->isValid($new_path);

        if ($isValid === true) return $new_path;

        return $path;
    }
}
Другие вопросы по тегам