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

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 2 промежуточные версии этого же участника)
Строка 4: Строка 4:
 
Допустим, нам нужно нам нужно получить все объекты (объекты каталога), которые являются источником данных для страниц, отмеченных как активные.
 
Допустим, нам нужно нам нужно получить все объекты (объекты каталога), которые являются источником данных для страниц, отмеченных как активные.
 
Так активность это параметр страниц, сделать простую выборку по объектам, указав where('is_active')->equals(1) не получится.
 
Так активность это параметр страниц, сделать простую выборку по объектам, указав where('is_active')->equals(1) не получится.
== Неправильное решение ==
+
== Решение №1 ==
 
Попробуем сделать выборку по объектам каталога, получим массив идентификаторов объектов, переберем этот массив и по каждому id объекта получим id страницы,
 
Попробуем сделать выборку по объектам каталога, получим массив идентификаторов объектов, переберем этот массив и по каждому id объекта получим id страницы,
 
которая использует этот объект в качестве источника данных, из полученного массива id страниц выберем только активные, из полученных id активных страниц
 
которая использует этот объект в качестве источника данных, из полученного массива id страниц выберем только активные, из полученных id активных страниц
Строка 27: Строка 27:
 
                 //если страница активна
 
                 //если страница активна
 
if ($hierarchy->getElement($pageId)->getIsActive()== true){
 
if ($hierarchy->getElement($pageId)->getIsActive()== true){
                         //то добавляем в массив result1 id объекта этой страницы
+
                         //то добавляем в массив result1 id объекта, являющегося источником данных для этой страницы
 
$result1[]=$hierarchy->getElement($pageId)->getObject()->id;
 
$result1[]=$hierarchy->getElement($pageId)->getObject()->id;
 
}
 
}
Строка 36: Строка 36:
 
</source>
 
</source>
 
Данное скрипт решает задачу, но её можно решить более лаконично и красиво.
 
Данное скрипт решает задачу, но её можно решить более лаконично и красиво.
== Правильное решение ==
+
== Решение №2 ==
 
Логичнее будет произвести выборку по страницам, сразу отобрав активные, а из полученного массива id страниц, получить массив id объектов, которые являются
 
Логичнее будет произвести выборку по страницам, сразу отобрав активные, а из полученного массива id страниц, получить массив id объектов, которые являются
 
источниками данных для этих страниц и вывести их количество:
 
источниками данных для этих страниц и вывести их количество:
Строка 62: Строка 62:
 
В результате, мы получили тот же массив идентификаторов, уменьшив скорость исполнения скрипта и сделав его более понятным.
 
В результате, мы получили тот же массив идентификаторов, уменьшив скорость исполнения скрипта и сделав его более понятным.
 
== Полезные ссылки ==
 
== Полезные ссылки ==
 +
*Документация по методу getInstance() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchy/getinstance/]
 +
*Документация по Selector [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/vyborki/selector/]
 +
*Документация по методу getObjectInstances() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchy/getobjectinstances/]
 +
*Документация по методу getElement() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchy/getelement/]
 +
*Документация по методу getIsActive() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umifieldsgroup/getisactive/]
 +
*Документация по методу getObject() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobjectscollection/getobject/]

Текущая версия на 16:07, 23 сентября 2013

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