В версии 0.4 значительно улучшены возможности по работе с датами. Ввиду большого числа писем по этому поводу, опишу здесь основные моменты и правила пользования новыми параметрами форматирования дат:
0. Вступление.
За оформление даты в Smarty-шаблоне отвечает тот же, что и раньше, smarty-тег {date_format}. Тег требует только один обязательный параметр 'date' — собственно дата. Простейший вариант вывода:
{date_format date=$oTopic->getDateAdd()}
в результате получаем самый обычный:
10 декабря 2009, 00:35
Информация для разработчиков: date_format работает теперь не через функцию в function.php, а через специально написанный для движка smarty-плагин.
1. Многоязычность и поддержка нескольких форм склонений в названиях месяцев.
Названия месяцев задаются в lang-файле (по умолчанию russian.php) в виде двухмерного массива. Для каждого месяца можно указывать произвольное число склонений. Например,
По умолчанию, будет использовано второе склонение, если нужно другое, его индекс нужно указать с помощью параметра «declination». В совокупности с параметром «format», вы можете поменять вывод даты, например на такой:
Параметр 'format' работает также, как описано здесь, за исключением того, что F (полнотекстовое название месяца) будет заменено на нужный язык и выбранное склонение.
2. «Вчера», «Сегодня», «Завтра».
Дополнительный параметр 'day' дает возможность выводить сообщения такого типа:
(day подставляется из lang-файла, согласно временному соответствию — «Вчера в », «Сегодня в», «Завтра в»).
'day' является «параметром-надстройкой» и никак не влияет на основное значение формата. Т.е. если ваша запись была сделана позавчера, то дата будет отформатирована согласно 'format' (или по-умолчанию, если таковой не передан).
3. Только что.
Для того, чтобы указать вместо конкретного значения даты такое:
Только что
Нужно добавить в тег параметр 'now'. Значение now указывает на количество секунд, в течение которых дата будет считаться только что произошедшей.
{date_format date=$oTopic->getDateAdd() now="60"}
Такое правило форматирования будет помечать топик «Только что» в течении 1 минуты с момента написания.
4. Обратный отсчет.
Доступны два режима обратного отсчета: "__ минут назад" и "__ часов назад". Для получения такого эффекта в отображении даты необходимо использовать параметры 'minutes_back' и 'hours_back' соответственно. При этом будет выведено что-то в стиле:
142 минуты назад
или
2 часа назад
'minutes_back' указывается в минутах, 'hours_back' в часах. Параметры работают независимо друг от друга. Плагин самостоятельно следит за склонением существительных «минута», «час» (настройки задаются через lang-файл).
5. Подведем итоги.
Формат типа
{date_format date=$oTopic->getDateAdd() hours_back="12" minutes_back="60" now="60" day="day H:i" format="d F Y, H:i"}
будет 1 минуту отображаться как «Только что», в течении часа как "__ минут назад", в течении 12 часов как "__ часов назад", после 12 часов до окончания 2х суток будет смотреться как «Сегодня в часы: минуты» \ «Вчера в часы: минуты», в остальное время будет отображен как и стандартная дата LS.
Экспериментируйте! Пожелания, баги — милости прошу в комментарии.
18 комментариев
«То, что доктор прописал» (с)
Огромное спасибо Вам, за такие даты!!!
В SVN версии все готово, там ничего доделывать не нужно.
Для использования в 0.3.1 перетянуть соответствующие куски Lang файла, два смарти-плагина (date_format, declention), отключить во Viewer`e определение smarty-функции date_format, обновить модуль LsLang (туда тоже добавлены некоторые новые возможности, которые используются данным плагином)…
И, кажется, все. Хотя мог что-то упустить из виду.
Ссылаясь на документацию Smarty по работе с датами, хотелось бы задать такой вопрос: будет ли в движке в шаблоны передаваться именно timestamp (unix time), а не mysql-строка, содержащая информацию о дате и времени? Возникла необходимость сравнить в шаблоне две даты и как-то на результат сравнения среагировать. Smarty дату в формате юникс-тайм нормально должен обработать модификатором date_format, а вот date_rus из коробки выдаёт 1970 год.
Подправить под себя я могу, но хотелось бы, чтобы в движке всё красиво было по дефолту.
mysql-строка, содержащая информацию о дате и времени
Что за mysql-срока? В параметр date во всех шаблонах передается дата в формате, стандартном для сущностей: «Y-m-d, H:i:s». Но плагин прекрасно понимает и timestamp.
Вот этого замечания тоже не понял:
чтобы в движке всё красиво было по дефолту
Плагин date_format специально разработан для этого движка, чтобы пользователи могли сделать дату так, как они сами считаю красивым. Если вам кажется, что удобнее пользоваться нативными smarty-средствами, пожалуйста, пользуйтесь. Но кто сказал, что это будет красивше?
Из чтения документации mysql, я понял, что даты там хранятся не в unix-time, а в каком-то таком виде
'0000-00-00 00:00:00'
. Ну и напрямую сравнить например
{$oTopic->getDateAdd()}
и
{$smarty.now}
нельзя.
Но плагин прекрасно понимает и timestamp
Гм. Посмотрю внимательней. Но при попытке скормить ему результат функции strtotime() я получил 1 января 1970 года. Обновлю этот момент до версии из транка.
Вот этого замечания тоже не понял
А это был не на date_format наезд, а на такие конструкции
This allows template designers to use the date_format modifier for full control over date formatting, and also makes it easy to compare dates if necessary.
Вот о чём я.
Я бы предложил сделать везде вот так:
public function getDate() {
return strtotime($this->_aData['date']);
}
и сеттеры соответственно изменить.
Плагин date_format специально разработан для этого движка
а как можно перевести часы на всем сайте? сервер в америке и отсчет рвемени идет от них, для рунета все посты идут из прошлого.
если есть возможность исправить время — ткните носом. спасибо.
18 комментариев
Огромное спасибо Вам, за такие даты!!!
А в этот раз предусмотрено изменение времени по часовым поясам?
Для использования в 0.3.1 перетянуть соответствующие куски Lang файла, два смарти-плагина (date_format, declention), отключить во Viewer`e определение smarty-функции date_format, обновить модуль LsLang (туда тоже добавлены некоторые новые возможности, которые используются данным плагином)…
И, кажется, все. Хотя мог что-то упустить из виду.
Подправить под себя я могу, но хотелось бы, чтобы в движке всё красиво было по дефолту.
Спасибо.
Что за mysql-срока? В параметр date во всех шаблонах передается дата в формате, стандартном для сущностей: «Y-m-d, H:i:s». Но плагин прекрасно понимает и timestamp.
Вот этого замечания тоже не понял:
Плагин date_format специально разработан для этого движка, чтобы пользователи могли сделать дату так, как они сами считаю красивым. Если вам кажется, что удобнее пользоваться нативными smarty-средствами, пожалуйста, пользуйтесь. Но кто сказал, что это будет красивше?
А это был не на date_format наезд, а на такие конструкции в шаблоне.
Я бы предложил сделать везде вот так: и сеттеры соответственно изменить.
То есть, это не из стандартной поставки Smarty?
если есть возможность исправить время — ткните носом. спасибо.