Помогите, пожалуйста.
У материала типа contest два режима просмотра full и open и поле с датой окончания.
Нужно сменить режим просмотра после наступления даты окончания.
Поле даты окончания field_date_expiration.
Страницы сделаны с помощью Layout Builder.
Я сделала модуль. 2 файла
view_mode_contest.info.yml
view_mode_contest.module
Вот это хук https://www.drupal.org/node/3410039
<?php
use Drupal\Core\Entity\EntityInterface;
/**
* Implements hook_node_view_mode_alter().
*/
function view_mode_contest_node_view_mode_alter(&$view_mode, \Drupal\Core\Entity\EntityInterface $entity) {
if ($entity->bundle() == 'contest') {
$date_expiration = $entity->get('field_date_expiration')->date->format('U');
$current_date = time();
if ($view_mode == 'full' && $current_date > $date_expiration) {
$view_mode = 'open';
}
}
}?>
Не работает. Что неправильно? Может ещё что-то нужно в этот модуль?
Или как мне сделать это переключение, какие-то есть ещё варианты?
Комментарии
А версия Drupal на сайте точно 10.3? Хук ведь только в версии 10.3 появился.
Нет, конечно) не обратила внимание. 10.2 версия.
А код у меня правильный?
Если зависит от кэша, то можно добавить в функцию очистить кэш ноды перед сменой просмотра? Есть такое?
В ECA должно появиться в новой версии https://www.drupal.org/project/eca/issues/3413762
Но мне кажется ECA не сравнивает даты, потому что в логах у меня "условие не выполняется".
PS И еще надо на режим кэширования посмотреть - если для страницы разрешено кэширование, и она уже закэшилась в своем прежнем виде, то никакой хук и вызываться не будет - просто возьмется готовый рендер из кэша.
А через views вам не подходит? Выводим 2 режима просмотра (или набора полей), делаем все что надо скрытым. Потом поле создания мариала - тоже скрытое. И поле пользовательского текста с условием (думаю можно через Twig задать) если дата больше чем сейчас выводим одно, нет - другое.
Не скажу точную формулу, но почему бы нет?
Думаю создать шаблон twig Layout Builder, передать в него переменную даты окончания и прописать в нём условие в зависимости от даты до или после выводить то, что нужно. Пока ещё не пробовала, только надумала.
У меня несколько представлений уже вставляется в страницу, нужно будет во вьюсы вставлять ещё эти вьюсы с контекстами. Что-то сложно как-то) А так, в принципе, решение да.
Для 10.2 надо использовать старый хук entity_view_mode_alter и код "Before" из Вашей первой ссылки - там всего-то на одну проверку больше.
В функцию можно добавлять всё что угодно, но оно не сработает если функция не вызывается, а она не будет вызываться, если ранее отрендеренный блок или страница будут браться из кэша)
Тут нужно или вообще запретить кэширование этого блока (дёшево и сердито, но замедлит отдачу этой страницы), либо, и это уже будет высший пилотаж, попытаться установить на этот блок или страницу время протухания кэша, равное field_date_expiration. Тогда до этой даты всем будет отдаваться закэшированная страница c вьюмодом full, а при наступлении этой даты кэш протухнет, при первом обращении сгенерируется новая страница с вьюмодом open, и дальше всем будет отдаваться уже она. Но это надо читать и разбираться с Cache API, я так с ходу не подскажу как это сделать и вообще возможно ли оно.
Я бы для начала просто отключил кэш чтоб оно уже заработало, а потом, при наличии свободного времени, и только если отключение кэша на этот блок или страницу приведет к заметным тормозам, начал бы пытаться реализовать идеальный вариант.
Спасибо, буду изучать)