Рейтинг:3

Подстановка строк в параметре контекстного фильтра Views?

флаг nr

В Drupal 9 у меня есть представление, называемое Новости.

Представление отображается по следующему пути:

/Новости

Я могу отредактировать его по следующему пути:

/admin/структура/представления/представление/новости/изменить

Он имеет следующий контекстный фильтр:

Источник данных контента: тип контента

Значения контекстного фильтра предоставляются URL-адресом.

Когда значение фильтра НЕТ в URL: Укажите значение по умолчанию

Тип: Зафиксированный

Фиксированная стоимость: все

Значение исключения: все

Если это значение получено, фильтр будет проигнорирован; то есть "все значения"

Это хорошо работает для таких типов контента, как статья и Сообщение блога.

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

Когда представление отображается для пути /новости/blog_post, контекстный фильтр показывает только тип контента Сообщение блога.

Все идет нормально.

Теперь у клиента есть настраиваемый тип контента под названием «Youtube Video» с именем машины. YouTube видео.

Когда этот вид отображается для пути /новости/youtube_video. контекстный фильтр показывает только тип контента YouTube видео.

Но клиент хочет, чтобы путь был /новости/видео.

Каковы мои варианты?

Некоторые ограничения:

  • Клиент определенно хочет, чтобы путь был /новости/видео, а не что-то вроде /новости?тип=видео.
  • Я не думаю, что это тривиально, чтобы соответствовать /новости/foo и заменить бар за фу в качестве входных данных для контекстного фильтра.
  • Я знаю, как использовать позиционные параметры в маршруте, но я не думаю, что смогу легко переопределить маршрут только для /новости/foo при сохранении контекстного фильтра, как и для других типов контента.

Некоторая гибкость:

  • Сайт Drupal 9 совершенно новый, и я собираюсь перенести содержимое из Drupal 7 через Migrate API, поэтому возможное чтобы изменить имя машины YouTube видео тип контента для видео во время миграции. Тогда этот вид будет работать без изменений. (Проблема будет заключаться в том, чтобы выяснить все остальное, что ссылается на имя машины YouTube видео и изменить это на видео также - потенциально много усилий.)
  • Возможно изменить параметры запроса условно, используя hook_views_pre_view() или же hook_views_query_alter(), но я хочу сделать это только в том случае, если соответствует определенный параметр.
Рейтинг:3
флаг gf

Бы hook_views_pre_view() Покажи фокус?

функция hook_views_pre_view (ViewExecutable $ view, $ display_id, массив и $ args) {
  если ($view->id() == 'my_view' &&
    $display_id == 'мой_дисплей' &&
    $args[0] == 'новости' &&
    $args[1] == 'видео') {
    $args[1] = 'youtube_video';
  }
}

Заменять мой вид и мой_дисплей с соответствующими значениями.

hotwebmatter avatar
флаг nr
Спасибо @uberhacker. Я принял ваш ответ, который в основном поставил меня на правильный путь.
Рейтинг:1
флаг nr

Вот мое первое рабочее доказательство концепции, основанное на ответе выше:

/**
 * Реализует hook_view_pre_view().
 */
функция my_module_views_pre_view (ViewExecutable $ view, $ display_id, массив и $ args) {
  if ($view->id() == 'новости' && isset($args[0])) {
    если ($args[0] == 'видео') {
      $args[0] = 'youtube_video';
    }
  }
}

Первый аргумент в пути /новости/видео на самом деле просто вызывает представление с $view_id = 'новости', поэтому параметры контекстного фильтра не запускаются до второго сегмента на этом пути, т.е. $арг[0].

И это важно проверить $арг[0] устанавливается перед проверкой его значения; в противном случае /Новости path будет выдавать ошибки, если фильтры не будут переданы.

Наконец, в моем случае нет необходимости проверять конкретный $display_id, так как я хочу, чтобы подстановка строк происходила для всех отображений этого конкретного представления.

Кроме этого, ответ выше дал правильный ответ.

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

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