Сниппет dateAgo

У MODX Revolution есть 2 встроенных фильтра обработки дат: ago и fuzzydate. Первый выводит сколько прошло времени от указанной даты, а второй — тоже самое, но с указанием «сегодня», «вчера».

К сожалению, эти фильтры плохо работают с русским языком, и их нельзя использовать одновременно. Поэтому, я перенес логику форматирования дат из LiveStreet CMS.

Смысл в том, что вы указываете, на протяжении скольких:
— секунд дата считается «Только что»
— минут дата выводится «n минут назад»
— часов дата выводится «n часов назад»

Если дата не подпадает в эти рамки, она будет выведена как «число месяц год, час: мин». Также, по умолчанию, включен вывод конструкций «Сегодня в 13:15», «Вчера в 22:55».

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

Сравнительная таблица работы моего сниппета и родных фильтров MODX.


Параметры и примеры можно посмотреть на странице документации.

Следующая заметка
Tickets 0.8.0 \ 0.8.1 beta


Комментарии ()

  1. Алексей 30 декабря 2012, 12:29 # 0
    Отлично! Успел поставить уже! Сразу же вопрос, иногда бывает, что если событие случилось давно, скажем месяц назад, то время показывать не нужно, даты достаточно. В сравнительной таблице это 3 последние строки. Можно там выключить время?
    1. Василий Наумкин 30 декабря 2012, 14:52 # 0
      Смотри параметр dateFormat.
    2. Иван Климчук 30 декабря 2012, 16:06 # 0
      С русским языком в форматах дат помогает включение правильной локали, но там поддерживается только именительный падеж у месяцев. Что ни разу не приятно. Склонять приходится все равно вручную. Так что за фильтр спасибо, полезная штука.
      1. Denys Butenko 03 января 2013, 01:13 # 0
        momentjs.com
        интересная js-библиотека для работы с датами)
        1. Василий Наумкин 03 января 2013, 09:45 # 0
          Можно пример вызова, чтобы даты были такие же, как у dateAgo на картинке?
          1. Denys Butenko 03 января 2013, 23:54 # 0
            Я не говорю, что momentjs заменяет dateAgo, я говорю, что можно совместить для большей интерактивности. Чтобы дата менялась в реальном времени.
        2. Пётр Молчанов 10 января 2013, 12:30 # 0
          Нашел опечатку — «04 сенятбря 2012». Где править этот «сенятбря»?))
          1. Василий Наумкин 10 января 2013, 14:08 # 0
            В словарях системы.

            В новой версии поправлю, спасибо!
          2. Пётр Молчанов 12 января 2013, 12:17 # 0
            А как бы связать это с кешированным сниппетом? Например, у меня есть на главной сниппет вывода последних 3х новостей, который кешируется (новости не часто появляются). Хочу там использовать твой сниппет, но получается так, что N минут назад зависает надолго, т.е. до очистки кеша)))) Выводить сниппет некешированным — единственный вариант?
            1. Василий Наумкин 12 января 2013, 13:11 # 0
              Ну а как?

              Если сниппет кэширован — он не выполняется, в этом и смысл кэша.

              Вызывай некэшированным, он очень быстрый.
            2. Степан Прищепенко 16 мая 2013, 12:38 # 0
              Василий, обнови пакет в репозитории, а то на гитхабе немецкий товарисч все правильно исправил. Сам занимался тем же самым, а после увидел его исправления, действительно без этого локаль не работает!
              1. Василий Наумкин 16 мая 2013, 14:10 # 0
                А я то думаю, чем бы заняться?

                Не хочешь собрать пакет, протестировать и показать что всё работает без багов на 3х языках? Как сделаешь — я проверю и обновлю, окей?
                1. Степан Прищепенко 16 мая 2013, 17:37 # 0
                  :) хорошо, если появится времечко сделаю и сообщу.
                  1. Степан Прищепенко 21 мая 2013, 21:56 # 0
                    собрал, проверил, нужно править, чувак зачем то удалил работу с месяцами, поэтому, если сделать вывод вот таким:
                    $month_arr = $modx->fromJSON($modx->lexicon('da_months'));
                    $m = date("n", $date);
                    $month = $month_arr[$m - 1];
                    $format = preg_replace("~(?<!\\\\)F~U",preg_replace('~(\w{1})~u','\\\${1}',$month),$dateFormat);
                    return strftime($format ,$date);
                    то все становится «почти» нормальным. Только способ вывода уже меняется и становится комбинированным, например:
                    [[+tv.event_date:dateAgo=`{"dateFormat":"<b>%d F</b>
                     %A, %H:%M","dateNow":"0","dateMinutes":"0","dateHours":"0","dateDay":"0"}`]]
                    что с эстетической точки зрения не совсем правильно выглядит как мне кажется, но зато работает на всех локалях.
                    1. Василий Наумкин 22 мая 2013, 06:22 # 0
                      А что вообще за проблема с локалями, почему у меня все работает без заморочек?

                      Ну и на всякий случай — код взят из Live Street CMS, там тоже, вроде, никто не жаловался.
                      1. Степан Прищепенко 23 мая 2013, 11:53 # 0
                        ну предположим понадобилось вывести полное наименование дня недели, так как у тебя используется функция date(), то мы должны вызывать {«dateFormat»:«l»}, что даст на выходе к примеру «THURSDAY», так как date выводит дату только на англ. В исправленном варианте используется strftime(), но тогда вызов дня недели должен быть как: {«dateFormat»:"%A"}. Конечно можно решить это все и другим путем через лексикон к примеру или вызывать отдельно еще один фильтр.
                2. Сергей Щерба 25 января 2014, 19:01 # 0
                  А есть возможность убрать время и оставить только «02 января 2014»?
                  1. Василий Наумкин 25 января 2014, 19:09 # 0
                    Посмотри в параметры сниппета.
                  Добавление новых комментариев отключено.