Правильное оформление условия в шаблоне

Добрый день! Есть такая небольшая проблема, не могу правильно внедрить в условие шаблонизатора сниппет свой.

Код сниппета такой:

<?php
  $q = $modx->newQuery('msProductLink', array('link' => 1, 'master' => $parent));
  $q->select('slave');
  $resources = array();
  if ($q->prepare() && $q->stmt->execute()) {
	$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);	
  }
  return count($ids);
Называется он у меня SlaveGoods.
В чанке используя все возможности шаблонизатора пытаюсь выстроить это дело таким образом:

[[[[!SlaveGoods &parent=[[*id]]]] :is=`0`:then=`Ничего нет!`:else=`Если условие не выполняется и записи есть`]]
В результате это не работает все. Такой вариант вообще возможен или нет? Может через плейсхолдер свой включить это в условие? Хотя начальник мой говорит, что через плейсхолдеры свои не будет работать тоже. Как решить эту проблему?
Андрей
13 ноября 2014, 08:09
modx.pro
1
3 942
0

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

Наумов Алексей
13 ноября 2014, 11:29
0
...
return count($ids) ? $modx->returnChunk('yesChunk') : $modx->returnChunk('noChunk');
Иными словами — выносите логику в сниппет.
    Андрей
    13 ноября 2014, 11:52
    0
    может не returnChunk, а getChunk? Общий смысл понял, но пока не получается, по той причине, что ругается на конструкцию, которую вы написали мне.
      Андрей
      13 ноября 2014, 11:58
      0
      Переписал по-другому немного, в итоге просто ничего не выводит из этих чанков:

      if (count($ids) > 0)
        {    
          return $modx->getChunk('simular_goods'); 
        }
        else
        {    
          return $modx->getChunk('no_simular_goods'); 
        }
        Наумов Алексей
        13 ноября 2014, 12:04
        0
        Ну да, getChunk конечно же…

        что-то должно выводится в любом случае, где то ошибка скрывается =)

        Отлаживайте сниппет.
          Андрей
          13 ноября 2014, 12:21
          0
          Сниппет-то сам рабочий, когда пишу таким образом, выводит надпись и число записей, а когда загружаю чанки, то никакой реакции, хотя там hmtl-код есть.

          <?php
            $q = $modx->newQuery('msProductLink', array('link' => 1, 'master' => $parent));
            $q->select('slave');
            $resources = array();
            if ($q->prepare() && $q->stmt->execute()) 
            {
          	$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
            }
          
            echo "<b>Сниппет SlaveGoods работает!</b>";
            return count($ids);
            Андрей
            13 ноября 2014, 12:42
            0
            Сделал тестовый сниппет PrintChunk).

            там одна строка.
            return $modx->getChunk('no_simular_goods');


            И не работает. Как обращаться к чанкам правильно?
              Наумов Алексей
              13 ноября 2014, 14:32
              0
              Я даже не знаю… каких нибудь пробелов или служебных символов в именах чанков нет случайно?.. как бы должно работать
              Андрей
              13 ноября 2014, 12:59
              0
              Переписал немного по-другому:

              <?php
              echo "Сниппет PrintChunk работает!";
              $output = $modx->getChunk($chank);
              return $output;
              Создал такой параметр $chank и вызываю потом следующим образом:

              [[!PrintChunk? &chank=`tell_my`]]
              И ничего не выводит. Так как же вывести чанк из сниппета? Документация показывает, как будто я все правильно пишу, хотя на деле не работает это все… Не знаю даже что делать-то.
                Андрей
                13 ноября 2014, 13:13
                0
                Пишет только Сниппет PrintChunk работает! Смотрел документацию тут: ссылка
          Сергей Шлоков
          13 ноября 2014, 15:02
          0
          А вообще такая конструкция
          [[[[!SlaveGoods &parent=[[*id]]]] :is=`0`:then=`Ничего нет!`:else=`Если условие не выполняется и записи есть`]]
          должна работать?
          Обычно пишут так (сниппет используется в качестве фильтра):
          [[*id:SlaveGoods:is=`0`:then=`Ничего нет!`:else=`Если условие не выполняется и записи есть`]]
          Кроме того, я согласен с Алексеем, нужно вынести все в сниппет и вызывать просто сниппет. Фильтры работают медленнее. И еще хочу заметить, что в сниппетах не должно быть никаких echo и print.

          Так как же вывести чанк из сниппета?
          Ты так много говоришь про чанки, а где они? Покажи хотя бы чанк tell_my.
            Андрей
            14 ноября 2014, 05:04
            0
            В чанке tell_my записанно следующее:

            <div id="modal_form">
             <div id="feedbackFormWrap">
             <form id="id_form" method="post" action="" class="delive-form">
              <div class="box">
                <h2>Заказать обратный звонок</h2> 
            	<h3>Отправитель</h3>
                  <div class="block">
            	    <span class="cl" style:"padding-left:15px;">Имя</span>
                    <input type="text" id="name" name="name" size="25" maxlength="50" value="[[!+fi.name]]" /><br />	
                  </div>	
                  <div class="block">
            	    <span class="cl" style:"padding-left:15px;">Ваш телефон</span>
                    <input type="text" id="email" name="email" size="25" maxlength="50" value="[[!+fi.email]]" /><br />		
                  </div>
              </div>   
              <input name="submit" class="next-step" type="submit" id="submit" value="Отправить">
              <p style="margin-top:15px;">[[!+fi.validation_error_message]][[!+fi.error.attibute_name]]
              </p>   
             </form>
             </div>
            </div> 
            <div id="overlay"></div>
            Форма, которая не выводится.
            Написал в сниппете PrintChunk вывод echo чтобы проверить, что сниппет вообще работает. Не знаю почему такая простая конструкция не выводит чанк?

            <?php
            $output = $modx->getChunk($chank);
            return $output;
            Сниппет вызываю потом таким образом:

            [[!PrintChunk? &chank=`tell_my`]]
              Пашок
              Пашок
              14 ноября 2014, 05:45
              +1
              Пользуйся pdoTools для вывода чанков.

              // Подключаем pdoTools для работы с инлайновыми чанками
              $pdo = $modx->getService('pdoTools');
              
              $tpl = $modx->getOption('tpl', $scriptProperties, '@INLINE array(\'id\'=>\'[[+id]]\', \'date\'=>\'[[+date]]\', \'time\'=>\'[[+time]]\'); '); // шаблон вывода
              
              $return='';
              $return .= $pdo->getChunk($tpl, array('id'=>'1', 'date'=>'2', 'time'=>'4') );
              
              return $return;
                Андрей
                14 ноября 2014, 11:14
                0
                Сделал как вы написали, у меня в результате не чанк выводится, а данные массива таким образом:
                array('id'=>'1', 'date'=>'2', 'time'=>'4');
                Чтобы это могло значит? Ведь, вроде, по идее должен грузиться сам чанк с именем tpl…

                  Сергей Шлоков
                  15 ноября 2014, 11:26
                  0
                  Когда нет шаблона, тогда и выводится array(...).
                  Этот код правильный —
                  [[!PrintChunk? &chank=`tell_my`]]
                  Скорее всего имя чанка указано неправильно. Просто открой чанк, скопируй его название и вставь его в вызов сниппета.
                  Андрей
                  14 ноября 2014, 12:43
                  0
                  Задачу решил таким образом:

                  $pdo = $modx->getService('pdoTools');  
                  return $pdo->getChunk('tpl', array('id'=>'1', 'date'=>'2', 'time'=>'4'));
                    Пашок
                    Пашок
                    15 ноября 2014, 06:25
                    0
                    Ну хоть решил) Вообще параметр `tpl` должен был указываться в вызове сниппета, в нём должно быть имя чанка… а выводил данные т.н. массива, потому что скорее всего вы не указали параметр `tpl` и пришлось брать значение по-умолчанию… а по-умолчанию у нас инлайн чанк — "'@INLINE array(\'id\'=>\'[[+id]]\', \'date\'=>\'[[+date]]\', \'time\'=>\'[[+time]]\'); '"
                      Сергей Шлоков
                      15 ноября 2014, 11:29
                      0
                      return $pdo->getChunk('tpl', array('id'=>'1', 'date'=>'2', 'time'=>'4'));
                      В данном случае вызывается чанк с именем tpl, а как я понимаю, такого чанка нет. Вот и получается array().
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                17