Как производя выборку по объектам получить страницы в Selector

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9.1

Задача

Допустим, нам нужно нам нужно получить все объекты (объекты каталога), которые являются источником данных для страниц, отмеченных как активные. Так активность это параметр страниц, сделать простую выборку по объектам, указав where('is_active')->equals(1) не получится.

Неправильное решение

Попробуем сделать выборку по объектам каталога, получим массив идентификаторов объектов, переберем этот массив и по каждому id объекта получим id страницы, которая использует этот объект в качестве источника данных, из полученного массива id страниц выберем только активные, из полученных id активных страниц получим массив объектов для этих страниц и выведем их количество.

$hierarchy = umiHierarchy::getInstance(); 

$objects = new selector('objects');
$objects->types('object-type')->name('catalog', 'object');
$result1 = array();
foreach ($objects as $object)
{
$objectId = $object->id;
$pagesId = $hierarchy->getObjectInstances($objectId, true, true );
foreach ($pagesId as $pageId)
{
if ($hierarchy->getElement($pageId)->getIsActive()== true){
$result1[]=$hierarchy->getElement($pageId)->getObject()->id;
}
}
}
echo "<br/><strong>Всего объектов, имеющих страниц, отмеченные как активные: ".count($result1)."</strong>";

Данное скприт решает задачу, но её можно решить более лаконично и красиво.

Правильное решение

Логичнее будет произвести выборку по страницам, сразу отобрав активные, а из полученного массива id страниц, получить массив id объектов, которые являются источниками данных для этих страниц и вывести их количество:

$result2 = array();

$pages = new selector('pages');
$pages->types('object-type')->name('catalog', 'object');
$pages->where('is_active')->equals(1);
foreach ($pages as $page){
$pagesId= $page->id;
$result2[]=$hierarchy->getElement($pagesId)->getObject()->id;
}
echo "<br/><strong>Всего объектов, имеющих страниц, отмеченные как активные: ".count($result2)."</strong>";

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

Полезные ссылки