Как сделать выборку по нескольким типам данных — различия между версиями
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
Строка 64: | Строка 64: | ||
<source lang="php"> | <source lang="php"> | ||
− | |||
list($itemsTemplate, $itemTemplate) = def_module::loadTemplates("content/{$template}", "items", "item"); | list($itemsTemplate, $itemTemplate) = def_module::loadTemplates("content/{$template}", "items", "item"); | ||
Строка 76: | Строка 75: | ||
foreach($parsTypeId as $type){ | foreach($parsTypeId as $type){ | ||
− | + | $pages->types('object-type')->id($type); | |
} | } | ||
//Enter your query parameters here: | //Enter your query parameters here: | ||
Строка 104: | Строка 103: | ||
− | } | + | } |
</source> | </source> | ||
Версия 11:11, 11 сентября 2013
Актуально для версии 2.9.1
Содержание
Выборки по USel
По Usel, , см. "Полезные ссылки", нельзя получить адекватные результаты выборки по нескольким значениям тега <type> из-за особенностей протокола, если указывать в type id:
<type id="55"/>
<type id="82"/>
<type id="73"/>
<type id="31"/>
то в результатах выборки будут присутствовать только несколько типов, а если указать в type module/method:
<type module="news" method="rubric" />
<type module="catalog" method="category"/>
<type module="content" method="page" />
<type module="photoalbum" method="album"/>
то выборка будет произведена только по первой строке. Для решения задачи нужно использовать Selector, см. "Полезные ссылки"
Выборки по Selector
Используя Selector мы можем указать сколько угодно значений типов у метода types(), как таким:
$pages->types('object-type')->id(55);
$pages->types('object-type')->id(73);
$pages->types('object-type')->id(31);
так и таким способом:
$pages->types('object-type')->name('news','rubric');
$pages->types('object-type')->name('catalog','category');
$pages->types('object-type')->name('content','');
$pages->types('object-type')->name('photoalbum','album');
В результатах выборки будут присутствовать все заданные типы данных.
Прикладной пример
Разберем пример, допустим нам нужно получить все страницы контента, разделы каталога, фотоальбомы и рубрики новостей, в типе данных у которых указано поле top-menu со значением 1.
Для реализации этой задачи был разработан макрос getQueryItems(), если Вам нужны другие параметры выборки, то его очень просто модифицировать, имея под рукой документацию по API, см. "Полезные ссылки".
%getQueryItems()% — Выводит результаты выборки по определенному шаблону.
Параметры: getQueryItems([$typeId, $limit = '1', $order = 'ord', $template = 'default'])
$typeId
Идентификатор иерархического типа, по которым будет осуществлять выборка, можно указать несколько типов через запятую.
$limit
Ограничитель, который указывает максимальное кол-во результатов выборки, которые необходимо вывести, по-умолчанию равен единице.
$order
Определяет порядок вывода результатов выборки, по-умолчанию принимает значение 'ord', может принимать следующие значения: name - упорядочить по названию ord - упорядочить по расположению в дереве rand - упорядочить случайным образом updatetime - упорядочить по дате последнего изменения id - упорядочить по id
$template
Имя шаблона, по которому следует вывести меню сайта.В XSLT-шаблонизаторе его использовать не нужно.
Код макроса:
list($itemsTemplate, $itemTemplate) = def_module::loadTemplates("content/{$template}", "items", "item");
if (!isset($typeId)) throw new publicException('Указан некорректный тип данных');
$parsTypeId=explode(',',$typeId);
if (!is_array($parsTypeId)) throw new publicException('Указан некорректный тип данных');
$pages = new selector('pages');
foreach($parsTypeId as $type){
$pages->types('object-type')->id($type);
}
//Enter your query parameters here:
$pages->where('top-menu')->equals('1');
$pages->limit(0,$limit);
$pages->order($order);
$item = array();
$items = array();
foreach($pages as $page){
//Enter the required attributes of the results here:
$item['attribute:id'] = $page->id;
$item['attribute:name'] = $page->getName();
$item['node:value'] = $page->link;
$type = umiHierarchyTypesCollection::getInstance()->getType($page->getTypeId());
$item['attribute:method'] = $type->getExt();
$items[] = def_module::parseTemplate($itemTemplate, $item);
}
$items = array("subnodes:items" => $items);
$result = def_module::parseTemplate($itemsTemplate, $items);
return $result;
}
Для того, чтобы работать с этим макросом поместите это код в /classes/modules/custom.php или в __custom.php какого-либо модуля, если воспользуетесь вторым вариантом, то не забудьте указать имя метода в permissions.custom.php.