Вывести контент в зависимости от времени дня

Аватар пользователя svisch svisch 2 ноября 2020 в 19:55

Здравствуйте. На 8ке через вьюс вывожу некий контент. Надо сделать так, чтобы некоторый отображался только в определенное время дня, например с 14 до 16. Может кто сталкивался с подобной задачей?
Думал сделать поле время и в фильтрах задать условие фильтрации. Может там как то можно сравнить значение поля ноды с date() php или еще какой нибудь способ?

Комментарии

Аватар пользователя marassa marassa 2 ноября 2020 в 20:12

svisch wrote: Может там как то можно сравнить значение поля ноды с date() php

Это-то запросто - подставить волшебное слово now в качестве Value при настройке фильтра. Но я не очень понимаю как это решит проблему: сравнивать-то надо отдельно время дня, а не весь DateTime...

Аватар пользователя svisch svisch 2 ноября 2020 в 20:29

Все верно. А из now часы никак не вытащить? Чтоб потом сравнить его с цифровым полем, а не DateTime.

Аватар пользователя svisch svisch 2 ноября 2020 в 23:15

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

Аватар пользователя svisch svisch 3 ноября 2020 в 3:15

Сарказм? Я в курсе про функцию date(). Вопрос в том, как это применить в Drupal, а точнее в фильтре views, а не как написать php код.

Аватар пользователя Andruxa Andruxa 3 ноября 2020 в 10:38

Это ответ на вопрос

А из now часы никак не вытащить? Чтоб потом сравнить его с цифровым полем, а не DateTime.

Вот вам часы, сравнивайте.

Аватар пользователя svisch svisch 3 ноября 2020 в 17:53

Это то как раз и понятно. Мне не понятно где создать перменную $hours и как ее передать в фильтры views, чтобы там сравнивать с числовым полем.

Аватар пользователя nasferatu nasferatu 3 ноября 2020 в 9:28

Можно попробовать так - Глобальное поле Пользовательский текст, а там можно написать любую проверку, например,

{% if "now"|date("H:i") > field_time and "now"|date("H:i") < field_time1 %} {# Текущее время больше time, но меньше time1 #}
        {{ выводить нужные поля }}
{% else %}
        {{ либо ничего, либо другие поля }}
{% endif %}
Аватар пользователя svisch svisch 3 ноября 2020 в 17:51

Проверил на тестовом сайте ваш вариант - да он рабочий, но вернувшись к боевому сайту выяснилось, что в представлении у меня выводится сущность коммерца "Товар". Т.е. не получится добавить Глобальное поле -> Пользовательский текст Sad
Надо как то мудрить с Фильтрацией во вьюшке. Или как подсказывали выше с переменной. Но я так и не понял как и откуда ее передать в вьюс.

Аватар пользователя marassa marassa 3 ноября 2020 в 18:07

svisch wrote: Надо как то мудрить с Фильтрацией во вьюшке.

Ну если никто не знает как добиться искомого от функции PHP strtotime(), которая обрабатывает значение поля Value при настройке фильтра по дате, то остается имплементировать хук HOOK_views_query_alter(). Ничего там сложного нет.

Аватар пользователя svisch svisch 3 ноября 2020 в 18:25

Натыкался на него когда гуглил, но думал может есть какие-то другие решения. Спасибо вам и всем отписавшимся. Ушел читать документацию о данном хуке!

Аватар пользователя Andruxa Andruxa 3 ноября 2020 в 18:55

Я бы все-таки написал хендлер для вьюсового аргумента, значением по умолчанию у которого был бы текущий час.
В этом случае можно будет кешировать результаты вьюса в зависимости от аргумента (надо проверить, но должно работать).
И при вычислении текущего часа неплохо бы учитывать таймзону текущего пользователя, а то в Петропавловске-Камчатском полночь.

Аватар пользователя Andruxa Andruxa 3 ноября 2020 в 20:31

Тут или тут, например. Или посмотреть в коде самих вьюсов:
core/modules/views/src/Plugin/views/argument
core/modules/views/src/Plugin/views/argument_default

Возможно, в одном аргументе не удастся создать условие BETWEEN, тогда потребуется создать пару аргументов: один для условия больше чем значение по умолчанию, второй - меньше.