Исключение виртуальных копий страниц из выборки

Материал из Umicms
Версия от 13:13, 14 июня 2013; Alexei (обсуждение | вклад) (Новая страница: «'''Актуально для версии 2.9''' Если у Вас на сайте присутствуют виртуальные копии страниц, то,…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

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

Если у Вас на сайте присутствуют виртуальные копии страниц, то, когда Вы делаете выборку с помощью USel, в выборку попадают все эти виртуальные копии, что не очень удобно. Хотелось бы, чтобы в выборку попадал только 1 экземлпляр, а остальные копии просто не выводились. В иерархии виртуальные копии являются отдельными объектами, у которых есть свои идентификаторы. Средствами USel исключить виртуальные копии нельзя, поэтому рассмотрим следующий вариант как это можно реализовать:

Виртуальные копии страниц в качестве источника данных используют один и тот же объект, в таком случае можно средствами API произвести выборку страниц и при выборке страниц получать id объекта, который используется в качестве источника , в случае появления объекта, который уже был у прошлых страниц ничего не возвращать. Для выборки мы рекомендуем использовать класс selector, документация по которому доступна по адресу: http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/proizvolnye_vyborki/selector/

Получить объект, который используется в качестве источника информации для страницы можно методом getObject() класса umiHierarchyElement, описание работы c этим классом доступно по адресу: http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_ierarhii/umihierarchyelement/

Ну а теперь и сам пример реализации.

Данный код необходимо вставить в шаблон кастома, classes/modules/custom.php, после строки "//TODO: Write your own macroses here"

public function noVirtual ($id) {
 $mas = array();
 $pages = new selector('pages');
 $pages->types('object-type')->id($id);
 $pages->types('hierarchy-type')->name('catalog', 'object');
 $pages->where('best_item')->equals(1);

 foreach($pages as $page) {
    
    $a = $page->getObject();
    $a_id = $a->id;
      if (!in_array($a_id, $mas)) {
      
        $mas[]=$a_id;
        $item_arr['attribute:id']=$a_id;
        $item_arr['node:value']= $page->name;
        $items[] = $item_arr;
     }
 }
$block_arr['items']['nodes:item'] = $items;
return $block_arr;

}

Данный кастом проводит выборку по полю best_item, Вы передаете id типа данных, по которому следует эту выборку запустить, и кастом вернет выборку уже без виртуальных копий страниц. Если нужно вывести больше информации об объектах выборки - на выходе кастом отдает имя объекта и его id, а по его id уже можно достать что угодно.