Здравствуйте, коллеги и читатели блога UMI.CMS! Надеюсь, вы приятно удивились, увидев новое лицо среди авторов блога. Только в отличие от прочих авторов я не являюсь сотрудником Юмисофт - просто я давно и в большом количестве разрабатываю сайты на UMI.CMS. За время работы с системой у меня накопилась книга интересных рецептов для UMI.CMS, которыми я планирую делиться с вами в этом блоге. Сегодня я начну с вывода случайного ID страницы, начиная от родителя.
Данное решение полезно когда необходимо вывести на сайте текст случайной статьи или отзыва.
В файле /classes/modules/custom.php сразу после строки
//TODO: Write your own macroses here
напишите:
public function random_child_id($element_id) {
$childs = Array();
$childs = umiHierarchy::getInstance()->getChilds($element_id);
$rand_element = array_rand($childs, 1);
return $rand_element;
}
Сам макрос имеет вид (внимание, после первого символа % поставлен пробел, уберите его после вставки в шаблон):
% custom random_child_id([element_id = '0'])%
element_id - id родителя - обязательный параметр
Макрос возвращает ID случайного потомка
Недостаток макроса в том, что при вызове макроса с одинаковыми параметрами несколько раз он будет возвращать одинаковый результат, т.к. результат отработки макросов кешируется перед сборкой шаблона.
В своем следующем сообщении я расскажу о том, как случайным образом выводить несколько статей.
Комментирование доступно только авторизованным пользователям.
Пожалуйста, зарегистрируйтесь или войдите на сайт.
% catalog viewObject(% custom random_child_id(23011)%, preview)%
и в итоге получил рандомный вывод хомячков из каталога демо-сайта. (его id=23011)
и я так понимаю вывод больше одного объекта данным способом не осуществим?
// случайное фото
public function photo_random($id) {
//создаем объект umiSelection
$myUmiSelect = new umiSelection();
//включаем фильтр по дереву страниц
$myUmiSelect -> setHierarchyFilter(true);
//выбирать будем только подстраницы к странице $id с вложенностью 10 подразделов;
$myUmiSelect -> addHierarchyFilter($id,5);
//выбираем только активные страницы
$myUmiSelect -> setActiveFilter (true);
//включаем фильтр по типу иерархии (если фильтр по типу объекта, то - setObjectTypeFilter);
$myUmiSelect -> setElementTypeFilter (true);
//выбираем только фотографии (тип иерархии - 1);
$myUmiSelect -> addElementType(1);
//запускаем выборку
$res = umiSelectionsParser::runSelection($myUmiSelect);
//считаем размер выборки
$count = umiSelectionsParser::runSelectionCounts($myUmiSelect);
//В $res будет массив id всех подстаниц всех подразделов к заданному разделу в виде [0]->$id1;[1]->$id2...
//ид случайной страницы
// $rand_page_id = $res[mt_rand(0,$count-1)];
// код ниже - если есть подразделы
$m = "";
while($m==""){
$rand_page_id = $res[mt_rand(0,$count-1)];
$element = umiHierarchy::getInstance()->getElement($rand_page_id);
$m = $element->getValue("photo");
}
return $rand_page_id;
}
Недостаток - громоздкость, то, что применяется к конкретному типу объекта - фото, новость, объект каталога... Но в принципе это можно вынести в передаваемые параметры и тогда вообще все будет тип-топ :))
Плюс этого решения - простота
Чуть позже опубликую решение, позволяющее выводить несколько обьектов каталога, преамбул статей, отзывов и прочего
выкладывай еще
Пример.
Страница (http://www.joblibrary.ru/article/) куда надо вывести список всех статей под рубрик и листалку страниц. Как это реализовать?