Категории форума

Экстраполя в Cotonti: Тип данных datetime — Дата и время

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


webitproff
Телеграм для сообщений
@webitproff
webitproff • 16.08.2026 12:13 #1

подробный разбор того, как устроен тип datetime в системе extrafields Cotonti. 

Статья получилась объёмной, но для начала – краткие тезисы, чтобы обсудить концепцию.

 

Что важно знать о datetime в экстраполях

  1. Хранение – значение всегда хранится как int (Unix timestamp). Пустая дата = 0.

  2. Параметры поля – в field_params передаются три значения через запятую:
    min,max,format

    • min и max – границы года (по умолчанию 2000 и 2030).

    • format – строка формата для вывода (PHP или ключ из $Ldt).

  3. Форма редактирования – генерируется через cot_selectbox_date() с учётом часового пояса пользователя. Поддерживаются относительные даты (+86400).

  4. Импорт – выполняется через cot_import_date(), которая приводит время к UTC перед сохранением. Если год выходит за min/max, он корректируется.

  5. Выводcot_build_extrafields_data() использует параметр format; если его нет, возвращает сырой timestamp.

  6. Часовые пояса – на вводе время переводится в UTC, на выводе – в локальную зону текущего пользователя.

  7. Шаблоны – для проверки наличия даты обязательно используйте тег _VALUE (например, {USERS_DETAILS_XTRA_..._VALUE}), чтобы не показывать пустые блоки и избежать "01.01.1970".

  8. Особенности0 считается пустым, обязательные поля вызывают ошибку при 0. Хуки form.date и import.date позволяют переопределять логику.


Что требует обсуждения?

  • Считаете ли вы такой подход к хранению дат (Unix timestamp) удобным?

  • Не возникает ли проблем с часовыми поясами в ваших проектах?

  • Какие форматы вывода чаще всего используете – предпочитаете datetime_medium или кастомные строки?

  • Как быть с 2038 годом на 32-битных системах – планируете переход на 64-битные timestamp?

  • Возможно, у вас есть свои наработки по улучшению работы с датами в экстраполях?


Полная версия статьи с примерами кода, детальным разбором каждой функции и схемой работы – по ссылке:
🔗 https://abuyfile.com/ru/cotonti/reading/extrafields-datetime-cotonti

Приглашаю к обсуждению – делитесь опытом, задавайте вопросы, предлагайте улучшения! Вместе сделаем документацию по Cotonti полезнее.

Отредактировано: webitproff (16.08.2026 13:22, 2 часа назад)
webitproff
Телеграм для сообщений
@webitproff
webitproff • 16.08.2026 13:30 #2

Вывод даты в шаблоне: сравнение _VALUE и явной проверки > 0

В шаблонах Cotonti для работы с экстраполями типа datetime (дата и время) обычно используются три тега, которые формируются функциями плагина или ядра:

  • {PREFIX_XTRA_FIELD} — отформатированное значение (например, "15 августа 2026, 14:30"), если в параметрах поля задан формат вывода. Если формат не задан, возвращает «сырое» значение (timestamp).

  • {PREFIX_XTRA_FIELD_TITLE} — название поля.

  • {PREFIX_XTRA_FIELD_VALUE} — всегда «сырое» значение, то есть Unix timestamp (целое число) или 0, если дата не указана.

Именно тег _VALUE чаще всего используется для проверки, заполнено ли поле, потому что он гарантированно содержит числовое значение, а не строку, которая может быть непустой даже при пустой дате.

Пример из шаблона

 
<!-- Дата последнего повышения -->
<!-- IF {USERS_DETAILS_XTRA_X200_LAST_PROMOTION_VALUE} -->
<div class="d-flex align-items-center mb-3">
    <div class="contact-icon calendar me-3">
        <i class="fa-solid fa-calendar-alt fa-xl"></i>
    </div>
    <div>
        <div class="contact-label">{USERS_DETAILS_XTRA_X200_LAST_PROMOTION_TITLE}</div>
        <div class="contact-value">{USERS_DETAILS_XTRA_X200_LAST_PROMOTION}</div>
    </div>
</div>
<!-- ENDIF -->

Здесь условие <!-- IF {USERS_DETAILS_XTRA_X200_LAST_PROMOTION_VALUE} --> проверяет, что _VALUE не пустое и не равно строке "0".
Для типа datetime это означает: дата была выбрана (timestamp > 0), и блок будет показан.
Если дата не указана (значение 0), блок скрыт.

Почему нельзя проверять по обычному тегу {..._LAST_PROMOTION}?

Если в параметрах поля задан формат (например, datetime_medium), то обычный тег вернёт отформатированную строку. При timestamp = 0 она может выглядеть как "1 января 1970, 00:00" — то есть блок не скроется, хотя дата фактически не указана.
Использование _VALUE устраняет эту проблему, так как _VALUE всегда равно 0 для пустой даты.


Альтернативный способ: явное сравнение > 0

 
<!-- IF {MY_DATE_RAW} > 0 -->
    <p>Дата: {MY_DATE}</p>
<!-- ELSE -->
    <p>Дата не указана</p>
<!-- ENDIF -->

Здесь {MY_DATE_RAW} — это тот же самый сырой timestamp (можно использовать _VALUE).
Условие > 0 явно проверяет, что значение больше нуля, то есть дата существует.

Когда какой способ использовать?

 
 
СитуацияРекомендуемый вариант
Нужно просто скрыть блок, если поле пустое (0 или пустая строка)<!-- IF {FIELD_VALUE} --> (коротко и понятно)
Нужно подчеркнуть, что проверяется именно timestamp, и сделать код самодокументируемым<!-- IF {FIELD_VALUE} > 0 -->
Нужно сравнивать не только с нулём, но и с текущей датой или другим числом<!-- IF {FIELD_VALUE} > {PHP.sys.now} --> и т.п.
Поле может содержать отрицательные значения или строку "0" как валидные данныеЯвное сравнение с нужным условием

Для datetime оба варианта эквивалентны, потому что пустое значение всегда равно 0, а заполненное — положительное число. Однако явное сравнение > 0 полезно, если вы хотите показать читателю кода, что работаете именно с временной меткой и ожидаете значение больше нуля.


Что лучше?

С точки зрения краткости и принятого стиля Cotonti — использование _VALUE в условии IF (как в вашем первом примере) является стандартным решением. Оно лаконично и не требует знания деталей хранения (число/строка).

С точки зрения явности и расширяемости — сравнение > 0 может быть предпочтительнее, если код будут читать разработчики, которым важно видеть, что значение сравнивается с нулём. Но для простого скрытия пустых блоков оба способа абсолютно корректны.

В конечном счёте выбор зависит от вашего стиля и требований проекта. В документации Cotonti часто применяется именно <!-- IF {TAG_VALUE} --> для проверки наличия значения, поэтому рекомендую придерживаться этого подхода для единообразия.

 

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.