Вызов сниппета в условии

Здравствуйте! Столкнулся с такой небольшой проблемой, как можно вызвать сниппет в условии 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`
                ]]
     		    `]]
Lori
20 февраля 2015, 05:49
modx.pro
1
4 428
0

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

Наумов Алексей
20 февраля 2015, 09:45
0
Не надо так делать.

Сделайте 2 разных шаблона:
1. Категория
2. Публикация
    Lori
    20 февраля 2015, 09:47
    0
    да уже решил, спасибо. просто надо было вызвать некэшируемый сниппет
    Максим Кузнецов
    20 февраля 2015, 09:53
    0
    В вашем примере вы можете воспользоваться плейсхолдером results и выводить в условии уже результаты.
    Но… «вложенные условия» работают несколько иначе, чем в php, а именно — [[действия]] срабатывают «изнутри», т.е. сначала срабатывают все внутренние сниппеты/чанки, а уже потом — внешние.

    Грубо говоря, в вашем примере сначала 2 раза срабатывает pdoResources, а уже потом условие. Из-за этого при генерации страницы обрабатываются ненужные запросы. Лучший выход при таких задачах (имхо) — писать свой сниппет на пшп, где используются обычные условия if else, а уже внутри — запускаются сниппеты.
      Lori
      20 февраля 2015, 09:59
      0
      свой сниппет писать не вариант сейчас, да и в php не силен, но все равно, спасибо, приму к сведению
        Максим Кузнецов
        20 февраля 2015, 10:15
        1
        +1
        Смотри, все довольно просто. Создаешь свой сниппет, допустим, yoba1 с кодом:

        <?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 раза меньше запросов к бд.
          Lori
          20 февраля 2015, 10:17
          0
          спасибо большое!
            G@G
            G@G
            20 февраля 2015, 10:54
            0
            Простите за офтоп, но почему yoba? Как то неприлично :)
              Сергей Шлоков
              20 февраля 2015, 11:09
              +1
              У меня еще возник вопрос, почему 1, а не 2015? :)
              Максим Кузнецов
              20 февраля 2015, 11:19
              0
              Просто подумал, что у такого сниппета высокий порог вхождения, вот и назвал для наглядности..)
              Y.O.B.A.
          Сергей Шлоков
          20 февраля 2015, 11:06
          0
          т.е. сначала срабатывают все внутренние сниппеты/чанки, а уже потом — внешние
          Кстати, есть прием, позволяющий обойти это.
          [[[[*isfolder:is=`1`:then=`!pdoMenu? ...`]]]]
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11