Как в 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).


Почему так — не пойму. Может быть, вы объясните в чем тут дело!?
weranda
16 января 2021, 15:28
modx.pro
1
879
0

Комментарии: 7

Артем
16 января 2021, 17:16
1
+3
Этот модификатор работает не так, как все от него ожидают. Он проверяет сразу несколько условий:
  • $a in list $b
  • $a in keys $b
  • $a in string $b (если указана строка вместо массива)
Соответственно, в твоем случае in list возвращает false, но сразу после этого идет проверка на in keys, которая уже возвращает true. То есть проверяется, что parent текущего ресурса содержится в ключах массива, а это, разумеется, правда.

Из сорсов:
return in_array($value, $haystack) || array_key_exists($value, $haystack);
Не знаю, зачем был придуман этот модификатор, потому что в реальных кейсах никто не проверяет такой «микс» условий.
Рекомендую забыть об этом модификаторе и юзать его более конкретизированные версии, в частности in list.

{($_modx->resource.parent in list [16, 17, 18]) ? 'true' : 'false'}
    weranda
    16 января 2021, 17:25
    0
    А где вы нашли информацию об этом модификаторе в документации?
    Можно как-то то, что вы написали использовать в конструкции условий Fenom? Как тут:
    {if <expression>}
       {* ...code... *}
    {elseif <expression>}
       {* ...code... *}
    {elseif <expression>}
       {* ...code... *}
    {else}
       {* ...code... *}
    {/if}
      Артем
      16 января 2021, 17:29
      +1
      У фенома есть своя документация на гитхабе, лучше смотреть ее там.

      {if $_modx->resource.parent in list [16, 17, 18]}
          УСЛОВИЕ ВЫПОЛНЕНО
      {else}
          УСЛОВИЕ НЕ ВЫПОЛНЕНО
      {/if}
        weranda
        16 января 2021, 17:34
        0
        Спасибо за объяснение! Работает.
        Руслан
        16 января 2021, 19:13
        1
        +1
        Еще удобнее использовать для таких целей switch:
        {switch $_modx->resource.parent}
        {case 15}
            ...
        {case 16,17, 18}
            ...
        {case 19}
            ...
        {case default, 20}
            ...
        {/switch}

        из той же документации на гитхабе
          weranda
          16 января 2021, 19:30
          0
          И вам, тоже спасибо за дополнительное решение.
      Антон
      17 января 2021, 12:03
      2
      +1
      {var $ids = $_modx->getParentIds($_modx->resource.id)}
      {if '11' in list $ids}
        Фильтры для пылесосов
      {else}
        Фильтры для вытяжек	
      {/if}
      Код не проверял, но логика примерно такая: получить массив с родителями текущего ресурса и проверить, если ли среди них нужный.
      Это решение Василия, на случай, если нужно проверить принадлежность не только к родителю, но и дедушек и (пра)дедушек.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7