Вывод дат в шаблонах Cotonti (Форматы и примеры в тегах)
Данная статья систематизирует и расширяет существующую документацию управления отображением дат и времени в шаблонах, дополняя её практическими примерами, рекомендациями и пояснениями.
Вывод дат в шаблонах Cotonti
Настройка формата отображения: локально и глобально
В системе Cotonti все даты внутри базы данных хранятся в формате UNIX timestamp — это целое число секунд, прошедших с 1 января 1970 года 00:00:00 (UTC).
Такой формат удобен для:
- хранения,
- сравнения,
- сортировки,
- фильтрации,
- расчётов,
- работы с часовыми поясами.
Однако пользователю необходимо видеть дату в человеко-читаемом виде.
За преобразование timestamp → текст отвечает функция-обёртка cot_date().
Данная статья систематизирует и расширяет существующую документацию, дополняя её практическими примерами, рекомендациями и пояснениями.
1. Два способа управления форматом вывода
Формат отображения даты в Cotonti можно изменить:
- Локально — непосредственно в шаблоне (для конкретного места вывода).
- Глобально — через языковые файлы системы.
Рассмотрим оба варианта подробно.
2. Локальная настройка формата в шаблоне
2.1 Базовый принцип
Допустим, в шаблоне используется тег:
{PAGE_ROW_DATE_STAMP}
Он содержит UNIX-временную метку, например:
1704948992
Чтобы вывести её в читаемом виде, используется фильтр:
{PAGE_ROW_DATE_STAMP|cot_date('d-m-Y', $this)}
Здесь:
'd-m-Y'— формат вывода$this— текущая метка времени- третий параметр (необязательный) — учитывать ли временную зону пользователя
2.2 Параметры функции cot_date()
Функция принимает:
cot_date($format, $timestamp, $usertimezone)
| Параметр | Обязательный | Назначение |
| $format | Да | Формат даты |
| $timestamp | Да | UNIX timestamp |
| $usertimezone | Нет | Учитывать ли часовой пояс пользователя |
По умолчанию третий параметр равен true.
Пример без учёта временной зоны:
{PAGE_ROW_DATE_STAMP|cot_date('d.m.Y H:i', $this, false)}
3. Предопределённые форматы (рекомендуемый способ)
В Cotonti существуют заранее определённые форматы, хранящиеся в языковых файлах (main.*.lang.php) в массиве $Ldt.
Использование этих форматов рекомендуется, поскольку:
- они учитывают язык системы,
- поддерживают локализацию месяцев и дней недели,
- обеспечивают единообразие.
Пример:
{PAGE_ROW_DATE_STAMP|cot_date('date_full', $this)}
4. Список стандартных форматов (RU)
| Name | Format | Пример |
| date_full | d.m.Y | 13.02.2009 |
| date_medium | m.Y | 02.2009 |
| date_short | d.m | 13.02 |
| date_text | d F Y | 13 февраля 2009 |
| date_fulltext | l, d F Y | Пятница, 13 февраля 2009 |
| time_full | H:i:s | 23:31:30 |
| time_medium | G:i | 23:31 |
| time_short | i:s | 31:30 |
| datetime_full | d.m.Y H:i:s | 13.02.2009 23:31:30 |
| datetime_medium | d.m.Y H:i | 13.02.2009 23:31 |
| datetime_short | d.m H:i | 13.02 23:31 |
| datetime_text | d F Y H:i | 13 февраля 2009 23:31 |
| datetime_fulltext | l, d F Y H:i | Пятница, 13 февраля 2009 23:31 |
5. Использование произвольного формата
Можно задать любой формат PHP date():
{PAGE_DATE_STAMP|cot_date('l jS F Y h:i:s A', $this)}
Результат:
Friday 13th February 2009 11:31:30 PM
Другие примеры:
{PAGE_DATE_STAMP|cot_date('c', $this)}
ISO 8601:
2009-02-13T23:31:30+03:00 {PAGE_DATE_STAMP|cot_date('r', $this)}
RFC 5322:
Fri, 13 Feb 2009 23:31:30 +0300
6. Использование ISO-недели
Cotonti поддерживает вывод ISO-недели:
{PAGE_DATE_STAMP|cot_date('week_full', $this)}
Пример:
2009-W07
Если неделя относится к соседнему году — будет отображён соответствующий ISO-год (o).
7. Примеры работы с различными тегами
{PHP.pag.page_date|cot_date('datetime_full', $this)} {PHP.pag.page_updated|cot_date('date_text', $this)} {PHP.item.item_updated|cot_build_timeago()}
Последний пример использует относительный формат:
3 часа назад
8. Расширенный список символов форматирования
Формат определяется правилами PHP date().
День
| Символ | Описание | Пример |
| d | День с ведущим нулём | 01–31 |
| j | День без нуля | 1–31 |
| l | Полное название дня | Monday |
| D | Короткое название | Mon |
Месяц
| Символ | Описание | Пример |
| m | Месяц с нулём | 01–12 |
| n | Без нуля | 1–12 |
| F | Полное название | January |
| M | Короткое название | Jan |
Год
| Символ | Описание |
| Y | 2024 |
| y | 24 |
| o | ISO-год |
Время
| Символ | Описание |
| H | 00–23 |
| G | 0–23 |
| h | 01–12 |
| i | Минуты |
| s | Секунды |
| A | AM/PM |
Часовой пояс
| Символ | Описание |
| O | +0300 |
| P | +03:00 |
| T | EET |
| e | Europe/Moscow |
| Z | Смещение в секундах |
Полные форматы
| Символ | Формат |
| c | ISO 8601 |
| r | RFC 5322 |
| U | UNIX timestamp |
9. Учет временной зоны пользователя
Cotonti может учитывать индивидуальную временную зону пользователя.
Если включено:
cot_date('datetime_full', $stamp)
система автоматически добавит смещение:
Cot::$usr['timezone'] * 3600
Если нужно вывести серверное время без корректировки:
{PAGE_DATE_STAMP|cot_date('datetime_full', $this, false)}
10. Глобальная настройка форматов
Чтобы изменить формат по всей системе:
Откройте файл:
main.ru.lang.php
- Найдите массив
$Ldt - Измените формат:
Например:
$Ldt['date_full'] = 'Y-m-d';
После этого все вызовы cot_date('date_full', ...) будут использовать новый формат.
11. Рекомендации по проектированию шаблонов
✔ Используйте предопределённые форматы
✔ Не дублируйте формат вручную в десятках шаблонов
✔ Учитывайте локализацию
✔ Используйте ISO 8601 (c) для API
✔ Используйте timeago для новостей
12. Частые ошибки
1. Передача строки вместо timestamp
Нельзя:
{PAGE_DATE|cot_date('d.m.Y', $this)}
если PAGE_DATE содержит строку.
2. Использование несуществующего формата
{PAGE_DATE_STAMP|cot_date('xxx', $this)}
Если 'xxx' отсутствует в $Ldt, он будет интерпретирован как обычный формат date().
13. Когда использовать произвольный формат, а когда системный?
| Ситуация | Что использовать |
| Стандартный вывод | date_full |
| Новости | datetime_full |
| SEO-разметка | c |
| API | c |
| RSS | r |
| Человекочитаемый текст | date_text |
14. Лучшие практики
- Всегда работайте с timestamp.
- В шаблонах применяйте cot_date().
- Для расширений используйте предопределённые форматы.
- Не меняйте формат напрямую в десятках мест.
- Проверяйте влияние часового пояса.
15. Итог
Система вывода дат в Cotonti построена на трёх принципах:
- Хранение — всегда UNIX timestamp.
- Отображение — через cot_date().
- Локализация — через языковые файлы.
Благодаря этому:
- система масштабируема,
- даты корректно локализуются,
- учитывается временная зона,
- сохраняется единый стиль отображения,
- обеспечивается совместимость с международными стандартами.
Грамотное использование cot_date() и предопределённых форматов гарантирует корректную работу дат в шаблонах, расширениях, API и пользовательском интерфейсе.
Даты в CMF Cotonti. Запись, хранение и вывод (представление)
Расширенный раздел: примеры вывода дат в шаблонах
В этом разделе собраны реальные примеры использования фильтра cot_date в шаблонах Cotonti. Все примеры основаны на стандартных тегах модуля «Страницы», «Пользователи», «Комментарии» и других. Представлены как предопределённые форматы, так и произвольные, с учётом временной зоны и без.
1. Базовые примеры для страниц (page.tpl)
| Тег | Описание | Пример вывода |
{PAGE_DATE_STAMP|cot_date('date_full', $this)} | Только дата в формате ДД.ММ.ГГГГ | 11.12.2021 |
{PAGE_DATE_STAMP|cot_date('date_text', $this)} | Дата + месяц текстом | 11 декабря 2021 |
{PAGE_DATE_STAMP|cot_date('datetime_full', $this)} | Дата и время полные | 11.12.2021 15:30:45 |
{PAGE_DATE_STAMP|cot_date('datetime_text', $this)} | Дата текстом + время | 11 декабря 2021 15:30 |
{PAGE_DATE_STAMP|cot_date('time_full', $this)} | Только время | 15:30:45 |
{PAGE_DATE_STAMP|cot_date('time_medium', $this)} | Время без секунд | 15:30 |
{PAGE_BEGIN_STAMP|cot_date('date_full', $this)} | Дата начала публикации | 01.01.2026 |
{PAGE_EXPIRE_STAMP|cot_date('date_full', $this)} | Дата окончания публикации | 31.12.2026 |
{PAGE_UPDATED_STAMP|cot_date('datetime_text', $this)} | Дата обновления | 15 марта 2026 10:15 |
2. Примеры с проверкой наличия значения
Часто нужно выводить блок только если дата заполнена (не равна 0). Используется условный тег <!-- IF ... -->:
html
<!-- IF {PAGE_EXPIRE_STAMP} > 0 -->
<div class="expire-notice">
Страница будет скрыта: {PAGE_EXPIRE_STAMP|cot_date('date_full', $this)}
</div>
<!-- ENDIF -->Для page_begin проверка аналогична:
html
<!-- IF {PAGE_BEGIN_STAMP} > 0 && {PAGE_BEGIN_STAMP} > {PHP.sys.now} -->
<div class="future-notice">
Страница начнёт публиковаться: {PAGE_BEGIN_STAMP|cot_date('datetime_text', $this)}
</div>
<!-- ENDIF -->3. Примеры с отключением учёта часового пояса
Иногда нужно показать серверное время (UTC) без коррекции под пользователя. Для этого передаётся третий параметр false:
html
<!-- Серверное время публикации -->
<div class="server-time">
По серверу: {PAGE_DATE_STAMP|cot_date('datetime_full', $this, false)}
</div>Это полезно в административных интерфейсах или при отладке.
4. Примеры с произвольными форматами
Используются любые форматы, поддерживаемые PHP date():
html
<!-- День недели, число, месяц, год -->
<div class="custom-date">
{PAGE_DATE_STAMP|cot_date('l, j F Y', $this)} <!-- Пятница, 11 декабря 2021 -->
</div>
<!-- Время в 12-часовом формате с AM/PM -->
<div class="custom-time">
{PAGE_DATE_STAMP|cot_date('h:i A', $this)} <!-- 03:30 PM -->
</div>
<!-- ISO 8601 (для микроразметки) -->
<meta itemprop="datePublished" content="{PAGE_DATE_STAMP|cot_date('c', $this)}">
<!-- RFC 5322 (для RSS) -->
<pubDate>{PAGE_DATE_STAMP|cot_date('r', $this)}</pubDate>
<!-- Только год и месяц -->
<div class="archive-link">
{PAGE_DATE_STAMP|cot_date('Y-m', $this)} <!-- 2021-12 -->
</div>
<!-- Номер недели по ISO -->
<div class="week-number">
Неделя {PAGE_DATE_STAMP|cot_date('W', $this)}
</div>
<!-- День года -->
<div class="day-of-year">
День {PAGE_DATE_STAMP|cot_date('z', $this)} с начала года
</div>5. Примеры для разных модулей
5.1. Пользователи (users.profile.tpl)
| Тег | Описание | Пример |
{USER_REGDATE_STAMP|cot_date('date_text', $this)} | Дата регистрации | 5 марта 2020 |
{USER_LASTLOG_STAMP|cot_date('datetime_full', $this)} | Последний визит | 01.03.2026 19:22:10 |
{USER_BIRTHDATE_STAMP|cot_date('date_full', $this)} | Дата рождения (если заполнена) | 15.08.1985 |
5.2. Комментарии (comments.tpl)
html
<!-- В цикле комментариев -->
<div class="comment-meta">
<span class="comment-date">
{COMMENT_ROW_DATE_STAMP|cot_date('datetime_text', $this)}
</span>
<!-- Если комментарий редактировался -->
<!-- IF {COMMENT_ROW_UPDATED} > 0 -->
<span class="comment-edited">
(ред. {COMMENT_ROW_UPDATED_STAMP|cot_date('time_medium', $this)})
</span>
<!-- ENDIF -->
</div>5.3. Форум (forum.posts.tpl)
html
<div class="post-header">
<span class="post-date">
{POST_ROW_DATE_STAMP|cot_date('datetime_full', $this)}
</span>
<!-- IF {POST_ROW_UPDATED} > 0 -->
<span class="post-edited">
Изменено: {POST_ROW_UPDATED_STAMP|cot_date('datetime_text', $this)}
</span>
<!-- ENDIF -->
</div>5.4. Список страниц (list.tpl)
В цикле списка используются теги с префиксом LIST_ROW_:
html
<!-- BEGIN: ROW -->
<div class="list-item">
<h3><a href="{LIST_ROW_URL}">{LIST_ROW_TITLE}</a></h3>
<div class="list-meta">
Опубликовано: {LIST_ROW_DATE_STAMP|cot_date('date_full', $this)}
<!-- Если есть дата окончания и она скоро -->
<!-- IF {LIST_ROW_EXPIRE_STAMP} > 0 && {LIST_ROW_EXPIRE_STAMP} < {PHP.sys.now}+7*86400 -->
<span class="expire-warning">
(скоро скрывается: {LIST_ROW_EXPIRE_STAMP|cot_date('date_short', $this)})
</span>
<!-- ENDIF -->
</div>
</div>
<!-- END: ROW -->6. Примеры с относительными датами (timeago)
Если в системе установлен плагин, предоставляющий функцию cot_build_timeago(), её можно использовать для вывода относительных дат:
html
<div class="timeago">
{PAGE_DATE_STAMP|cot_build_timeago($this)}
</div>Пример вывода: «3 часа назад», «вчера», «15 минут назад». Это улучшает восприятие для недавних событий.
7. Примеры для экстраполей
Если создано экстраполе типа «дата» (например, product_release), его теги формируются аналогично:
html
<div class="product-release">
Дата выхода: {PRODUCT_RELEASE_STAMP|cot_date('date_text', $this)}
</div>8. Примеры с множественными форматами в одном блоке
Иногда требуется вывести разные представления одной даты, например, для микроразметки и для людей:
html
<div class="event" itemscope itemtype="http://schema.org/Event">
<meta itemprop="startDate" content="{PAGE_BEGIN_STAMP|cot_date('c', $this)}">
<div class="event-date">
Начало: {PAGE_BEGIN_STAMP|cot_date('datetime_text', $this)}
</div>
<div class="event-countdown">
<!-- Вывод, сколько осталось дней -->
<!-- IF {PAGE_BEGIN_STAMP} > {PHP.sys.now} -->
Осталось: {PHP|ceil(({PAGE_BEGIN_STAMP}-{PHP.sys.now})/86400)} дней
<!-- ENDIF -->
</div>
</div>9. Примеры с учётом часового пояса в форме
В форме редактирования страницы уже используется cot_selectbox_date, но если нужно вывести предварительный просмотр даты с учётом пояса:
html
<div class="preview">
Выбранная дата (ваш часовой пояс): {PHP|cot_date('datetime_full', {PAGE_DATE_STAMP})}
</div>10. Примеры для сложных условий
10.1. Проверка, что дата начала уже наступила, но дата окончания ещё нет
html
<!-- IF {PAGE_BEGIN_STAMP} <= {PHP.sys.now} && ({PAGE_EXPIRE_STAMP} == 0 || {PAGE_EXPIRE_STAMP} > {PHP.sys.now}) -->
<div class="active">Страница активна</div>
<!-- ENDIF -->10.2. Вывод даты окончания, если она есть, иначе «бессрочно»
html
<div class="expire">
<!-- IF {PAGE_EXPIRE_STAMP} > 0 -->
Действует до: {PAGE_EXPIRE_STAMP|cot_date('date_full', $this)}
<!-- ELSE -->
Действует: бессрочно
<!-- ENDIF -->
</div>10.3. Форматирование timestamp для JavaScript
Иногда нужно передать timestamp в JavaScript для дальнейшей обработки (например, для своих скриптов). Можно вывести его как число:
html
<script>
var pageDate = {PAGE_DATE_STAMP}; // 1639236600
var pageBegin = {PAGE_BEGIN_STAMP}; // 1699716120
</script>11. Полный пример блока с датами для страницы
html
<div class="page-meta">
<div class="meta-item">
<span class="meta-label">Создано:</span>
<span class="meta-value">{PAGE_DATE_STAMP|cot_date('datetime_text', $this)}</span>
</div>
<!-- IF {PAGE_BEGIN_STAMP} > 0 -->
<div class="meta-item">
<span class="meta-label">Начало публикации:</span>
<span class="meta-value">{PAGE_BEGIN_STAMP|cot_date('datetime_text', $this)}</span>
<!-- IF {PAGE_BEGIN_STAMP} > {PHP.sys.now} -->
<span class="meta-note">(будет опубликована)</span>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- IF {PAGE_EXPIRE_STAMP} > 0 -->
<div class="meta-item">
<span class="meta-label">Окончание публикации:</span>
<span class="meta-value">{PAGE_EXPIRE_STAMP|cot_date('datetime_text', $this)}</span>
<!-- IF {PAGE_EXPIRE_STAMP} < {PHP.sys.now} -->
<span class="meta-note">(публикация истекла)</span>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<div class="meta-item">
<span class="meta-label">Последнее обновление:</span>
<span class="meta-value">{PAGE_UPDATED_STAMP|cot_date('datetime_text', $this)}</span>
<!-- Использование timeago -->
<span class="meta-timeago">({PAGE_UPDATED_STAMP|cot_build_timeago($this)})</span>
</div>
</div>Заключение по примерам
Представленные примеры охватывают 90% реальных ситуаций, возникающих при разработке шаблонов для Cotonti. Ключевые моменты:
Всегда используйте _STAMP-теги (которые содержат timestamp) для передачи в cot_date.
Comments (0)
Content author
Offline
Sodium Carbonate
Last logged: 2026-07-20 04:22
- Page published: 2026-03-01 01:35
- Last update: 2026-03-01 10:41