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