Рейтинг:0

Отображать метку поля (не ключ) как заголовок страницы просмотра в контекстном фильтре

флаг gu

В продолжение этих вопросов:

У меня есть термины таксономии игр и представление, представляющее их.В каждой игре есть поле типа выбора, называемое «жанр» в формате «ключ | метка». Так хранится 16 жанров (язык по умолчанию русский):

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

Затем я настроил свой вид Контекстный фильтр как это:

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

Пробовал с "Значение RAW из URL" - без изменений.

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

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

И он отлично работает с открытым фильтром, а также с доступом к URL-адресам, таким как /игра/2 или же /игры/13. Но он отображает заголовок страницы как поле KEY, как число.

Все, что я хочу сделать, это вывести соответствующий LABEL.

Теоретически я мог бы использовать только значения в этом поле, но это создаст еще две проблемы:

  1. Я не могу изменить параметры хранения поля без потери текущих данных.
  2. Жанры указаны на русском языке, поэтому будут такие проблемы с URL-адресами: .../?field_genre_value=%D0%90+%D1%8D%D1%82%D0%BE+%D1%82%D1%80%D0%B5%D1%82%D0%B8%D0%B9

Есть ли способ решить эту проблему?

Рейтинг:0
флаг gu

Наконец-то разобрался! Размещение моего ответа для будущих поколений.

Все, что нам нужно это YOUR_TEMPLATE.тема файл для этого.

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

используйте \Drupal\views\ViewExecutable;

// Изменение заголовка представления. Он не изменяет тег HEAD <title>!
функция YOUR_THEME_NAME_views_pre_render(ViewExecutable $view) 
{
  // checkRoute() и checkArg() являются пользовательскими функциями и описаны ниже
  если(checkRoute('view.VIEW_ID.VIEW_DISPLAY_ID') && checkArg())
  {
    // Это изменяет заголовок представления, а также устанавливает для переменных $variables['page']['#title'] одно и то же значение.
    // gamesGenreTitle() — это пользовательская функция, описанная ниже.
    $view->setTitle(gamesGenreTitle($view->args[0]));
  }
}

// Здесь мы можем изменить HEAD <title>
функция YOUR_THEME_NAME_preprocess_html(&$variables)
{
  // checkRoute() и checkArg() являются пользовательскими функциями и описаны ниже
  если (checkRoute('view.VIEW_ID.VIEW_DISPLAY_ID') && checkArg() && isset($variables['head_title'])) 
  {

    // Лишняя штука, нужны токены для моей цели
    $токен = Drupal::token();

    // $variables['page']['#title'] была изменена в views_pre_render(), поэтому мы можем изменить HEAD <title>.
    // Я использую токен [current-page:page-number] для уникальности заголовка
    // Чтобы улучшить это, мы можем добавить логику для включения номера текущей страницы, только если страниц больше 1
    $variables['head_title'] = $variables['page']['#title'] . " | Страница " . $token->replace('[текущая-страница:номер-страницы]');
  }
}

// Если вы используете текущий заголовок страницы в хлебных крошках, возможно, вы захотите изменить и его.
функция YOUR_THEME_NAME_preprocess_breadcrumb(&$variables)
{
  // checkRoute() и checkArg() являются пользовательскими функциями и описаны ниже
  if(checkRoute('view.VIEW_ID.VIEW_DISPLAY_ID') && checkArg() && isset($variables['breadcrumb']['2']['text']))
  {
    // Вы можете захотеть использовать var_dump($variables) перед выполнением этого трюка, чтобы найти свою «хлебную крошку».
    $variables['breadcrumb']['2']['text'] = gamesGenreTitle(getArg_0());
  }
}

// Получение допустимых значений поля (меток), используемых для создания заголовка
функция gamesGenreTitle($val)
{
  $options = options_allowed_values(\Drupal::service('entity_field.manager')->getFieldStorageDefinitions('taxonomy_term')['field_NAME']);

  // Проверяем, правильно ли мы передаем данные
  if(is_numeric($val) && $val <= count($options))
  {
    вернуть $options[$val];
  }
}

// Проверяем, установлен ли нужный аргумент и является ли он числовым.
функция checkArg()
{
  $arg = Drupal::routeMatch()->getParameter('arg_0');
  // В моем случае аргумент из представлений был передан в arg_0
  // Это может быть по-разному, поэтому попробуйте var_dump($arg) или ksm($arg), чтобы убедиться, что это то, что вам нужно

  вернуть isset($arg) && is_numeric($arg);
}

// Проверяем текущий маршрут, нам нужен точный вид и отображение, иначе заголовок будет меняться на каждой странице.
функция checkRoute($check)
{
  $route = \Drupal::routeMatch()->getRouteName();
  вернуть $ маршрут == $ проверить;
}

// Получение аргументов, передаваемых представлениям.
функция getArg_0()
{
  // И снова arg_0 может не быть вашим аргументом, дважды проверьте его с помощью var_dump() или ksm()
  return Drupal::routeMatch()->getParameter('arg_0');
}

И еще один метод, если у вас не так много меток полей, вы можете использовать это в поле переопределения заголовка представлений (там поддерживается ветка):

{% if arguments.field_NAME_value == 1 %} ВАШЕ НАЗВАНИЕ 1 {% elseif arguments.field_NAME_value == 2 %} ВАШЕ НАЗВАНИЕ 2 {% endif %}

Надеюсь, это поможет кому-то!

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

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