Красивые даты с помощью Cotonti Siena
Популярные запросы: Open Graph, плагин Reading Time, тема Quebec, плагин Telegram, набор иконок Analogue
- 122 просмотра +1
- 7 января, 2026
- Обновлено: 16 января, 2026
- admin
- Время чтения: 4 минуты
В чате с одним из клиентов возник вопрос о красивом выводе дат в системе и о функциях для работы с датами, которые Cotonti Siena имеет в своем API. Прежде всего, это, конечно, популярная функция cot_date(). Использовать ее довольно просто:
$custom_date = cot_date('j F Y', $sys['now']);
Однако уже давно в файлах локализации Котонти присутствуют конфигурационные строки для дат:
$Ldt['date_full'] = 'd.m.Y'; $Ldt['date_medium'] = 'm.Y'; $Ldt['date_short'] = 'd.m'; $Ldt['date_text'] = 'd F Y'; $Ldt['date_fulltext'] = 'l, d F Y'; $Ldt['time_full'] = 'H:i:s'; $Ldt['time_medium'] = 'G:i'; $Ldt['time_short'] = 'i:s'; $Ldt['time_text'] = 'g:i A'; $Ldt['time_fulltext'] = 'g:i:s A'; $Ldt['datetime_full'] = 'd.m.Y H:i:s'; $Ldt['datetime_medium'] = 'd.m.Y H:i'; $Ldt['datetime_short'] = 'd.m H:i'; $Ldt['datetime_text'] = 'd F Y H:i'; $Ldt['datetime_fulltext'] = 'l, d F Y H:i'; $Ldt['week_full'] = 'o-\WW'; $Ldt['week_medium'] = '\WW'; $Ldt['week_short'] = '\WW-N'; $Ldt['week_text'] = '\WW, l'; $Ldt['week_fulltext'] = 'o-\WW, l';
С их помощью можно, не задумываясь применять форматы дат или создавать свои. Например:
$Ldt['date_custom'] = 'j F Y';
// ...
$custom_date = cot_date('date_custom', $sys['now']);
Кроме cot_date() в дистрибутиве Cotonti присутствуют функции по работе с часовыми поясами и три заслуживающие меньшее, но все же внимание функции:
cot_date2stamp()– конвертирует дату в UNIX timestamp,cot_stamp2date()– конвертирует UNIX timestamp в формат дат MySQL,cot_mktime()– создает UNIX timestamp из даты.
По большому счету, это функции-надстройки, обеспечивающие более удобную работу с mktime() и date().
Однако все интересное на этом не заканчивается: в API Cotonti Siena присутствует полезная, хотя и редко упоминаемая, функция cot_build_friendlynumber(), которая выводит числа в виде человекопонятных юнитов. Приведем простой пример:
echo cot_build_friendlynumber(5232, ['3600' => 'Hours', '60' => 'Minutes', '1' => 'Seconds'], 3); // Выведет 1 час 27 минут 12 секунд
Как видим, вариантов предостаточно – кроме $units и $levels можно использовать:
- $decimals для вывода десятичных знаков,
- $round для округлений,
- $smallestunit для выбора наименьшего юнита, после которого будет выводиться фраза “менее…”.
Применений cot_build_friendlynumber() можно найти немало. В дистрибутиве она применяется для формирования человекопонятных размеров файлов и дат. При этом в чистом виде она не используется: для удобства она встраивается в функции-надстройки, которые формируют, в том числе, красивые даты в модулях Page и Forums, а также в плагинах Comments, Recent Items и Whosonline с помощью готовых массивов юнитов. Одной из таких функций-надстроек является cot_build_timegap(). Как понятно из названия, она гибко формирует строковый вывод на основе разницы дат в форматах UNIX timestamp.
Например, с ее помощью можно вывести время последней авторизации пользователя в виде “XX дней XX часов назад”:
{USERS_ROW_LASTLOG_STAMP|cot_build_timegap($this)} {PHP.L.Ago}
Однако, после определенного предела такой формат становится неинформативным. Но ведь нам никто не мешает объединить два подхода в один. Предположим, до некоторого порога мы будем выводить дату-timegap, а далее – классическую дату. Наша функция примет два аргумента: дату события и порог:
if (!function_exists('cute_date')) {
function cute_date($date = null, $interval = 86400) {
///
}
}
Теперь сравним дату события с текущей датой и оформим вывод:
if (!function_exists('cute_date')) {
function cute_date($date = null, $interval = 86400) {
if (empty($date)) {
$out = Cot::$L['Never'];
} elseif ($date == Cot::$sys['now']) {
$out = Cot::$L['Now'];
} else {
if ((Cot::$sys['now'] - (int)$date) > $interval) {
$out = cot_date('d.m.y @ H:i', $date);
} else {
$out = cot_build_timegap($date) . ' ' . Cot::$L['Ago'];
}
}
return $out;
}
}
Теперь на протяжении 24 часов с даты события вывод будет сформирован в виде timegap (например, 8 часов 5 минут назад), а через 24 часа это будет обычная дата.
Конечно, без кейса мы не обойдемся и попробуем кастомизировать страницу со списком пользователей. Прежде всего, добавим в проектный плагин часть с хуком users.loop – чтобы добраться до регулярного блока:
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=users.loop
[END_COT_EXT]
==================== */
defined('COT_CODE') or die('Wrong URL');
Добавим новый TPL-тег с нашей функцией:
$t->assign([ 'USERS_ROW_LASTLOG_STAMP_PLUS' => cute_date($urr['user_lastlog']), ]);
Проверим результат:
Как видим, снова ничего ничего сложного: мы написали короткую функцию для кастомизации даты, а Cotonti Siena позволила использовать ее в коде дистрибутива, не нарушая его целостности.
Хотите еще? Несколько дней назад мы кастомизировали установщик Cotonti.
Второй аргумент
$levelsнадо указать 2Не совсем понял по
cot_build_friendlynumber(). Вывожу average session duration от Яндкес Метики в секундах. В аргументе указываюно получаю все в секундах.
Давно взял за правило для каждого плагина определять формат даты в файле ресурсов или функций
Новый комментарий
Ошибка
Выполнено