Как сделать выборку по нескольким типам данных

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 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-шаблонизаторе его использовать не нужно.

Код макроса:

public function getQueryItems($typeId, $limit = 1, $order = 'ord', $template = 'default'){
			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.

Работа в xslt

Работа в tpl

Полезные ссылки