Задача такая: выводим один случайный совет и ссылку на следующий (следующие советы доходят до конца и переходят на первый). В нашем примере в качестве совета дня используется новость. В блоке #sovet выводится анонс и заголовок, с которого идет ссылка на страницу с подробностями..
Код на главной странице:
<div class="block">
<div class="head-block">
<h2>Совет дня</h2>
</div>
% news randomlist('/sovet/', 'hp_sovet')%
<div class="break"></div>
</div>>
Макрос randomlist пишем в customMacros.php модуля Новости:
public function randomlist($path = "", $template = "default") {
if($this->breakMe()) return;
list($template_block, $template_block_empty, $template_line) = def_module::loadTemplates("tpls/news/{$template}.tpl", "lastlist_block", "lastlist_block_empty", "lastlist_item");
$parent_id = $this->analyzeRequiredPath($path);
if($parent_id === false && $path != KEYWORD_GRAB_ALL) {
throw new publicException("{$path} doesn't exists");
}
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("news", "item")->getId();
$object_type_id = umiObjectTypesCollection::getInstance()->getBaseType("news", "item");
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
$publish_time_field_id = $object_type->getFieldId('publish_time');
$sel = new umiSelection;
$sel->addElementType($hierarchy_type_id);
if($path != KEYWORD_GRAB_ALL) {
$sel->addHierarchyFilter($parent_id, 2, true);
}
$sel->addPermissions();
$sel->setOrderByRand();
$sel->addLimit(1, 0);
$result = umiSelectionsParser::runSelection($sel);
$total = umiSelectionsParser::runSelectionCounts($sel);
if(($sz = sizeof($result)) > 0) {
$block_arr = Array();
$lines = Array();
for($i = 0; $i < $sz; $i++) {
$line_arr = Array();
$element_id = $result[$i];
$element = umiHierarchy::getInstance()->getElement($element_id);
if(!$element) continue;
$line_arr['attribute:id'] = $element_id;
$line_arr['node:name'] = $element->getName();
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
$line_arr['xlink:href'] = "upage://" . $element_id;
$line_arr['void:header'] = $lines_arr['name'] = $element->getName();
if($publish_time = $element->getValue('publish_time')) {
$line_arr['attribute:publish_time'] = $publish_time->getFormattedDate("U");
}
$lines[] = def_module::parseTemplate($template_line, $line_arr, $element_id);
templater::pushEditable("news", "item", $element_id);
umiHierarchy::getInstance()->unloadElement($element_id);
}
if(is_array($parent_id)) {
list($parent_id) = $parent_id;
}
$block_arr['subnodes:items'] = $block_arr['void:lines'] = $lines;
return def_module::parseTemplate($template_block, $block_arr, $parent_id);
} else {
return $template_block_empty;
}
}
В шаблоне слайдера /tpls/content/slider/default.tpl изменяем два последних блока next и next_last для того, чтобы ссылка шла не просто на страницу, а следующий анонс подкачивался аяксом в div
$FORMS['next'] = <<<END
<a href="javascript:void(0)" class="right-link" title="Слайдер по кругу" onClick="loadsovet(% id%)">Следующий совет</a>
END;
$FORMS['next_last'] = <<<END
<a href="javascript:void(0)" class="right-link" title="Слайдер по кругу" onClick="loadsovet(% custom firstChild(id_родительской страницы)%)">Следующий совет</a>
END;
Ну и напоследок надо прописать в js-скриптах функцию loadsovet
function loadsovet(pageId) {
$.post('/news/nextView/', {
pageId:pageId},
onAjaxSuccess
);
function onAjaxSuccess(data) {
$('#sovet').html(data); // Здесь мы получаем данные, отправленные сервером
}
return false;
}