Как вывести случайную страницу
Актуально для версии 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_block
Выводит обрамляющий блок для вывода результатов работы макроса, куда будут подставляться результирующие элементы. Отдельные новости будут отрисованы по блоку item.
%items%
Выводит список страниц, отрисованных с помощью блока item.
%item%
Отвечает за вывод отдельной страницы, полученной в результате работы макроса.
%id%
Выводит id страницы.
%link%
Выводит uri страницы.
%name%
Выводит имя новости.