migxLoopCollection получаем все заполненные TV
Добрый день, подскажите пожалуйста. Есть TV типа MIGX в котором есть поля: image, title, description. Используется для новостей, т.е. имеем какой то набор подобных ресурсов у которых общий родитель.
Задача организовать галерею всех изображений из всех новостей.
Вот мы получаем объект перечисление ресурсов по контейнеру, и присоединяем к нему значение MIGX твшки, если оно есть.
Вопрос как получить значение поля image из MIGX TV, что бы в шаблоне его использовать?
Кто работал с этим сниппетом может подсказать можно ли таким образом получить списов всех заполненных TV?
Или как организовать подобную галерею?
Сейчас делаю свой сниппет который это делает, если решения лучше не будет в комментариях по готовности выложу.
Задача организовать галерею всех изображений из всех новостей.
Вот мы получаем объект перечисление ресурсов по контейнеру, и присоединяем к нему значение 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?
Или как организовать подобную галерею?
Сейчас делаю свой сниппет который это делает, если решения лучше не будет в комментариях по готовности выложу.
Комментарии: 1
Итак задача. У нас есть набор ресурсов с общим родителем, в которых есть галерея реализованная при помощи TV MIGX.
Сниппет который мы назовем: allgallery
Очень сильно сомневаюсь в грамотности решения с break; буду очень рад, если кто сможет подсказать, как лучше организовывать подобное.
p.s. Сниппет писал вчера, нужно было решение на скорую руку, сегодня смотрю на него, а у нас тут сложная операция по удалению гланд через ректальное отверстие.
Правильнее было бы получать итератор TemplateVarResources а по нему через getOne() получать ресурс. Тогда и костылей с break; не было бы, можно было использовать limit в newQuery. Хотя в этом случае столкнулся с проблемой выборки по parentid, скорее всего нужен сложный query с джойнами. сейчас попробуем.
Перепишу сниппет, выложу код, вдруг кому мои искания пригодятся.
Сниппет который мы назовем: 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 с джойнами. сейчас попробуем.
Перепишу сниппет, выложу код, вдруг кому мои искания пригодятся.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.