1. Главная
  2. Форумы
  3. Техподдержка Drupal
  4. Решение проблем

Twig в контекстном фильтре

Главные вкладки

Здравствуйте!

Не могу понять, почему не срабатывает код. Сделал контекстный фильтр "Термин таксономии: Название", в необходимой части URL 15 символов, но мне надо передать последние 10 символов (это название термина таксономии, первые 5 символов не нужно брать). Если явно указывать 10 символов (Фиксированное значение), то все работает. Выбираю "Передать значение по умолчанию" -> "Необработанное значение из URL", путь и т.д. Тут, само собой, не работает, т.к. передается 15 символов. Чтобы первые 5 символов обрезались ввожу шаблон:

{{ arguments[0][-10:] }}

Делаю в "Когда значение фильтра ДОСТУПНО или предоставлено по умолчанию" -> "Переопределить заголовок". Но ничего не работает, т.е. twig вообще никакого влияния не оказывает, как будто не работает, перепробовал уже кучу вариантов.

Если в шаблоне указать код:

{{ "now"|date ("Y-m-d") }}

то работает.

Подскажите пожалуйста как можно решить проблему, в логах пусто, либо возможно, я не правильно понял смысл функции "Переопределить заголовок" и вообще она для друго предназначена. В общем надо взять значение из url (15 символов - цифр), обрезать до 10 последних и передать дальше в Критерии фильтрации. Подчеркиваю, именно передать дальше в Критерии фильтрации, а не модифицировать с 15 до 10 в полях, т.к. названия термина таксономии с 15 символами нет, поэтому ничего работать не будет) Поменять структуру url тоже проблематично. Создать контексный фильтр по tid не вариант, т.к. нужно в Критерии фильтрации передать именно название термина таксономии.

Лучший ответ

Аватар пользователя ivnish ivnish 25 мая в 8:14

Чтобы нейросети (и люди) давали правильный ответ, нужно очень подробно написать ТЗ. Напишите как сделать такие же вьюхи как у вас и вообще более подробно распишите ТЗ

Комментарии

Аватар пользователя ivnish ivnish 17 мая в 11:17

Функция «Переопределить заголовок»предназначена исключительно для изменения визуального заголовка страницы или блока. Она меняет текст, который видят пользователи, но никак не влияет на само значение аргумента, которое передается в SQL-запрос Views.

Нужно в кастомном модуле добавить код

<?php
function MYMODULE_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
if (
$view->id() == 'имя_вашей_вьюхи') {

// Предположим, что контекстный фильтр идет первым (индекс 0)
if (isset($args[0]) && strlen($args[0]) === 15) {
// Обрезаем первые 5 символов, оставляя 10 последних
$args[0] = substr($args[0], 5);
}
}
}
?>

(код на работоспособность не проверял)

Аватар пользователя Delewo Delewo 24 мая в 0:01

Уже кучу этих модулей перепробовал, созданные с помощью ИИ, и все нерабочие.

Вот последний:

1. Создал каталог в /modules. Назвал last10digits.

2. В каталоге /modules/last10digits создал файл lasts10digits.info.yml со следующим содержимым:

type: module
name: 'last10digits'
core_version_requirement: ^9 || ^10 || ^11
package: Custom
dependencies:
- drupal:views
plugins:
views.filter:
last10digits: Drupal\last10digits\Plugin\views\filter\Last10Digits

3. Создал каталоги /modules/last10digits/src/Plugin/views/filter/

4. В каталоге /modules/last10digits/src/Plugin/views/filter/ создал файл Last10Digits.php со следующим содержимым:

<?php

namespace Drupal\last10digits\Plugin\views\filter;

use Drupal\views\Plugin\views\filter\InOperator;

/**
* Provides a custom filter to extract the last five digits from the current path.
*
* @ViewsFilter("last10digits")
*/

class last10digits extends InOperator {

/**
* {@inheritdoc}
*/

protected function opSimple() {
// Получаем последний путь страницы
$url = \Drupal::request()->getPathInfo();

// Выделяем последние 10 символов из URL
$last_10_digits = substr ($url, -10);

// Устанавливаем новое значение для фильтра
$this->value = [$last_10_digits];

return parent::opSimple();
}

}

5. Установил модуль, обновил кэш.

Как говорит нейросеть, теперь при добавлении контекстного фильтра должен появиться новый аргумент. Насколько я понял, выбираем, например, Название (Термин таксономии) -> Передать значение по умолчанию и тут должен быть новый фильтр last10digits, но ничего подобного там нет. Нигде нет, все как было, так и есть. Ошибок тоже в логах нет.

Это вроде ChatGPT написал, этих сайтов куча, но я уже многое перепробовал, тут ИИ конкретно тупят, некоторые вообще сайт ломают. В целом ИИ мне много с кодом помогает, но тут вообще тупик какой-то, а задача элементарная по сути.

Аватар пользователя Delewo Delewo 24 мая в 0:52

Ваш код также не сработал.

Пробовал еще от ИИ:

<?php

/**
* @file
* Contains hook implementations for my_custom_module.
*/

use Drupal\views\ViewExecutable;

/**
* Implements hook_views_pre_view().
*/

function my_custom_module_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
// Замените 'YOUR_VIEW_ID' на ID вашего представления.
if ($view->id() === 'mycoolview' && !empty ($args)) {
$term_arg = $args[0];
if (strlen ($term_arg) > 15) {
$args[0] = substr ($term_arg, 5, 10); // Обрезаем первые 5 символов, оставляем 10
}
}
}

т.е. вообще ничего не обрезается. Может дело в том, что мое значение находится вторым в пути, например: /pages/123456789012345, т.е. надо оставить 6789012345. Хотя именно так я и формулировал задачу для ИИ. Соответственно выбираю "Необработанное значение из URL", Компонент пути 2 и ставлю галочку "Использовать синоним пути".

Аватар пользователя Delewo Delewo 24 мая в 1:23

Еще уточнение. Это у меня блок в представлении. Нужно это все именно для этого блока. Блоков там 2, контекстный фильтр у нужного блока только один. Указывал ID блока также, бесполезно.

Аватар пользователя ivnish ivnish 25 мая в 8:14

Чтобы нейросети (и люди) давали правильный ответ, нужно очень подробно написать ТЗ. Напишите как сделать такие же вьюхи как у вас и вообще более подробно распишите ТЗ

Аватар пользователя Delewo Delewo 26 мая в 3:57
1

Да, я уже понял насчет подробного ТЗ) В итоге сделал чуть другим способом, нейросеть написала плагин для контекстного фильтра. И только после того, как составил подробное ТЗ с учетом всех нюансов и прочих моментов, которые встречались до этого.

Аватар пользователя kosskren kosskren 25 мая в 10:18

Может не тут хук используете? Если я правильно понимаю задачу, то вы хотите что бы вьюха вывела контент на основании обрезанного до последних 10 символов значения?

В таком случае вы можете изменить значение через хук hook_views_query_alter. Он вызывается на этапе, перед тем, как вьюха делает запрос в базу для получения данных. Подробнее про хук в офф. доках - ссылка

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

Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /