Отзывы клиентов

Степан Меркулов, основатель сообщества web-разработчиков SAM-site.ru
Знакомство с данной системой управления начал для собственных нужд. Был поражен ее простотой и функциональностью. Очень быстро понял, что именно эта система позволит не только реализовать собственные потребности и амбиции, но и помочь многим, кому нужен собственный инструмент для работы в Интернете
Все отзывы о UMI.CMS
Новости UMI.CMS

Уважаемые посетители! Сообщаем вам, что Служба Заботы прекратила поддержку UMI.CMS на форуме.

Для связи со Службой Заботы пользуйтесь формой обратной связи

Рандомный вывод статей

Реализация рандома стандартными средствами мягко говоря неудобна. По этому делюсь как сделать вывод блока случайных статей, новостей, отзывов и прочего...... пример реализации можно посмотреть сдесь - http://www.life-rosno.ru
Цитировать
Jeket
(17.01.2009 23:38)

Re: Рандомный вывод статей

Способ №1
написать макрос, который получает ID случайного потомка... и далее работать с этим ID служебными средствами

Вот текст макроса...

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 - id родителя)%



Недостатки:
При вызове макроса с одинаковыми параметрами несколько раз он будет возвращать одинаковый результат, т.к. результат отработки макросов кешируеться перед сборкой шаблона
b]Преимущества:
Довольно простой
Цитировать
Jeket
(17.01.2009 23:50)

Re: Рандомный вывод статей

Способ №2 - посложнее но более интересный

Пишем это все в custom.php

public function random_article($element_id, $template = 'default', $quantity = '1', $char_quantity = '0', $strip_tags = 1) {
list($template_block, $template_line) = def_module::loadTemplates("./tpls/custom/{$template}.tpl", "article_block_view", "article_line_view");
$lines = Array();

$childs = Array();
$childs = umiHierarchy::getInstance()->getChilds($element_id);
$rand_element_id = array_rand($childs, $quantity);

foreach($rand_element_id as $element_id) {
$article = u miHierarchy::getInstance()-> ;getElement($element_id)->g etObject();
$article_content = $article->getValue('content');
if ($strip_tags == 1) $article_content = strip_tags($article_content);
if ($char_quantity > 0) $article_content = $this->CutStr($article_content, ' ,.;nr', $char_quantity);
$line_arr = Array();
$line_arr['attribute:id'] = $element_id;
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
$line_arr['attribute:name'] = $article->getName();
$line_arr['node:content'] = $article_content;

$lines[] = def_module::parseTemplate($template_line, $line_arr);
}
$block_arr['subnodes:items'] = $lines;

return def_module::parseTemplate($template_block, $block_arr);
}

public function CutStr($S, $Chars, $FromPos = 0) {
if (strlen($S) <= $FromPos) return $S;
$p = 0;
for ($i = 0; $i < strlen($Chars); $i++) {
$pos = strpos($S, $Chars[$i], $FromPos);
if (is_int($pos)) {
$p = $i == 0 ? $pos : min($p, $pos);
}
}
return substr($S, 0, max($p, $FromPos) );
}

Цитировать
Jeket
(18.01.2009 00:01)

Re: Рандомный вывод статей

создаем файл шаблона
/tpls/custom/default.tpl
Цитировать
Jeket
(18.01.2009 00:02)

Re: Рандомный вывод статей

Содержание шаблона....


<?php

$FORMS = Array();

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

END;

$FORMS['article_line_view'] = <<<END
<div class="useful_info_content">
<a href="%link%">%name%</a>
<p>%content%...</p>
</div>

END;

?>

Цитировать
Jeket
(18.01.2009 00:03)

Re: Рандомный вывод статей

Внутри блока article_line_view можно использовать следующее...

%id% - id
%link% - ссылка на страницу
%content% - содержание страницы
Цитировать
Jeket
(18.01.2009 00:05)

Re: Рандомный вывод статей

Ну и собственно
%name% - название страницы
Цитировать
Jeket
(18.01.2009 00:06)

Re: Рандомный вывод статей

Вызов макроса и параметры
%custom random_article('ID родителя', 'шаблон', 'количество страниц для вывода', 'тут можно указать количество символов для обрезки, если указывать 0, то текст обрезаться не будет', 'если 1, то текст будет очищен от ХТМЛ тегов, если 0, то очистки не будет')%
Цитировать
Jeket
(18.01.2009 00:10)

To: Developers

Вообще-то задача рандома довольно частая и неплохобы её решать Вам, господа, а не мне, и включить в сборку
Цитировать
Jeket
(18.01.2009 00:12)

Re: Рандомный вывод статей

Забыл про проверку, если в шаблоне указывать большее кол-во страниц, чем есть в структуре и про то что не должны выводиться отключенные страницы. Итоговый код вот этот... правда без проверки на открывающиеся/закрывающиеся теги при обрезке


public function random_article($element_id, $template = 'default', $quantity = '1', $char_quantity = '0', $strip_tags = 1) {
list($template_block, $template_line) = def_module::loadTemplates("./tpls/custom/{$template}.tpl", "article_block_view", "article_line_view");
$lines = Array();

$childs = Array();
$childs = umiHierarchy::getInstance()->getChilds($element_id, false, false);
if (count($childs) < $quantity) $quantity = count($childs);
if ($quantity > 0) $rand_element_id = (array) array_rand($childs, $quantity);
else $rand_element_id = (array) $childs;

foreach($rand_element_id as $element_id) {
$article = u miHierarchy::getInstance()-> ;getElement($element_id)->g etObject();
$article_content = $article->getValue('content');
if ($strip_tags == 1) $article_content = strip_tags($article_content);
if ($char_quantity > 0) $article_content = $this->CutStr($article_content, ' ,.;nr>', $char_quantity);
$line_arr = Array();
$line_arr['attribute:id'] = $element_id;
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
$line_arr['attribute:name'] = $article->getName();
$line_arr['node:content'] = $article_content;

$lines[] = def_module::parseTemplate($template_line, $line_arr);
}
$block_arr['subnodes:items'] = $lines;

return def_module::parseTemplate($template_block, $block_arr);
}

public function CutStr($S, $Chars, $FromPos = 0) {
if (strlen($S) <= $FromPos) return $S;
$p = 0;
for ($i = 0; $i < strlen($Chars); $i++) {
$pos = strpos($S, $Chars[$i], $FromPos);
if (is_int($pos)) {
$p = $i == 0 ? $pos : min($p, $pos);
}
}
return substr($S, 0, max($p, $FromPos) );
}

Цитировать
Jeket
(18.01.2009 01:59)
Комментирование доступно только авторизованным пользователям.
Пожалуйста, зарегистрируйтесь или войдите на сайт.
Распечатать