Размер шрифта
Цвет фона и шрифта
Изображения
Озвучивание текста
Обычная версия сайта
Создание и поддержка сайтов web-aim.ru
Готовое решение для создания
корпоративного сайта
8 800 201-07-68
8 800 201-07-68
Заказать звонок
E-mail
hello@web-aim.ru
Написать нам
Услуги
  • Сайт
    • Интернет-магазин с индивидуальным дизайном
    • Интернет-магазин на шаблоне
    • Корпоративный сайт на шаблоне
    • Корпоративный сайт с индивидуальным дизайном
    • Личный кабинет
  • Поддержка и развитие
    • Интеграция Битрикс24
    • Интеграция с 1С
    • Интеграция с МойСклад
    • Технология: композитный сайт
    • Техподдержка
  • CRM
    • Интернет-магазин + CRM
    • Коробочная версия Битрикс24.CRM
Портфолио
  • CRM
  • Интернет-магазин
  • Корпоративные сайты
  • Техподдержка
О нас
  • О Компании
  • Работа в WEB-AiM
  • Партнеры
  • Новости
  • Мероприятия
  • Сертификаты
  • Как мы работаем
  • Отзывы
  • Реквизиты
Блог
Контакты
Партнерская программа
8 800 201-07-68
8 800 201-07-68
Заказать звонок
E-mail
hello@web-aim.ru
Заказать звонок
Создание и поддержка сайтов web-aim.ru
Услуги
  • Сайт
    Сайт
    • Интернет-магазин с индивидуальным дизайном
    • Интернет-магазин на шаблоне
    • Корпоративный сайт на шаблоне
    • Корпоративный сайт с индивидуальным дизайном
    • Личный кабинет
  • Поддержка и развитие
    Поддержка и развитие
    • Интеграция Битрикс24
    • Интеграция с 1С
    • Интеграция с МойСклад
    • Технология: композитный сайт
    • Техподдержка
  • CRM
    CRM
    • Интернет-магазин + CRM
    • Коробочная версия Битрикс24.CRM
Портфолио
  • CRM
  • Интернет-магазин
  • Корпоративные сайты
  • Техподдержка
О нас
  • О Компании
  • Работа в WEB-AiM
  • Партнеры
  • Новости
  • Мероприятия
  • Сертификаты
  • Как мы работаем
  • Отзывы
  • Реквизиты
