Раскрытый фильтр по дате в 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(), позволяющую задавать комплексные условия.

41 комментарий

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

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

  3. Mostbet app allows you to play popular online casino games.
    The betting and casino site is licensed from Curacao. It is very convenient to use the
    site of the Mostbet bookmaker, but you will not be able to bet on a regular basis while
    sitting at the computer. Players can also use their mobile devices to access the website.
    The most popular slot machines are also available on the Mostbet
    website. With such a large variety, players are sure to find something they enjoy.
    The official Mostbet website is a great place to find high
    odds and other casino games. These impressive numbers prove that MostBet is a
    reliable online on line casino and sportsbook
    platform. While most sportsbook websites have the same high odds, Mostbet has a unique set of advantages that make them worth trying out.

    You can also register through the mobile application (the procedure for creating an account is the same).
    The Mostbet app allows you to bet on multiple sports and games
    at the same time. Multiple types of gambling option are available.

  4. [U — Обмен опытом. Общие технические РІРѕРїСЂРѕСЃС‹. Обсуждение новостей РІ РјРёСЂРµ авто.[/U — [URL=https://saabclub.xf2.site/index.php?forums/900-9-3.19/ — Автовладельцы Saab[/URL — [B — Выбор SAAB.[/B —

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

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