Как в Fenom настроить модификатор "in"? Работает как-то странно.
Приветствую.
В Fenom есть модификатор in. Написал простое выражение:
Думал, что что-то в сайте не то и создал тестовый. Вот он:
Почему так — не пойму. Может быть, вы объясните в чем тут дело!?
В Fenom есть модификатор in. Написал простое выражение:
{if $_modx->resource.parent | in : [16, 17, 18]}
УСЛОВИЕ ВЫПОЛНЕНО
{else}
УСЛОВИЕ НЕ ВЫПОЛНЕНО
{/if}
Суть его сводится к тому, что если родитель ресурса находится в массиве, тогда показываем, что условие выполнено и наоборот. Все логично. Почитал документацию и, вроде, все верно, но почему-то в тех ресурсах где ID родителя нет в указанном массиве, модификатор все равно показывает, что условие выполнено.Думал, что что-то в сайте не то и создал тестовый. Вот он:
http://s24976.h5.modhost.pro/manager/
Логин: s24976
Пароль: MuUTSeQmOBLs
Вот скриншот ресурсов из админки. На нем отметил ресурсы, в которых условие выполняется (УСЛОВИЕ ВЫПОЛНЕНО), хотя, должно быть не выполнено (УСЛОВИЕ НЕ ВЫПОЛНЕНО). По логике и существующей структуре сообщение «УСЛОВИЕ НЕ ВЫПОЛНЕНО» должно показываться только внутри папки с идентификатором 16 (17, 18).Почему так — не пойму. Может быть, вы объясните в чем тут дело!?
Комментарии: 7
Этот модификатор работает не так, как все от него ожидают. Он проверяет сразу несколько условий:
Из сорсов:
Рекомендую забыть об этом модификаторе и юзать его более конкретизированные версии, в частности in list.
- $a in list $b
- $a in keys $b
- $a in string $b (если указана строка вместо массива)
Из сорсов:
return in_array($value, $haystack) || array_key_exists($value, $haystack);
Не знаю, зачем был придуман этот модификатор, потому что в реальных кейсах никто не проверяет такой «микс» условий.Рекомендую забыть об этом модификаторе и юзать его более конкретизированные версии, в частности in list.
{($_modx->resource.parent in list [16, 17, 18]) ? 'true' : 'false'}
А где вы нашли информацию об этом модификаторе в документации?
Можно как-то то, что вы написали использовать в конструкции условий Fenom? Как тут:
Можно как-то то, что вы написали использовать в конструкции условий Fenom? Как тут:
{if <expression>}
{* ...code... *}
{elseif <expression>}
{* ...code... *}
{elseif <expression>}
{* ...code... *}
{else}
{* ...code... *}
{/if}
У фенома есть своя документация на гитхабе, лучше смотреть ее там.
{if $_modx->resource.parent in list [16, 17, 18]}
УСЛОВИЕ ВЫПОЛНЕНО
{else}
УСЛОВИЕ НЕ ВЫПОЛНЕНО
{/if}
Спасибо за объяснение! Работает.
Еще удобнее использовать для таких целей switch:
из той же документации на гитхабе
{switch $_modx->resource.parent}
{case 15}
...
{case 16,17, 18}
...
{case 19}
...
{case default, 20}
...
{/switch}
из той же документации на гитхабе
И вам, тоже спасибо за дополнительное решение.
Это решение Василия, на случай, если нужно проверить принадлежность не только к родителю, но и дедушек и (пра)дедушек.Код не проверял, но логика примерно такая: получить массив с родителями текущего ресурса и проверить, если ли среди них нужный.{var $ids = $_modx->getParentIds($_modx->resource.id)} {if '11' in list $ids} Фильтры для пылесосов {else} Фильтры для вытяжек {/if}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.