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

Материал из Umicms
Перейти к:навигация, поиск
Строка 41: Строка 41:
 
$parentElement=$hierarchy->getElement($parentId);
 
$parentElement=$hierarchy->getElement($parentId);
 
 
         //если родительская страница активно
+
         //если родительская страница активна (узнаем это с помощью метода getIsActive(), см. "Полезные ссылки")
 
if($parentElement->getIsActive()== true){
 
if($parentElement->getIsActive()== true){
 
                 //то запишем в результирующий массив, страницу из выборки
 
                 //то запишем в результирующий массив, страницу из выборки
Строка 55: Строка 55:
 
*Документация по методу getParent() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchy/getparent/]
 
*Документация по методу getParent() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchy/getparent/]
 
*Документация по методу getElement() [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchy/getelement/]
 
*Документация по методу 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_ierarhii/umihierarchyelement/getisactive/]

Версия 16:04, 26 сентября 2013

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

Задача

Допустим, нам нужно получить все страницы объектов каталога, отмеченные как активные, из какой-либо раздела с определенной вложенность. Это сделать очень просто, в документации, см. "Полезные ссылки", есть примеры:

$pages = new selector('pages'); 
$pages->types('object-type')->name('catalog', 'object'); 
$pages->where('hierarchy')->page('/shop/')->childs(10); 
$pages->where('is_active')->equals(1);

Но, например мы имеем следующую структуру:

StructureCatalog.png

И хотим, чтобы товары из раздела "Музыкальные центры" не попали в результат, так как раздел каталога, где они находятся не отмечен, как активный, в такой задаче одного Selector'a нам не хватит.

Решение

Для этого нам нужно будет воспользоваться классом иерархической модели данных - umiHierarchy, см. "Полезные ссылки". Мы создадим результирующий массив, в который будут попадать только те страницы, родители которых отмечены, как активные, для этого модифицируем наш код:

//получаем экземпляр класса umiHierarchy
$hierarchy = umiHierarchy::getInstance(); 
//инициализируем массив, в который попадут только нужные нам объекты
$resultObject = array();

//делаем выборку по Selector, которая была приведена ранее
$pages = new selector('pages'); 
$pages->types('object-type')->name('catalog', 'object'); 
$pages->where('hierarchy')->page('/shop/')->childs(10); 
$pages->where('is_active')->equals(1); 

//перебираем массив страниц, полученных в выборке страниц
foreach($pages as $page){
        
        //инициализируем переменную $pageId и присваиваем ей id страницы
	$pageId=$page->id;
        //инициализируем переменную $parentId и присваиваем ей идентификатор родительской страницы с помощью getParent(), см. "Полезные ссылки"
	$parentId=$hierarchy->getParent($pageId);
        //инициализируем переменную $parentElement и присваиваем ей экземпляр страницы с помощью getElement(), см. "Полезные ссылки"
	$parentElement=$hierarchy->getElement($parentId);
	
        //если родительская страница активна (узнаем это с помощью метода getIsActive(), см. "Полезные ссылки")
	if($parentElement->getIsActive()== true){
                //то запишем в результирующий массив, страницу из выборки
		$resultObject[]=$page;
	}
}
//для пример выведем число элементов в результирующем массиве
echo count($resultObject);

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

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