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

Материал из Umicms
Перейти к:навигация, поиск
 
(не показано 17 промежуточных версий этого же участника)
Строка 1: Строка 1:
[[category:Написание кастомных макросов]]
+
[[category:Написание кастомных макросов]][[category:API]]
 
'''Актуально для версии 2.9.1'''
 
'''Актуально для версии 2.9.1'''
 
== Выборки по USel ==
 
== Выборки по USel ==
Строка 6: Строка 6:
 
<source lang="xml">
 
<source lang="xml">
 
   <type id="55"/>
 
   <type id="55"/>
  <type id="82"/>
 
 
   <type id="73"/>
 
   <type id="73"/>
 
   <type id="31"/>
 
   <type id="31"/>
Строка 22: Строка 21:
 
<source lang="php">
 
<source lang="php">
 
$pages->types('object-type')->id(55);
 
$pages->types('object-type')->id(55);
$pages->types('object-type')->id(82);
 
 
$pages->types('object-type')->id(73);
 
$pages->types('object-type')->id(73);
 
$pages->types('object-type')->id(31);
 
$pages->types('object-type')->id(31);
Строка 46: Строка 44:
 
'''$typeId'''
 
'''$typeId'''
  
     Идентификатор иерархического типа, по которым будет осуществлять выборка, можно указать несколько типов через запятую.
+
     Идентификатор типа данных, по которым будет осуществлять выборка, можно указать несколько типов через через ";",  для tpl вызов будет типа %content getQueryItems('55;88','100','ord','default')%,
 +
    для xslt - udata/content/getQueryItems/(55;82)/100/ord/
 
'''$limit'''
 
'''$limit'''
  
Строка 67: Строка 66:
 
public function getQueryItems($typeId, $limit = 1, $order = 'ord', $template = 'default'){
 
public function getQueryItems($typeId, $limit = 1, $order = 'ord', $template = 'default'){
 
list($itemsTemplate, $itemTemplate) = def_module::loadTemplates("content/{$template}", "items", "item");
 
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('Указан некорректный тип данных');
 
 
$parsTypeId=explode(',',$typeId);
+
$pages = new selector('pages');
+
$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');
 
 
foreach($parsTypeId as $type){
+
$pages->limit(0,$limit);
$pages->types('object-type')->id($type);
+
$pages->order($order);
}
 
 
 
//Enter your query parameters here:
+
$item = array();
$pages->where('top-menu')->equals('1');
+
$items = array();
 
 
$pages->limit(0,$limit);
+
foreach($pages as $page){
$pages->order($order);
+
//Enter the required attributes of the results here:
+
$item['attribute:id'] = $page->id;
$item = array();
+
$item['attribute:link'] = $page->link;
$items = array();
+
$item['node:value'] = $page->getName();
 +
 +
$items[] = def_module::parseTemplate($itemTemplate, $item);
 +
}
 
 
foreach($pages as $page){
+
$items = array("subnodes:items" => $items);
//Enter the required attributes of the results here:
+
$result = def_module::parseTemplate($itemsTemplate, $items);
$item['attribute:id'] = $page->id;
 
$item['attribute:name'] =  $page->getName();
 
$item['node:value'] = $page->link;
 
 
$items[] = def_module::parseTemplate($itemTemplate, $item);
 
}
 
 
 
$items = array("subnodes:items" => $items);
+
return $result;
$result = def_module::parseTemplate($itemsTemplate, $items);
 
 
 
return $result;
+
 
 
}
 
}
 
</source>
 
</source>
Строка 104: Строка 108:
  
 
=== Работа в xslt ===
 
=== Работа в xslt ===
 +
'''Пример вызова для вывода информации об элементах'''
 +
 +
udata/emarket/getPriceList/no/(/shop/)/10/0/
 +
 +
'''XML-ответ UData'''
 +
 +
<source lang="xml">
 +
<udata module="content" method="getQueryItems" generation-time="0.054905">
 +
  <items>
 +
      <item id="37" link="/news1/">Новости</item>
 +
  </items>
 +
</udata>
 +
</source>
 +
 +
'''Элементы и атрибуты'''
 +
 +
'''<items>'''
 +
 +
    Ветвь, содержащая элементы item — страницы, удовлетворяющие параметрам выборки.
 +
'''<item>'''
 +
 +
    Элемент, описывающий отдельную страницу.
 +
'''@id'''
 +
 +
    Идентификатор страницы.
 +
'''@link'''
 +
 +
    Путь до страницы.
 +
 +
'''Примеры использования'''
 +
 +
Для того, чтобы вставить результат работы макроса в определенное место на странице, необходимо вызвать макрос по протоколу UData. Укажем в шаблоне дизайна место вывода при помощи инструкции apply-templates:
 +