Блог
Контакты
Партнерская программа
Написать нам
    Создание и поддержка сайтов web-aim.ru
    Услуги
    • Сайт
      Сайт
      • Интернет-магазин с индивидуальным дизайном
      • Интернет-магазин на шаблоне
      • Корпоративный сайт на шаблоне
      • Корпоративный сайт с индивидуальным дизайном
      • Личный кабинет
    • Поддержка и развитие
      Поддержка и развитие
      • Интеграция Битрикс24
      • Интеграция с 1С
      • Интеграция с МойСклад
      • Технология: композитный сайт
      • Техподдержка
    • CRM
      CRM
      • Интернет-магазин + CRM
      • Коробочная версия Битрикс24.CRM
    Портфолио
    • CRM
    • Интернет-магазин
    • Корпоративные сайты
    • Техподдержка
    О нас
    • О Компании
    • Работа в WEB-AiM
    • Партнеры
    • Новости
    • Мероприятия
    • Сертификаты
    • Как мы работаем
    • Отзывы
    • Реквизиты
    Блог
    Контакты
    Партнерская программа
      8 800 201-07-68
      Заказать звонок
      E-mail
      hello@web-aim.ru
      Написать нам
      Создание и поддержка сайтов web-aim.ru
      Телефоны
      8 800 201-07-68
      Заказать звонок
      Создание и поддержка сайтов web-aim.ru
      • Услуги
        • Услуги
        • Сайт
          • Сайт
          • Интернет-магазин с индивидуальным дизайном
          • Интернет-магазин на шаблоне
          • Корпоративный сайт на шаблоне
          • Корпоративный сайт с индивидуальным дизайном
          • Личный кабинет
        • Поддержка и развитие
          • Поддержка и развитие
          • Интеграция Битрикс24
          • Интеграция с 1С
          • Интеграция с МойСклад
          • Технология: композитный сайт
          • Техподдержка
        • CRM
          • CRM
          • Интернет-магазин + CRM
          • Коробочная версия Битрикс24.CRM
      • Портфолио
        • Портфолио
        • CRM
        • Интернет-магазин
        • Корпоративные сайты
        • Техподдержка
      • О нас
        • О нас
        • О Компании
        • Работа в WEB-AiM
        • Партнеры
        • Новости
        • Мероприятия
        • Сертификаты
        • Как мы работаем
        • Отзывы
        • Реквизиты
      • Блог
      • Контакты
      • Партнерская программа
      Написать нам
      • 8 800 201-07-68
        • Телефоны
        • 8 800 201-07-68
        • Заказать звонок
      • hello@web-aim.ru

      Как я нашел вчерашний день в Битрикс

      Главная
      —
      Статьи
      —
      Ценные советы
      —Как я нашел вчерашний день в Битрикс
      Ценные советы
      26 декабря 2019
      Появилась задача – отобразить события с фильтром не только конкретного года, но и месяца.

      Поясню: есть календарь некоторых знаменательных или круглых дат. Составляется он на несколько лет. События имеют вид "16 января 2017 года День ледовара – 116 лет со дня рождения американского инженера Фрэнк Замбони, который изобрел ресурфейсер – ледовый комбайн для восстановления льда на катках". Дата начала события, как правило, задается контент-менеджером, и время ему прописывать незачем, оно ставится по умолчанию в 00:00

      "Из коробки" фильтр новостей предлагает выборку по годам. Надо было добавить внутри годов еще и месяцы. Вот тут началось самое интересное. С годами-то оно всё просто: есть первый день года 01.01.YYYY и есть последний день 31.12.YYYY и каждый год одно и то же. Для лучшей выборки надо бы еще время прописать, потому что по-умолчанию оно 00:00.

      Всё же настало время вставить немного кода: Изначально у ASPRO фильтрация по годам реализована следующим образом:

      map $http_referer $frame_options {
          "~webvisor.com" "ALLOW-FROM http://webvisor.com";
          default "SAMEORIGIN";
      }
       if($bHasYear)// переменная хранит в себе TRUE/FALSE в зависимости от того, задан ли у новости год. { $GLOBALS[$arParams["FILTER_NAME"]][">DATE_ACTIVE_FROM"] = ConvertDateTime("31.12.".($year-1), FORMAT_DATETIME); $GLOBALS[$arParams["FILTER_NAME"]]["<=DATE_ACTIVE_FROM"] = ConvertDateTime("31.12.".$year, FORMAT_DATETIME); }?> в $arParams добавляются данные, которые позже используются для выборки нужных элементов. 
      

      Обратите внимание на DATE_ACTIVE_FROM и DATE_ACTIVE_FROM. Символы перед ним – это знаки сравнения. Они определяют включение заданных диапазонов дат. С ними надо быть внимательным, а то результат на пограничных датах может оказаться неверным.

      В данном случае нам предлагается при выборе конкретного года отобразить
      события с 31.12.ПРЕДЫДУЩЕГО_ВЫБРАННОГО_ГОДА не включительно, по 31.12.ВЫБРАННОГО_ГОДА.

      Всё бы ничего, но если мы используем время, то 31.12.ПРЕДЫДУЩЕГО_ВЫБРАННОГО_ГОДА 00:01 (это время) оно уже подходит и оно попадет в выборку, хоть и является прошлогодним.

      Такая же участь ждет все события, которые произошли 31.12.ВЫБРАННОГО_ГОДА, которые по времени хоть на одну минуту старше начала этого дня.

      Не порядок. Надо уточнять.

      map $http_referer $frame_options {
          "~webvisor.com" "ALLOW-FROM http://webvisor.com";
          default "SAMEORIGIN";
      }
       if($bHasYear){ 
      $GLOBALS[$arParams["FILTER_NAME"]][">=DATE_ACTIVE_FROM"] = ConvertDateTime("01.01.".($year)." 00:00:00", FORMAT_DATETIME);
      $GLOBALS[$arParams["FILTER_NAME"]]["<=DATE_ACTIVE_FROM"] = ConvertDateTime("31.12.".($year)." 23:59:59", FORMAT_DATETIME);
      }

      Так получается сильно точнее.

      Но остается проблема с месяцами. Если бы в каждом было 30 дней, по аналогичной схеме уточняем фильтр и всё. Но реальность сурова. У всех двенадцати месяцев вразнобой последнее число и еще февраль есть... иногда високосный...

      Можно было бы написать тут "вечный календарь" и брать из него данные по последнему числу месяца, но это слишком.

      Функция Битрикса ConvertDateTime не обладает богатым функционалом. Но у неё оказался скрытый потенциал.

      Оказывается, если ей предложить на входе 33 марта 2017 года, то на выходе это будет 2 апреля 2017.
      "Ух-ты!" – подумал я, просто ради эксперимента попробовав что-то подобное. А мне же надо найти вчерашний день!

      Оказывается, функция неплохо понимает "нулевое марта" и возвращает последнее число февраля! "Нулевое января" будет предыдущим днем с годом и всеми атрибутами :)

      В итоге получился вот такой код:

      map $http_referer $frame_options {
          "~webvisor.com" "ALLOW-FROM http://webvisor.com";
          default "SAMEORIGIN";
      }
       if($bHasYear){ // переменная хранит в себе TRUE/FALSE в зависимости от того, задан ли у новости год.
      $GLOBALS[$arParams["FILTER_NAME"]][">DATE_ACTIVE_FROM"] = ConvertDateTime("31.12.".($year-1)." 23:59:59", FORMAT_DATETIME);
      $GLOBALS[$arParams["FILTER_NAME"]]["<=DATE_ACTIVE_FROM"] = ConvertDateTime("00.01.".($year+1)." 23:59:59", FORMAT_DATETIME);
      //здесь мы для фильтра загружаем $arParams
      }
      if($bHasMonth) // переменная хранит в себе TRUE/FALSE в зависимости от того, задан ли у новости месяц
      {
      //Если у нас есть и месяц - затираем предыдущие данные и записываем более точные.
      $GLOBALS[$arParams["FILTER_NAME"]][">DATE_ACTIVE_FROM"] = ConvertDateTime("00.".($month).".".($year)." 23:59:59", FORMAT_DATETIME);
      $GLOBALS[$arParams["FILTER_NAME"]][" }

      ConvertDateTime("00.".($month).".".($year)." 23:59:59", FORMAT_DATETIME); возвращает нас на одну секунду назад от интересующего нас события.

      Мы берем всё, что больше полученного значения.

      Я понимаю, что можно было бы просто сделать вот так:

      map $http_referer $frame_options {
          "~webvisor.com" "ALLOW-FROM http://webvisor.com";
          default "SAMEORIGIN";
      }
       $GLOBALS[$arParams["FILTER_NAME"]][">=DATE_ACTIVE_FROM"] = ConvertDateTime("01.".($month).".".($year)." 00:00:00", FORMAT_DATETIME);

      Но тогда никто бы не узнал о такой занятной способности ConvertDateTime как "нулевое января".


      Программист Сергей, WEB-AiM
      Назад к списку
      • Кейс 15
      • Аудит 9
      • Битрикс24 28
      • Маркетинг 37
      • Ценные советы 20
      8 800 201-07-68
      8 800 201-07-68
      Заказать звонок
      E-mail
      hello@web-aim.ru
      Заказать звонок
      hello@web-aim.ru
      © 2023 WEB-AiM
      Политика конфиденциальности This site is protected by reCAPTCHA and the Google Privacy Policy Terms of Service
      Подписаться на рассылку