Оператор IF вывод меню

Ребят, помогите разобраться. Пытаюсь вывести разное меню на разных страницах.
[[!If? &subject=`[[*id]]` &operator=`EQ` &operand=`8` 
&then=`[[pdoMenu? &level=`3` &parents=`8` &resources=`0` &rowClass=`tab`]]`
&else=`[[pdoMenu? &level=`3` &parents=`0` &resources=`0` &rowClass=`tab`]]`
]]
Т.е. как я понимаю параметр, по которому выполняются условия id страницы, на которой выводится меню (&subject=`[[*id]]`).
Оператор сравнения с subject (&operator=`EQ`)
И если равен 8 странице, то выводится меню 1, иначе, выводится другое меню.

И всё это дело не работает, поправьте пожалуйста, что делаю не так?
Александр
14 декабря 2015, 08:55
modx.pro
2
3 335
0

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

Василий Наумкин
14 декабря 2015, 12:01
2
+3
Не нужно использовать сниппеты типа IF, гораздо лучше написать свой сниппет-обёртку, например MyMenu:
<?php
if ($modx->resource->id == 8) {
	$scriptProperties['parents'] = 8;
}

return $modx->runSnippet('pdoMenu', $scriptProperties);

И вызывать как
[[!MyMenu?
	&level=`3`
	&parents=`0`
	&resources=`0`
	&rowClass=`tab`
]]
На странице с id == 8 параметр &parents будет заменён.
    Александр
    14 декабря 2015, 12:24
    0
    Немного сложновато, но сработало! Спасибо)
      Василий Наумкин
      14 декабря 2015, 12:27
      +1
      Зато в эту обёртку можно напихать еще с десяток разных условий и всё будет работать правильно и без тормозов.
    Марат Марабар
    14 декабря 2015, 12:03
    0
    А если убрать
    &resources=`0`
      Максим Кузнецов
      14 декабря 2015, 12:05
      +2
      Для данной задачи сниппет if не нужен. (если серьезно, сниппет if вообще никогда не нужен, но об этом далее)

      Вот как можно решить вашу задачу встроенными фильтрами модкса:
      [[*id:is=`8`:then=`вызов1`:else=`вызов2`]]

      Теперь по поводу сниппета if и процесса обработки тегов модкса в целом: в отличие от чистого php, принцип работы тегов модкса такой, что вначале выполняются вложенные функции, а уже после — внешние.

      Например, возьмем пример реализации одной и той же задачи при помощи php и функционала modx'a:

      Php
      if ($pageId == 1) { //выполняем функцию 1 }
      else { //выполняем функцию 2}


      Теги modx
      [[*id:is=`1`:then=`сниппет 1`:else=`сниппет 2`]]

      Если с примером на php логика работы понятна, то последовательность выполнения второго примера следующая:
      — выполняем сниппет 1
      — выполняем сниппет 2
      — проверяем страницу и показываем нужный результат

      Из-за такой особенности в свое время сайты на modx'e становились жутко тормозными. И заслуга сниппета if в этом деле далеко не на последнем месте…

      Надеюсь, объяснил достаточно понятно)
        Сергей Шлоков
        14 декабря 2015, 12:08
        0
        Для решения проблемы со вторым вариантом делают так
        [[[[*id:is=`1`:then=`название сниппета 1`:else=`название сниппета 2`]]]]
          Александр
          14 декабря 2015, 12:23
          0
          Спасибо, разобрался! Оказывается многое можно реализовать стандартными методами без сниппетов!
          Остановился на этом решении
          [[*parent:is=`1`:then=`сниппет 1`:else=`сниппет 2`]]
            Сергей Шлоков
            14 декабря 2015, 12:42
            0
            Максим выше описал возможные проблемы с данным решением — MODX выполнит оба сниппета, а потом только проверит условие и вставит нужный результат.
            Варианта 2 (если без сниппетов)
            //Вариант 1.
            [[[[*id:is=`1`:then=`название сниппета 1`:else=`название сниппета 2`]]]]
            //Вариант 2.
            Использовать fenom.
              Александр
              14 декабря 2015, 12:58
              0
              Что-то теперь запутался немного…
              т.е. в идеале нужно добавить два сниппета разных меню, и вывести?
              про fenom читал, но тоже я так понял нужно использовать сниппеты?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9