<source lang="xml">
 +
  <xsl:apply-templates select="document('udata://content/getQueryItems/30/1/')/udata"/>
 +
</source>
 +
Теперь необходимо описать шаблон, обрабатывающий результаты макроса и выводящий весь перечень элементов:
 +
<source lang="xml">
 +
  <xsl:template match="udata[@module = 'content'][@method = 'getQueryItems']">
 +
      <xsl:apply-templates select="items/item" mode="getQueryItems"/>
 +
  </xsl:template>
 +
</source>
 +
Теперь опишем шаблон для для отдельного элемента:
 +
<source lang="xml">
 +
<xsl:template match="item" mode="getQueryItems">
 +
  <a href="{@link}">
 +
      <xsl:value-of select="." />
 +
  </a>
 +
</xsl:template>
 +
</source>
 +
На странице выведутся названия выбранных страниц, являющиеся ссылками на выбранные страницы.
 
=== Работа в tpl ===
 
=== Работа в tpl ===
 +
Вывод меню осуществляется по шаблону, указанному в параметре template. Вы можете не указывать этот параметр, тогда для вывода будет использован шаблон по умолчанию — default.tpl.
 +
 +
'''Используемые шаблоны'''
 +
 +
Макрос оперирует шаблонами, находящимися в каталоге /tpls/content/.
 +
 +
'''Используемые блоки шаблона'''
 +
 +
'''items'''
 +
 +
Выводит обрамляющий блок для вывода результатов работы макроса, куда будут подставляться результирующие страницы. Отдельных страницы будут отрисованы по блоку item.
 +
 +
%items%
 +
 +
    Выводит список страниц, отрисованных с помощью блока item.
 +
 +
'''item'''
 +
 +
Отвечает за вывод отдельной страницы, полученной в результате работы макроса.
 +
 +
%id%
 +
 +
    Выводит id полученной страницы.
 +
%link%
 +
 +
    Выводит url полученной страницы.
 +
%value%
 +
 +
    Выводит имя полученной страницы.
 +
 +
В шаблоне дизайна поставьте макрос %content getQueryItems('55', '3', 'ord', 'sample')%.
 +
 +
Создайте файл sample.tpl в папке /tpls/content/ следующего содержания:
 +
 +
<source lang="php">
 +
<?php
 +
  $FORMS = Array();
 +
 +
  $FORMS['items'] = <<<END
 +
 +
  %items%
 +
 +
  END;
 +
 +
  $FORMS['item'] = <<<END
 +
 +
  <a href="%link%">%value%</a>
 +
 +
  END;
 +
?>
 +
</source>
 +
На странице выведутся названия выбранных страниц, являющиеся ссылками на выбранные страницы.
 
== Полезные ссылки ==
 
== Полезные ссылки ==
 +
*Документация по USel [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/]
 +
*Документация по Selector [http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/vyborki/selector/]
 +
*Примеры выборок по Selector [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/proizvolnye_vyborki/selector/]

Текущая версия на 11:42, 17 октября 2013

Актуально для версии 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

   Идентификатор типа данных, по которым будет осуществлять выборка, можно указать несколько типов через через ";",  для tpl вызов будет типа %content getQueryItems('55;88','100','ord','default')%,
   для xslt - udata/content/getQueryItems/(55;82)/100/ord/

$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/emarket/getPriceList/no/(/shop/)/10/0/

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

Вывод меню осуществляется по шаблону, указанному в параметре template. Вы можете не указывать этот параметр, тогда для вывода будет использован шаблон по умолчанию — default.tpl.

Используемые шаблоны

Макрос оперирует шаблонами, находящимися в каталоге /tpls/content/.

Используемые блоки шаблона

items

Выводит обрамляющий блок для вывода результатов работы макроса, куда будут подставляться результирующие страницы. Отдельных страницы будут отрисованы по блоку item.

%items%

   Выводит список страниц, отрисованных с помощью блока item.

item

Отвечает за вывод отдельной страницы, полученной в результате работы макроса.

%id%

   Выводит id полученной страницы.

%link%

   Выводит url полученной страницы.

%value%

   Выводит имя полученной страницы.

В шаблоне дизайна поставьте макрос %content getQueryItems('55', '3', 'ord', 'sample')%.

Создайте файл sample.tpl в папке /tpls/content/ следующего содержания:

<?php
   $FORMS = Array();
 
   $FORMS['items'] = <<<END

   %items%

   END;
 
   $FORMS['item'] = <<<END

   <a href="%link%">%value%</a>

   END;
?>

На странице выведутся названия выбранных страниц, являющиеся ссылками на выбранные страницы.

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

  • Документация по USel [1]
  • Документация по Selector [2]
  • Примеры выборок по Selector [3]