Проверка TV из сниппета

Здравствуйте. Подскажите пожалуйста. Есть ресурсы modx за ними закреплены три TV с фотографиями,
у всех есть как минимуму по одному заполненному TV, остальные как дополнительные, у каких-то ресурсов они заполнены, у каких-то нет. Хотелось бы написать небольшой сниппет, который будет смотреть, какие тв заполнены — те и выводить, а пустые пропускать. Некое подобие галереи. К сожалению знаний не хватает, вот пока какие-то наброски, хочу хотя бы получить список этих тв:
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');

//Условие для выборки
$where = array(
       'contentid' => $id
       , 'tmplvarid:IN' => ["2,37,38"] // Можно ли так передать несколько tv для выборки?
     );

//Получаю TV
$tv = $modx->getObject('modTemplateVarResource', $where);
//return $tv->get('value');

//Хочу проверить, пробежаться в цикле, посмотреть что навыбирало
//Тут выводится первое tv из условия
while($tv){
    return $tv->get('value');
}
//Тут ничего не выводится
foreach($tv as $key){
     return $key;
}
Подскажите, как можно реализовать такую задачу со своим сниппетом?
Dolce
30 марта 2018, 09:01
modx.pro
2 786
0

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

Dolce
30 марта 2018, 12:06
0
Вспомнилось что while для массивов не подходит, только foreach
    Дмитрий
    30 марта 2018, 12:30
    +2
    Ну, типа такого.
    Но лучше просто установить нормальную галерею и пользоваться ею.
    $id = 1439;
    
    $tvs = $modx->getCollection('modTemplateVarResource',[
        'contentid' => $id,
        'tmplvarid:IN' => [3,2]
        ]);
    foreach ($tvs as $tv){
        echo $tv->get('value');
    }
      Dolce
      30 марта 2018, 12:50
      0
      Огромное спасибо, все работает!
      Галерею ставить не хочется, потому что уже у 2к ресурсов заданы фото через TV, а теперь у некоторых ресурсов появляются по несколько фотографий, их будет не так много, не хочется перезакреплять все фотографии заново, по этому и хотелось какое-то простое решение=)
      Dolce
      30 марта 2018, 13:56
      0
      Что в итоге получилось:
      Сниппет checkImg:
      <?php
      //Получаю id ресурса
      $id = $modx->resource->get('id');
      $tvInput = explode(',',$tvs);
      
      $tvList = $modx->getCollection('modTemplateVarResource',[
          'contentid' => $id,
          'tmplvarid:IN' => $tvInput
          ]);
          
        
        
      if (!empty($tvList))
      {
          echo '<div class="wrap">';
              echo '<div class="wrap__header">';
              echo '<span class="wrap__title">Фото</span>';
             echo '</div>';
              foreach ($tvList as $tv){
                   $v = $tv->get('value');
                   
                   echo '<a class="fancybox gallery__thumbItem" rel="gallery1" href="' . $v . '" title="" data-fancybox="images">';
                   echo '<img src="' .  $v  . '" title="" alt="" itemprop="image" class="thumbsImg">';      
                   echo '</a>';
                   
              }
             
              echo '</div>';
          
         
          
          
      }
      Принимает TV:
      [[!checkImg? &tvs=`37,38,39,41`]]
      Спасибо за помощь
        Дмитрий
        31 марта 2018, 16:17
        +1
        Ай ай ай, плохо так делать, плохо :) Совсем не тру. Зашивать HTML в код сниппета это плохой тон в программировании сниппетов в MODX. Лучше сделать у сниппета настройку tpl и выводить данные в чанк.
        Хотя бы так:
        <?php
        //Получаю id ресурса
        $id = $modx->resource->get('id');
        $tvInput = explode(',',$tvs);
        
        $tvList = $modx->getCollection('modTemplateVarResource',[
            'contentid' => $id,
            'tmplvarid:IN' => $tvInput
            ]);
            if (!empty($tvList)){
        	   if (!isset($tpl)){
        			$tpl = 'someshunk';   
        	   }
        	   $output = '';
                foreach ($tvList as $tv){
                     $v = $tv->get('value');
                     $output .= $modx->getChunk($tpl, [
        				'value' => $v
        			 ]);
                }
             
        }
        return $output;
        Код чанка:
        <a class="fancybox gallery__thumbItem" rel="gallery1" href="[[+value]]" title="" data-fancybox="images">
                <img src="[[+value]]" title="" alt="" itemprop="image" class="thumbsImg"></a>
        А вызывать, соответственно:
        <div class="wrap">
         <div class="wrap__header">
        <span class="wrap__title">Фото</span>
        </div>
        [[checkImg?&tpl=`somechunk`]]
        </div>
        могут быть ошибки, т.к. писал без проверки, но мысль 100% сохраняется)
          Dolce
          31 марта 2018, 16:39
          0
          Да, да, я за это тоже подумал, просто это «быстро» решение, у меня знаний мало, нужно было разбираться, как шаблоны передать, мог бы не успеть. Но так, как знаний у меня мало, то я как раз таки это все планирую переписать, тем самым обучится=)) Тут еще мне нужно аутер тпл сделать, для того что бы, если нет дополнительных фотографий не выводился и блок в целом, то есть вот это тоже нужно забрать в сниппет и не выводить если пусто, как-то так должно выглядеть:
          <div class="wrap">
           <div class="wrap__header">
          <span class="wrap__title">Фото</span>
          </div>
           [[+inner]]
          </div>
            Дмитрий
            31 марта 2018, 16:54
            0
            Делаете вторую настройку $tplOuter и точно так же через getChunk вставляете, ничего сложного. Вот тут я показывал пример с вложенностью чанков
        Dolce
        28 апреля 2018, 11:35
        0
        Сделал с шаблонами
        <?php
        //Получаю id ресурса
        $id = $modx->resource->get('id');
        // Тв из сниппета
        $tvInput = explode(',',$tvs);
        //Номер фотографии, елси нужно указать в атрибуте alt
        $idx = 0;
        
        // Шаблоны из сниппета
        $innerTpl = $innerTpl;
        $outerTpl = $outerTpl;
        
        //Результат на выход
        $output = "";
        
        $tvList = $modx->getCollection('modTemplateVarResource',[
            'contentid' => $id,
            'tmplvarid:IN' => $tvInput
            ]);
            
          
          
        if (!empty($tvList)){
           
            foreach ($tvList as $tv){
                $v = $tv->get('value');
                    //Записываем на выход значение в плейсхолдер и запихиваем его в шаблон inner
                	$output .= $modx->getChunk($innerTpl, [
                		'value' => $v,
                		'idx' => ++$idx
                	]);
            }
            $output = $modx->getChunk($outerTpl, [
                		'inner' => $output
                	]);
           
            
        }
        return $output;
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8