К содержанию

MODX Revolution · практика

Проверка переменных в Fenom для MODX Revolution

Условия Fenom без путаницы: непустое значение, существование переменной, ноль, null, запасной текст и проверки перед циклом.

Проверку выбирают по смыслу значения. Для необязательного текста подходит $value?, для переданного значения, включая ноль, — $value is set или $value!. Проверить пустоту можно через $value is empty. Эти условия решают разные задачи.

Один и тот же шаблон может получить заполненную строку, пустое поле, ноль или вообще не получить параметр. Если проверять всё одним условием, исчезнет бесплатная цена, появится пустой контейнер или карточка возьмёт заголовок другой страницы. Разберём эти случаи отдельно.

Примеры предназначены для MODX Revolution с pdoTools, где шаблон или чанк обрабатывается Fenom. Имена TV условные: создайте поля и привяжите их к используемым шаблонам. Синтаксис условий описан в документации операторов Fenom.

Когда нужен непустой текст

Описание без текста не должно оставлять пустой абзац. Проверяйте поле до открытия тега:

{if $_modx->resource.description?}
  <p>{$_modx->resource.description | escape}</p>
{/if}

? означает проверку непустоты по правилам empty в PHP. Это удобно для заголовков и описаний, но важно помнить о нуле: и число 0, и строка '0' считаются пустыми. Строка из пробелов, напротив, может пройти проверку. Если редактор ввёл только пробелы, очищайте такие значения при подготовке данных.

Для необязательного подзаголовка проверяйте весь блок, а не только текст внутри него:

{if $_modx->resource.subtitle?}
  <div class="wm-intro">
    <p>{$_modx->resource.subtitle | escape}</p>
  </div>
{/if}

Так вместе с текстом исчезают фон, рамка и отступы контейнера. Условие не проверяет правильность URL, наличие файла или безопасность текста — это отдельные задачи.

Когда ноль нужно сохранить

Предположим, в чанк передаётся цена. Нулевая цена может означать бесплатное участие, а отсутствие цены — что её ещё не указали. Здесь нужна проверка существования:

{if $price is set}
  <p>Стоимость: {$price | escape} ₽</p>
{else}
  <p>Стоимость уточняется.</p>
{/if}

is set соответствует isset: ноль и пустая строка проходят проверку, null и отсутствующая переменная — нет. Поэтому этот код предполагает, что цена уже подготовлена и пустая строка не используется вместо числа. Проверку корректности числового значения выполняйте отдельно.

Короткая запись той же проверки — $price!. Восклицательный знак после переменной здесь не означает отрицание:

{if $price!}
  <p>Стоимость: {$price | escape} ₽</p>
{/if}
Как Fenom различает значения
Значение$value?$value is set / $value!$value is empty
'Текст'ДаДаНет
''НетДаДа
0 или '0'НетДаДа
falseНетДаДа
nullНетНетДа
Не переданоНетНетДа

Таблица описывает проверки значения, а не бизнес-правила. Например, false может быть осмысленным переключателем, но выводить его как цену нельзя.

Когда нужно проверить пустоту

Для сообщения вместо пустого блока используйте явное условие is empty:

{if $_modx->resource.subtitle is empty}
  <p>Подробности скоро появятся.</p>
{else}
  <p>{$_modx->resource.subtitle | escape}</p>
{/if}

Для необязательного подзаголовка сообщение обычно не нужно — лучше скрыть блок. Запасной текст имеет смысл, когда он помогает посетителю: например, объясняет отсутствие даты или следующего шага. Не заполняйте интерфейс сообщениями о каждом пустом TV.

Запасной заголовок: if или короткая запись

Если длинный заголовок не заполнен, выведем обычное название ресурса:

{if $_modx->resource.longtitle?}
  {$_modx->resource.longtitle | escape}
{else}
  {$_modx->resource.pagetitle | escape}
{/if}

Этот вариант удобен, если у двух веток разная разметка. Когда меняется только значение, его можно сначала сохранить:

{set $title = $_modx->resource.longtitle ?: $_modx->resource.pagetitle}
<h1>{$title | escape}</h1>

?: выбирает запасное значение при пустоте. Для числовых полей, где ноль должен оставаться нулём, такой выбор не подходит. Различайте отсутствие данных и допустимое значение перед тем, как сокращать условие.

Проверяйте переменную из нужного источника

$_modx->resource относится к открытой странице. В чанке карточки pdoResources переменная $pagetitle относится к выбранной строке. Если карточка проверяет описание открытого каталога, она повторит одно и то же значение во всех элементах.

{if $description?}
  <p>{$description | escape}</p>
{/if}

Этот пример предназначен для чанка карточки, куда сниппет передаёт description. При обращении к TV проверьте и префикс: после tvPrefix => '' имя поля будет доступно без стандартного tv.. Разбор вызовов есть в руководстве по спискам ресурсов.

Перед циклом проверьте тип и количество

Если сниппет должен вернуть массив, проверка только на непустоту недостаточна: непустой результат может оказаться строкой. Сначала проверяем тип, затем количество:

{if $items is array}
  {if $items | count}
    <ul>
    {foreach $items as $item}
      <li>{$item.title | escape}</li>
    {/foreach}
    </ul>
  {/if}
{/if}

Здесь предполагается, что массив $items уже передан в шаблон, а каждая строка содержит title. Проверка внешнего массива не подтверждает структуру всех его элементов. Подготовку и проверку сложных данных удобнее выполнять в сниппете.

Как проверить условие на своём сайте

  1. Убедитесь, что используемый шаблон или чанк проходит через Fenom. Если на странице видны фигурные скобки, начните с парсера.
  2. Проверьте источник: текущий ресурс, строка выборки или параметр включённого чанка.
  3. Для TV проверьте имя, привязку к шаблону и значение у нужной страницы.
  4. Проверьте заполненный текст, пустую строку, ноль и отсутствие параметра. Для числовых полей добавьте null, если он возможен в ваших данных.
  5. Посмотрите итоговый HTML: после скрытия блока не должны оставаться пустые рамки и отступы.
  6. Если результат старый, проверьте кэш MODX и кэш дополнения. Не выводите служебные данные в публичном шаблоне для диагностики.

Для изображения проверка непустоты — только первый шаг. Как собрать путь и подготовить размер, разобрано в статье о TV-изображениях. Если непонятно, откуда пришла переменная, начните с разделения шаблона, чанка и TV.

Когда нужен второй взгляд

Нужна помощь с вашим сайтом?

Если задача выходит за рамки статьи, расскажите, что хотите исправить или добавить.

Обсудить задачу