Добро пожаловать на сайт SEDBY

Красивые даты с помощью Cotonti Siena

  • 122 просмотра +1
  • 7 января, 2026
  • Обновлено: 16 января, 2026
  • admin
  • Время чтения: 4 минуты
Красивые даты с помощью Cotonti Siena

В чате с одним из клиентов возник вопрос о красивом выводе дат в системе и о функциях для работы с датами, которые 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']),
]);

Проверим результат:

Результат применения функции cute_date() к колонке Last Logged списка аккаунтов
Результат применения функции cute_date() к колонке Last Logged списка аккаунтов

Как видим, снова ничего ничего сложного: мы написали короткую функцию для кастомизации даты, а Cotonti Siena позволила использовать ее в коде дистрибутива, не нарушая его целостности.

Хотите еще? Несколько дней назад мы кастомизировали установщик Cotonti.


Комментарии:
Аватар

Второй аргумент $levels надо указать 2

Аватар
  • 2. Виктор
  • 20.02.2026 18:41

Не совсем понял по cot_build_friendlynumber(). Вывожу average session duration от Яндкес Метики в секундах. В аргументе указываю

cot_build_friendlynumber($value['metrics'][4], ['60' => 'Minutes', '1' => 'Seconds']),

но получаю все в секундах.

Аватар

Давно взял за правило для каждого плагина определять формат даты в файле ресурсов или функций


Новый комментарий

Ваш комментарий будет доступен для редактирования 10 минут
Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость