Как сделать выборку чтобы в нее попали только страницы из активных разделов
Актуально для версии 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);
Но, например мы имеем следующую структуру:
И хотим, чтобы товары из раздела "Музыкальные центры" не попали в результат, так как раздел каталога, где они находятся не отмечен, как активный, в такой задаче одного 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);