Оператор IF вывод меню
Ребят, помогите разобраться. Пытаюсь вывести разное меню на разных страницах.
Оператор сравнения с subject (&operator=`EQ`)
И если равен 8 странице, то выводится меню 1, иначе, выводится другое меню.
И всё это дело не работает, поправьте пожалуйста, что делаю не так?
[[!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, иначе, выводится другое меню.
И всё это дело не работает, поправьте пожалуйста, что делаю не так?
Комментарии: 9
Не нужно использовать сниппеты типа 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 будет заменён.
Немного сложновато, но сработало! Спасибо)
Зато в эту обёртку можно напихать еще с десяток разных условий и всё будет работать правильно и без тормозов.
А если убрать
&resources=`0`
Для данной задачи сниппет if не нужен. (если серьезно, сниппет if вообще никогда не нужен, но об этом далее)
Вот как можно решить вашу задачу встроенными фильтрами модкса:
Теперь по поводу сниппета if и процесса обработки тегов модкса в целом: в отличие от чистого php, принцип работы тегов модкса такой, что вначале выполняются вложенные функции, а уже после — внешние.
Например, возьмем пример реализации одной и той же задачи при помощи php и функционала modx'a:
Php
Теги modx
Если с примером на php логика работы понятна, то последовательность выполнения второго примера следующая:
— выполняем сниппет 1
— выполняем сниппет 2
— проверяем страницу и показываем нужный результат
Из-за такой особенности в свое время сайты на modx'e становились жутко тормозными. И заслуга сниппета 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 в этом деле далеко не на последнем месте…
Надеюсь, объяснил достаточно понятно)
Для решения проблемы со вторым вариантом делают так
[[[[*id:is=`1`:then=`название сниппета 1`:else=`название сниппета 2`]]]]
Спасибо, разобрался! Оказывается многое можно реализовать стандартными методами без сниппетов!
Остановился на этом решении
Остановился на этом решении
[[*parent:is=`1`:then=`сниппет 1`:else=`сниппет 2`]]
Максим выше описал возможные проблемы с данным решением — MODX выполнит оба сниппета, а потом только проверит условие и вставит нужный результат.
Варианта 2 (если без сниппетов)
Варианта 2 (если без сниппетов)
//Вариант 1.
[[[[*id:is=`1`:then=`название сниппета 1`:else=`название сниппета 2`]]]]
//Вариант 2.
Использовать fenom.
Что-то теперь запутался немного…
т.е. в идеале нужно добавить два сниппета разных меню, и вывести?
про fenom читал, но тоже я так понял нужно использовать сниппеты?
т.е. в идеале нужно добавить два сниппета разных меню, и вывести?
про fenom читал, но тоже я так понял нужно использовать сниппеты?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.