Фильтрация во Views по Date с помощью Global PHP (делаю календарь событий без учета года)

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

Аватар пользователя Pulcinella Pulcinella 30 июля 2017 в 15:23

Делаю календарь событий с помощью модуля Date, назначаю в типе материалов page в соответствующем Date поле field_events_date начальную и конечную дату события. Годы могут быть весьма разные (ибо история города), а вот отображать события через Views требуется по текущей дате, т.е. по дню и месяцу события без учета года. Ставлю Views PHP. Для проверки во Views в ПОЛЯ вначале ставлю сабжевую дату, а ниже - поле Global PHP, где в блоке Output code пишу следующее:


<?php
// Получаем текущий год и текущий порядковый номер дня в году
$now_year date('Y');
$now_nomber = (int) date('z') + 1;

// Получаем из БД значения начальной и конечной даты из поля даты события field_events_date
$start $data->field_field_events_date[0]['raw']['value'];
$finish $data->field_field_events_date[0]['raw']['value2'];

// Вытаскиваем из значений дат номер месяца и дня
$start_month substr($start,5,2);
$start_day substr($start,8,2);
$finish_month substr($finish,5,2);
$finish_day substr($finish,8,2);

// Формируем начальную и конечную дату по формату даты, но уже с текущим годом
$start_date $now_year '-' $start_month '-' $start_day ' 00:00:00';
$finish_date $now_year '-' $finish_month '-' $finish_day ' 00:00:00';

// Вычисляем порядковые номера дня в году для этих дат
$start_number = (int) date('z'strtotime($start_date)) + 1;
$finish_number = (int) date('z'strtotime($finish_date)) + 1;

// Отбираем события по попаданию текущего номера дна между номерами дней дат
if ($now_nomber >= $start_number && $now_nomber <= $finish_number) {
   
$condition_event 'Активный';
   
$date_event TRUE;
} else {
   
$condition_event 'Не активный';
   
$date_event FALSE;
}
echo 
'<div class="condition-event">'.$condition_event.'</div>';
?>

Код работает как нужно. Ок! Но теперь-то надо отфильтровать материалы. Копи-пастю код в КРИТЕРИИ ФИЛЬТРАЦИИ по Global PHP, вместо $date_event = TRUE ставлю return TRUE и вот тут ожидает облом:

Notice: Undefined property: stdClass::$field_field_events_date in __lambda_func()

Т.е. Views ФИЛЬТР не понимает путь к значению, в то время как Views ПОЛЯ понимает. Замечу, что ДОСТУПНЫЕ ПЕРЕМЕННЫЕ и там и там одинаковые. В чем дело? Посоветуйте, пожалуйста, как выставить нужный путь для фильтра.

Да, с темой Как отфильтровать ноды по дате без учета года с помощью Views в Drupal 7? знаком, но Хочется помучиться (С).

Комментарии

Аватар пользователя Pulcinella Pulcinella 2 сентября 2017 в 20:14

Чего-то я ступил капитально - пора лечиться электричеством... Зачем мне вообще фильтр, если я и так могу вывести в поле Global PHP в output строго по TRUE всё, что мне нужно по изложенному коду, заранее добавив выше этого поля нужные скрытые поля. А при попадании под FALSE вообще ничего не выводить.

Аватар пользователя Pulcinella Pulcinella 18 сентября 2017 в 10:42

Quote:

То есть Вы хотите, чтоб разработчики после Вас тоже мучались?

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

Именно так я в итоге и сделал, когда всё стало ясно.