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

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

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

Выборки по USel

По Usel, , см. "Полезные ссылки", нельзя получить адекватные результаты выборки по нескольким значениям тега <type> из-за особенностей протокола, если указывать в type id:

  <type id="55"/>
  <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:link'] = $page->link;
					$item['node:value'] =  $page->getName();
				
					$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

Пример вызова

udata://content/getQueryItems/30

XML-ответ UData

<udata module="content" method="getQueryItems" generation-time="0.054905">
   <items>
      <item id="37" link="/news1/">Новости</item>
   </items>
</udata>

Элементы и атрибуты

<items>

   Ветвь, содержащая элементы item — страницы, удовлетворяющие параметрам выборки.

<item>

   Элемент, описывающий отдельную страницу.

@id

   Идентификатор страницы.

@link

   Путь до страницы.

Примеры использования

Для того, чтобы вставить результат работы макроса в определенное место на странице, необходимо вызвать макрос по протоколу UData. Укажем в шаблоне дизайна место вывода при помощи инструкции apply-templates:

   <xsl:apply-templates select="document('udata://content/getQueryItems/30/1/')/udata"/>

Теперь необходимо описать шаблон, обрабатывающий результаты макроса и выводящий весь перечень элементов:

   <xsl:template match="udata[@module = 'content'][@method = 'getQueryItems']">
      <xsl:apply-templates select="items/item" mode="getQueryItems"/>
   </xsl:template>

Теперь опишем шаблон для для отдельного элемента:

<xsl:template match="item" mode="getQueryItems">
   <a href="{@link}">
      <xsl:value-of select="." />
   </a>
</xsl:template>
На странице выведутся названия выбранных страниц, являющиеся ссылками на выбранные страницы.

Работа в tpl

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