Рейтинг:1

Use path alias as contextual filter

флаг cn

I have nodes in Drupal for News Articles that generates this automatic URL alias.

screenshot

I also have a view for News nodes.

screenshot

This is the data.

screenshot

The problem is that I can't use Content: Path (url) or Content: Path (Path) as contextual filter.

sync/newslist/1234, where 1234 is node ID, works. I would like to pass the path or the URL to the contextual filter, so that sync/newslist/world-first-chart-alerts-non-artists will return that node.

4uk4 avatar
флаг cn
Это не проблема контекстного фильтра. Проблема в том, что вы никогда не достигнете View через псевдоним пути, потому что он не совпадает. Вы можете написать свой собственный обработчик пути для частичного совпадения или попробовать вспомогательный модуль, например https://www.drupal.org/project/subpathauto.
Рейтинг:2
флаг gb

Например, вы можете создать собственный ViewsArgumentValidator и преобразовать данный псевдоним в идентификатор узла.

<?php

пространство имен Drupal\my_module\Plugin\views\argument_validator;

используйте Drupal\path_alias\AliasManagerInterface;
используйте Drupal\views\Plugin\views\argument_validator\ArgumentValidatorPluginBase;
используйте Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Проверяет, является ли псевдоним допустимым псевдонимом узла, и преобразует его в nid.
 *
 * @ViewsArgumentValidator(
 * идентификатор = "node_alias",
 * title = @Translation("Идентификатор узла по псевдониму")
 * )
 */
класс NodeAlias ​​расширяет ArgumentValidatorPluginBase {

  /**
   * Менеджер псевдонимов.
   *
   * @var \Drupal\path_alias\AliasManagerInterface
   */
  защищенный $aliasManager;

  /**
   * {@inheritdoc}
   */
  публичная функция __construct (массив $configuration, $plugin_id, $plugin_definition, AliasManagerInterface $alias_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->aliasManager = $alias_manager;
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
    вернуть новую статику(
      $ конфигурация,
      $plugin_id,
      $plugin_definition,
      $container->get('path_alias.manager'),
    );
  }

  /**
   * {@inheritdoc}
   */
  публичная функция validateArgument($argument) {
    // Ставим косую черту.
    $аргумент = '/' . ltrim($аргумент, '/');
    $path = $this->aliasManager->getPathByAlias($argument);

    если (preg_match('/узел\/(\d+)/', $path, $matches)) {
      $this->argument->argument = $matches[1];
      вернуть ИСТИНА;
    }
    вернуть ЛОЖЬ;
  }

}

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

Добавьте этот файл с именем NodeAlias.php вам пользовательский модуль в src/Plugin/views/argument_validator каталог и очистить кеш.

После этого вы можете использовать Содержание: Нид контекстный фильтр и выберите в разделе «Если значение фильтра находится в URL-адресе или указано значение по умолчанию» новый валидатор Идентификатор узла по псевдониму.

введите описание изображения здесь

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

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