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

Материал из Umicms
Версия от 16:07, 23 сентября 2013; Mad grant (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

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

Задача

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

Решение №1

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

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

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

Решение №2

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

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

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

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

  • Документация по методу getInstance() [1]
  • Документация по Selector [2]
  • Документация по методу getObjectInstances() [3]
  • Документация по методу getElement() [4]
  • Документация по методу getIsActive() [5]
  • Документация по методу getObject() [6]