Здравствуйте!
Не могу понять, почему не срабатывает код. Сделал контекстный фильтр "Термин таксономии: Название", в необходимой части 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 не вариант, т.к. нужно в Критерии фильтрации передать именно название термина таксономии.
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Функция «Переопределить заголовок»предназначена исключительно для изменения визуального заголовка страницы или блока. Она меняет текст, который видят пользователи, но никак не влияет на само значение аргумента, которое передается в 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);
}
}
}
?>
(код на работоспособность не проверял)
ivnish, понял, попробовал создать модуль с помощью нейросети, но что-то глухо. Сейчас еще раз проверю, отпишусь.
Видел ваш код в уведомлении на почте. Там на 87% всё не правильно и нейросеть всё в кучу смешала (кони, люди). Это кто писал DeepSeek?
Уже кучу этих модулей перепробовал, созданные с помощью ИИ, и все нерабочие.
Вот последний:
1. Создал каталог в /modules. Назвал last10digits.
2. В каталоге /modules/last10digits создал файл lasts10digits.info.yml со следующим содержимым:
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 со следующим содержимым:
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 написал, этих сайтов куча, но я уже многое перепробовал, тут ИИ конкретно тупят, некоторые вообще сайт ломают. В целом ИИ мне много с кодом помогает, но тут вообще тупик какой-то, а задача элементарная по сути.
Ваш код также не сработал.
Пробовал еще от ИИ:
/**
* @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 и ставлю галочку "Использовать синоним пути".
Еще уточнение. Это у меня блок в представлении. Нужно это все именно для этого блока. Блоков там 2, контекстный фильтр у нужного блока только один. Указывал ID блока также, бесполезно.
Чтобы нейросети (и люди) давали правильный ответ, нужно очень подробно написать ТЗ. Напишите как сделать такие же вьюхи как у вас и вообще более подробно распишите ТЗ
Да, я уже понял насчет подробного ТЗ) В итоге сделал чуть другим способом, нейросеть написала плагин для контекстного фильтра. И только после того, как составил подробное ТЗ с учетом всех нюансов и прочих моментов, которые встречались до этого.
Может не тут хук используете? Если я правильно понимаю задачу, то вы хотите что бы вьюха вывела контент на основании обрезанного до последних 10 символов значения?
В таком случае вы можете изменить значение через хук hook_views_query_alter. Он вызывается на этапе, перед тем, как вьюха делает запрос в базу для получения данных. Подробнее про хук в офф. доках - ссылка
Еще напоминание совсем банальное, но может дело в кеше? Вьюхи хорошо кешируются и что бы исключить кеш, вам надо его отключить или после каждой правки в модуле, сбрасывать кеш в ручную.