Вызов сниппета в условии
Здравствуйте! Столкнулся с такой небольшой проблемой, как можно вызвать сниппет в условии if else?
Пример:
Пример:
[[*isfolder:is=`1`:then=`
[[!pdoMenu?
&level=`2`
&outerClass = `side-menu`
&parents=`[[*id]]`
&where=``
&tplParentRow=`@INLINE <li[[+classes]]><h3 [[+attributes]]>[[+menutitle]]</h3>[[+wrapper]]</li>`
]]`:else=`
[[pdoResources?
&parents=`52`
&depth=`0`
&tpl=`tpl.SideNews`
]]
`]]
Комментарии: 11
Не надо так делать.
Сделайте 2 разных шаблона:
1. Категория
2. Публикация
Сделайте 2 разных шаблона:
1. Категория
2. Публикация
да уже решил, спасибо. просто надо было вызвать некэшируемый сниппет
В вашем примере вы можете воспользоваться плейсхолдером results и выводить в условии уже результаты.
Но… «вложенные условия» работают несколько иначе, чем в php, а именно — [[действия]] срабатывают «изнутри», т.е. сначала срабатывают все внутренние сниппеты/чанки, а уже потом — внешние.
Грубо говоря, в вашем примере сначала 2 раза срабатывает pdoResources, а уже потом условие. Из-за этого при генерации страницы обрабатываются ненужные запросы. Лучший выход при таких задачах (имхо) — писать свой сниппет на пшп, где используются обычные условия if else, а уже внутри — запускаются сниппеты.
Но… «вложенные условия» работают несколько иначе, чем в php, а именно — [[действия]] срабатывают «изнутри», т.е. сначала срабатывают все внутренние сниппеты/чанки, а уже потом — внешние.
Грубо говоря, в вашем примере сначала 2 раза срабатывает pdoResources, а уже потом условие. Из-за этого при генерации страницы обрабатываются ненужные запросы. Лучший выход при таких задачах (имхо) — писать свой сниппет на пшп, где используются обычные условия if else, а уже внутри — запускаются сниппеты.
свой сниппет писать не вариант сейчас, да и в php не силен, но все равно, спасибо, приму к сведению
Смотри, все довольно просто. Создаешь свой сниппет, допустим, yoba1 с кодом:
И вызываешь в нужном месте [[!yoba1]]. Итог: в 2 раза меньше запросов к бд.
<?php
if ($modx->resource->hasChildren() != 0) { //смотрим кол-во потомков ресурса
$params = array(); //перечисляем в массиве параметры сниппета
$params['level'] = 2;
$params['outerClass'] = 'side-menu';
$params['tplParentRow'] = '@INLINE <li[[+classes]]><h3 [[+attributes]]>[[+menutitle]]</h3>[[+wrapper]]</li>';
$result = $modx->runSnippet('pdoMenu', $params); //вызываем сниппет pdoMenu с нужными параметрами
}
else {
$params = array();
$params['parents'] = 52;
$params['depth'] = 0;
$params['tpl'] = 'tpl.SideNews';
$result = $modx->runSnippet('pdoResources', $params);
}
return $result; //возвращаем результат
И вызываешь в нужном месте [[!yoba1]]. Итог: в 2 раза меньше запросов к бд.
спасибо большое!
Простите за офтоп, но почему yoba? Как то неприлично :)
У меня еще возник вопрос, почему 1, а не 2015? :)
пхаха)) ну… простите…
Просто подумал, что у такого сниппета высокий порог вхождения, вот и назвал для наглядности..)
Y.O.B.A.
Y.O.B.A.
т.е. сначала срабатывают все внутренние сниппеты/чанки, а уже потом — внешниеКстати, есть прием, позволяющий обойти это.
[[[[*isfolder:is=`1`:then=`!pdoMenu? ...`]]]]
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.