Как вывести случайную страницу

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

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

Задача

Если Вы столкнулись с данной задачей, то её можно решить с помощью выборки по usel, но usel довольно медленный механизм, поэтому мы рекомендуем воспользоваться API системы, а конкретнее Selector'ом. То есть нужно написать кастомный макрос, пример оного дан ниже.

Решение

%custom getRandomPages()% — выводит случайные иерархические объекты (страницы).

Параметры: custom getRandomPages([$template = 'default', $limit = 10, $o_type_id = false, $parent = false, $deep = 10])

$template

  Принимает имя шаблона, по которому выводится результат макроса, значение по-умолчанию 'default' В XSLT-шаблонизаторе не используется.

$limit

  Принимает количество страницы к выводу, значение по-умолчанию 10.

$o_type_id

  Принимает идентификатор типа данных, страницы которого нужно вывести. По-умолчанию будут возвращаться только товары. Можно указать несколько идентификаторов через знак ";".

$parent

  Принимает id или путь до раздела, в котором будут искаться товары, если не указан, то макрос макрос будет искать страницы во всех разделах.

$deep

  Принимает глубина поиска страниц внутри заданного раздела. Использовать этот параметр имеет смысл только вместе с параметром $parent, значение по-умолчанию 10.

Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php.

Код макроса

public function getRandomPages($template = 'default', $limit = 10, $o_type_id = false, $parent = false, $deep = 10){
		
	$pages = new selector('pages');		
	if(!$o_type_id){
		$pages->types('hierarchy-type')->name('catalog', 'object');
	}else{
		$o_type_id = preg_replace('/\s/', '', $o_type_id);		
		$o_types_arr = array();
		$o_types_arr = explode(';',$o_type_id);	
		$pages->types('object-type')->id($o_types_arr);
	}		
	if($parent){			
		$parentId = def_module::analyzeRequiredPath($parent);
		if($parentId === false) {
			throw new publicException('bad parent given');
		}
		$pages->where('hierarchy')->page($parentId)->childs(intval($deep));
	}		
	$pages->order('rand');
	$pages->limit(0, intval($limit));
	$result = $pages->result();
	
	list($itemsTemplate, $itemTemplate) = def_module::loadTemplates("catalog/{$template}", "items", "item");
	$item = array();
	$items = array();
	
	foreach($result as $page){
		$item['attribute:id'] = $page->id;
		$item['attribute:name'] =  $page->getName();
		$item['attribute:link'] =  $page->link;
		$items[] = def_module::parseTemplate($itemTemplate, $item);
	}
	
	$items = array('subnodes:items' => $items);
	
	return def_module::parseTemplate($itemsTemplate, $items);
}

Применение в xslt

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

udata://custom/getRandomPages//10/52;55

XML-ответ UData

<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="getRandomPages" generation-time="0.045779">
	<items>
		<item id="185" name="Новость2" link="/novosti2/novost2"/>
		<item id="328" name="tesdgsd" link="/luchshie_predlozheniya/tesdgs4"/>
		<item id="38" name="Доставка и оплата %custom getString()%" link="/delivery_and_payment"/>
		<item id="42" name="Страница не найдена" link="/notfound"/>
		<item id="322" name="test" link="/luchshie_predlozheniya/test"/>
		<item id="35" name="Лучшие предложения" link="/"/>
		<item id="339" name="rwsrfsdgsdgsdgsdg" link="/luchshie_predlozheniya/shit_rwsrfsdgsdgsdgsdg"/>
		<item id="363" name="тестовая_страница_стран" link="/shit_testovaya_stranica_stran"/>
		<item id="338" name="4" link="/luchshie_predlozheniya/824"/>
		<item id="325" name="tesdgsd" link="/luchshie_predlozheniya/tesdgs1"/>
	</items>
</udata>

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

<items>

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

<item>

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

@id

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

@link

   Ссылка на страницу полного текста новости.

@name

   Имя страницы.

Применение в tpl

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

%custom getRandomPages('default', '10', '52;55')%

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

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

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

items

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

%items%

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

item

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

%id%

   Выводит id страницы.

%link%

   Выводит uri страницы.

%name%

   Выводит имя новости.

Пример реализации для tpl

<?php

$FORMS = Array();

$FORMS['items'] = <<<END

<ul>
	%items%
</ul>

END;

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

<li>
	<a href="%link%">%name%</a>
</li>
	
END;

?>