migxLoopCollection получаем все заполненные TV

Добрый день, подскажите пожалуйста. Есть TV типа MIGX в котором есть поля: image, title, description. Используется для новостей, т.е. имеем какой то набор подобных ресурсов у которых общий родитель.

Задача организовать галерею всех изображений из всех новостей.


Вот мы получаем объект перечисление ресурсов по контейнеру, и присоединяем к нему значение MIGX твшки, если оно есть.

[[migxLoopCollection? 
    &classname=`modResource`
    &joins=`[
    {"alias":"migxTV","classname":"modTemplateVarResource","on":"migxTV.contentid=modResource.id AND migxTV.tmplvarid=2"}
		]`
    &selectfields=`id,pagetitle`
    &where=`{"parent":"15"}` 
]]

Вопрос как получить значение поля image из MIGX TV, что бы в шаблоне его использовать?

Кто работал с этим сниппетом может подсказать можно ли таким образом получить списов всех заполненных TV?
Или как организовать подобную галерею?

Сейчас делаю свой сниппет который это делает, если решения лучше не будет в комментариях по готовности выложу.
Vladimir Alekhin
15 апреля 2019, 15:59
modx.pro
1 185
0

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

Vladimir Alekhin
16 апреля 2019, 10:24
0
Итак задача. У нас есть набор ресурсов с общим родителем, в которых есть галерея реализованная при помощи TV MIGX.

Сниппет который мы назовем: allgallery

<?php
//$tpl              - template chunk
//$parentid         - id of container resource
//$tvid             - id of TV
//limit             - image limit

/*
CALL EXAMPLE

                    [[allgallery?
                        &parentid=`15`
                        &tpl=`all_gallery_line_tpl`
                        &tvid=`2`
                        &limit=`12`
                    ]]
*/


$q = $modx->newQuery('modResource', array('parent' => $parentid));
$count = 0;
$resources = $modx->getIterator("modResource",$q);                                                  //получаем перечисление дочерних ресурсов по отношению к ID ресурса, переданного в параметрах.
$output="";                                                                                         //обнуляем переменную вывода
    foreach($resources as $resource) {
            if (($count < $limit) && (is_object($resource))) {
                $resid = $resource->get("id");                                                      //получаем поле самого ресурса, что бы использовать в шаблоне.
                $cpt =   $resource->get("pagetitle");                                               //получаем поле самого ресурса, что бы использовать в шаблоне.
                $migxs = $resource->getMany('TemplateVarResources',array("tmplvarid"=>$tvid));      //получаем TV указанного в параметрах ID.
                if ($count < $limit) {
                    foreach ($migxs as $migx) 
                    {
                        $migxobj = json_decode($migx->get("value"));                                //получаем json из TV и парсим в массив объектов.
                        foreach($migxobj as $migxentry) {
                            if ($count < $limit) {
                                $image = array();                                                   //временная переменная-массив для сборки всех необходимых полей.
                                $image["image"] = $migxentry->image;                                //из MIGX получаем нужные поля изображение и тайтл
                                $image["title"] = $migxentry->title;                                //из MIGX получаем нужные поля изображение и тайтл
                                $image["resid"] = $resid;                                           //получаем нужные поля из ресурса ID
                                $image["cpt"] = $cpt;                                               //получаем нужные поля из ресурса pagetitle
                                
                                                                                                    //В этой секции Вам нужно организовать сбор необходимых данных, для передачи в чанк
                                
                                $output .= $modx->getChunk($tpl, $image);                           //рендерим в чанк, что указан в параметрах, добавляем к выводу
                                $count++;                                                           //костыль с лимитом. увеличиваем счетчик отрендеренных картинок.
                            }
                            else {
                                    break;                                                          //break для прерывание циклов, при достижении количества фотографий по лимиту
                                }
                        }
                    }
                } else {
                break;                                                                              //break для прерывание циклов, при достижении количества фотографий по лимиту
                }
            } else {
                break;                                                                              //break для прерывание циклов, при достижении количества фотографий по лимиту
            }
    }
    
return $output;                                                                                     //вывод накопленного рендера

Очень сильно сомневаюсь в грамотности решения с break; буду очень рад, если кто сможет подсказать, как лучше организовывать подобное.

p.s. Сниппет писал вчера, нужно было решение на скорую руку, сегодня смотрю на него, а у нас тут сложная операция по удалению гланд через ректальное отверстие.
Правильнее было бы получать итератор TemplateVarResources а по нему через getOne() получать ресурс. Тогда и костылей с break; не было бы, можно было использовать limit в newQuery. Хотя в этом случае столкнулся с проблемой выборки по parentid, скорее всего нужен сложный query с джойнами. сейчас попробуем.
Перепишу сниппет, выложу код, вдруг кому мои искания пригодятся.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1