Раскрытый фильтр по дате в Drupal 8: прошедшие/текущие/будущие события

На одном из сайтов на Drupal 8 потребовалось выводить список различных культурных мероприятий города (выставки/концерты/конкурсы/и т.д.). Список выводится с помощью модуля Views. У мероприятия есть два поля типа «Дата»: начало мероприятия и конец мероприятия. Используя эти поля, нужно было сделать фильтрацию по текущим/прошлым/предстоящим событиям. Стандартной возможности реализовать такое через Exposed Filters по полям «Дата» я не обнаружил, так что пришлось изобретать свой велосипед.
Для начала к нужным материалам добавил поле «Время» тип «Список» и задал ему значения «Прошедший», «Текущий», «Будущий», и срыл его в hook_form_alter() (сначала это было поле на ссылку термина, но тогда к SQL-запросу добавлялись таблицы словарей через JOIN, что мне не нужно). Затем в фильтрах добавил фильтр «Начало» не пусто и «Конец» не пусто, чтобы в запрос добавились эти поля (лень было разбираться с addField() :)). Ну, наконец, и сам код:

function mymodule_views_query_alter($view, $query) {
 
  if($view->id() == "konkursy_i_vystavki")
  {
    //Скинем все условия фильтра времени
      foreach ($query->where as &$condition_group) {
        unset($condition_group["conditions"][2]);
      }
    //Добавим заного
    $group = $query->setWhereGroup($type = 'OR');
    //Прошедший
    if($view->exposed_raw_input['field_vrema_value'][1] == "1")
    {
      $query->addWhere($group, "node__field_konec.field_konec_value", date('Y-m-d') , '< ' );
    }
    //Будущий
    if($view->exposed_raw_input['field_vrema_value'][3] == "3")
    {
      $query->addWhere($group, "node__field_nacalo.field_nacalo_value", date('Y-m-d') , '>' );
    }
    //Текущий
    if($view->exposed_raw_input['field_vrema_value'][2] == "2")
    {
      $query->addWhereExpression($group, "node__field_nacalo.field_nacalo_value < = '".date('Y-m-d')."'  AND node__field_konec.field_konec_value > '".date('Y-m-d')."'");
    }
  }
}

Так как фильтр времени может иметь множественные значения, я определил его в отдельную группу: $group = $query->setWhereGroup($type = ‘OR’); — все условия, добавленные в эту группу, будут объединятся условием OR. Грубо говоря, если отметить все чекбоксы, то условие будет выглядеть так: прошедший OR текущий OR будущий. Однако у значения «Текущий» есть два условия, которые должны выполнятся (дата начала текущая дата начала в прошлом И дата конца сегодня или в будущем). Поэтому эти условия я определил не через addWhere, а через addWhereExpression(), позволяющую задавать комплексные условия.

17 комментариев

  1. В данном разделе: тренажеры на сведение/разведение/сгибание/разгибание ног, комбинированные тяги, баттерфляй, мультистанции и другие.Бубновского надежный помощник для тех, кто уже знаком с его уникальной методикой оздоровления организма человека в целом через лечение и совершенствование опорно-двигательного аппарата, но по тем или иным причинам не может регулярно посещать специализированные Центры Кинезитерапии с авторскими тренажерами.Закрепите фиксатор выше уровня головы.Производитель: ООО «СБОРСПЕЦМОНТАЖ»Лягте на спину головой к фиксатору.
    Кинезотерапия тренажеры бубновский супер акция от легендарного завода-производителя реабилитационных тренажеров для лечения остеохандроза . Производитель спорттоваров Happykiddi.com.ua доставку осуществляет к Вам домой по всей Украине : Днепр , Запорожье , Луцк , Николаев , Сумы , Херсон, Черкассы курьерской компанией Мист-экспресс или транспортом завода без предоплаты в течении 1-3 дней после заказа. Стоимость доставки 325 грн.

  2. Автор разработал множество методик, каждая из которых предназначена для определенной возрастной группы.Плывем прямыми руками вперед, а потом назад.Упражнение сложное выполняйте столько сколько сможете.Первое упражнение заключается в следующем.Тренажер состоит из платформы, эластичных лент, экспандеров, гимнастических мячей, флексбаров, тренажеров баланса.
    Блочные тренажеры от бубновского лучшие скидки от популярного завода спортивных тренажеров для взрослых . Производитель тренажеров и аксессуаров для лечение кинезитерапией Спортхеппи доставку осуществляет к Вам домой по всей Украине : Днепр , Запорожье , Луцк , Николаев , Ровно , Харьков , Хмельницкий курьерской компанией Гюнсел или транспортом завода без предоплаты в течении 3-4 дней после заказа. Стоимость доставки 325 грн.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *