Смена режима просмотра

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

Аватар пользователя N-I N-I 11 марта в 17:08

Помогите, пожалуйста.
У материала типа 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';
    }
  }
}
?>

Не работает. Что неправильно? Может ещё что-то нужно в этот модуль?
Или как мне сделать это переключение, какие-то есть ещё варианты?

Лучший ответ

Аватар пользователя marassa marassa 12 марта в 18:34

N-I wrote:
Нет, конечно) не обратила внимание. 10.2 версия.
А код у меня правильный?

Для 10.2 надо использовать старый хук entity_view_mode_alter и код "Before" из Вашей первой ссылки - там всего-то на одну проверку больше.

N-I wrote: Если зависит от кэша, то можно добавить в функцию очистить кэш ноды перед сменой просмотра? Есть такое?

В функцию можно добавлять всё что угодно, но оно не сработает если функция не вызывается, а она не будет вызываться, если ранее отрендеренный блок или страница будут браться из кэша)
Тут нужно или вообще запретить кэширование этого блока (дёшево и сердито, но замедлит отдачу этой страницы), либо, и это уже будет высший пилотаж, попытаться установить на этот блок или страницу время протухания кэша, равное field_date_expiration. Тогда до этой даты всем будет отдаваться закэшированная страница c вьюмодом full, а при наступлении этой даты кэш протухнет, при первом обращении сгенерируется новая страница с вьюмодом open, и дальше всем будет отдаваться уже она. Но это надо читать и разбираться с Cache API, я так с ходу не подскажу как это сделать и вообще возможно ли оно.
Я бы для начала просто отключил кэш чтоб оно уже заработало, а потом, при наличии свободного времени, и только если отключение кэша на этот блок или страницу приведет к заметным тормозам, начал бы пытаться реализовать идеальный вариант.

Комментарии

Аватар пользователя N-I N-I 12 марта в 16:05

Нет, конечно) не обратила внимание. 10.2 версия.
А код у меня правильный?
Если зависит от кэша, то можно добавить в функцию очистить кэш ноды перед сменой просмотра? Есть такое?
В ECA должно появиться в новой версии https://www.drupal.org/project/eca/issues/3413762
Но мне кажется ECA не сравнивает даты, потому что в логах у меня "условие не выполняется".

Аватар пользователя marassa marassa 12 марта в 9:02

PS И еще надо на режим кэширования посмотреть - если для страницы разрешено кэширование, и она уже закэшилась в своем прежнем виде, то никакой хук и вызываться не будет - просто возьмется готовый рендер из кэша.

Аватар пользователя VasyOK VasyOK 12 марта в 16:40

А через views вам не подходит? Выводим 2 режима просмотра (или набора полей), делаем все что надо скрытым. Потом поле создания мариала - тоже скрытое. И поле пользовательского текста с условием (думаю можно через Twig задать) если дата больше чем сейчас выводим одно, нет - другое.
Не скажу точную формулу, но почему бы нет?

Аватар пользователя N-I N-I 12 марта в 17:43

Думаю создать шаблон twig Layout Builder, передать в него переменную даты окончания и прописать в нём условие в зависимости от даты до или после выводить то, что нужно. Пока ещё не пробовала, только надумала.

Аватар пользователя N-I N-I 12 марта в 18:00

У меня несколько представлений уже вставляется в страницу, нужно будет во вьюсы вставлять ещё эти вьюсы с контекстами. Что-то сложно как-то) А так, в принципе, решение да.

Аватар пользователя marassa marassa 12 марта в 18:34

N-I wrote:
Нет, конечно) не обратила внимание. 10.2 версия.
А код у меня правильный?

Для 10.2 надо использовать старый хук entity_view_mode_alter и код "Before" из Вашей первой ссылки - там всего-то на одну проверку больше.

N-I wrote: Если зависит от кэша, то можно добавить в функцию очистить кэш ноды перед сменой просмотра? Есть такое?

В функцию можно добавлять всё что угодно, но оно не сработает если функция не вызывается, а она не будет вызываться, если ранее отрендеренный блок или страница будут браться из кэша)
Тут нужно или вообще запретить кэширование этого блока (дёшево и сердито, но замедлит отдачу этой страницы), либо, и это уже будет высший пилотаж, попытаться установить на этот блок или страницу время протухания кэша, равное field_date_expiration. Тогда до этой даты всем будет отдаваться закэшированная страница c вьюмодом full, а при наступлении этой даты кэш протухнет, при первом обращении сгенерируется новая страница с вьюмодом open, и дальше всем будет отдаваться уже она. Но это надо читать и разбираться с Cache API, я так с ходу не подскажу как это сделать и вообще возможно ли оно.
Я бы для начала просто отключил кэш чтоб оно уже заработало, а потом, при наличии свободного времени, и только если отключение кэша на этот блок или страницу приведет к заметным тормозам, начал бы пытаться реализовать идеальный вариант.