Исключение виртуальных копий страниц из выборки
Актуально для версии 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 уже можно достать что угодно.