Вывод даты в шаблоне: сравнение _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} --> для проверки наличия значения, поэтому рекомендую придерживаться этого подхода для единообразия.