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

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «category:API '''Актуально для версии 2.9.1''' == Задача == == Решение №1 == == Решение №2 == == Полезные ссы…»)
 
Строка 2: Строка 2:
 
'''Актуально для версии 2.9.1'''
 
'''Актуально для версии 2.9.1'''
 
== Задача ==
 
== Задача ==
== Решение №1 ==
+
Допустим, нам нужно нам нужно получить все объекты (объекты каталога), которые являются источником данных для страниц, отмеченных как активные.
== Решение №2 ==
+
Так активность это параметр страниц, сделать простую выборку по объектам, указав where('is_active')->equals(1) не получится.
 +
== Неправильное решение ==
 +
Попробуем сделать выборку по объектам каталога, получим массив идентификаторов объектов, переберем этот массив и по каждому id объекта получим id страницы,
 +
которая использует этот объект в качестве источника данных, из полученного массива id страниц выберем только активные, из полученных id активных страниц
 +
получим массив объектов для этих страниц и выведем их количество.
 +
<source lang="php">
 +
$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>";
 +
</source>
 +
Данное скприт решает задачу, но её можно решить более лаконично и красиво.
 +
== Правильное решение ==
 +
Логичнее будет произвести выборку по страницам, сразу отобрав активные, а из полученного массива id страниц, получить массив id объектов, которые являются
 +
источниками данных для этих страниц и вывести их количество:
 +
<source lang="php">
 +
$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>";
 +
</source>
 
== Полезные ссылки ==
 
== Полезные ссылки ==

Версия 15:47, 23 сентября 2013

Актуально для версии 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>";

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