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

Материал из Umicms
Перейти к:навигация, поиск
Строка 14: Строка 14:
 
[[Файл:StructureCatalog.png]]
 
[[Файл:StructureCatalog.png]]
  
И хотим, чтобы товары из раздела "Музыкальные центры" не попали в результат, так как раздел каталога, где они находятся не отмечен, как активный.
+
И хотим, чтобы товары из раздела "Музыкальные центры" не попали в результат, так как раздел каталога, где они находятся не отмечен, как активный,
 +
в такой задаче одного Selector'a нам не хватит.
 
== Решение ==
 
== Решение ==
 +
Для этого нам нужно будет воспользоваться классом иерархической модели данных - umiHierarchy, см. "Полезные ссылки".
 +
Мы создадим результирующий массив, в который будут попадать только те страницы, родители которых отмечены, как активные, для этого модифицируем наш код:
 +
<source lang="php">
 +
//получаем экземпляр класса 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);
 +
 +
        //если родительская страница активно
 +
if($parentElement->getIsActive()== true){
 +
                //то запишем в результирующий массив, страницу из выборки
 +
$resultObject[]=$page;
 +
}
 +
}
 +
//для пример выведем число элементов в результирующем массиве
 +
echo count($resultObject);
 +
</source>
 
== Полезные ссылки ==
 
== Полезные ссылки ==

Версия 15:59, 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);
	
        //если родительская страница активно
	if($parentElement->getIsActive()== true){
                //то запишем в результирующий массив, страницу из выборки
		$resultObject[]=$page;
	}
}
//для пример выведем число элементов в результирующем массиве
echo count($resultObject);

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