Контакты

Мы всегда готовы к встрече, но только по предварительной договоренности.

ул. Чапыгина, д.6-п, оф.19
Санкт-Петербург, Россия
+7 911 933-80-68
Пн.-Пт. 9:00-20:00
info@webevrika.ru
По всем вопросам

UMI-CMS: Виджет СОВЕТ ДНЯ или слайдер по кругу

UMI-CMS: Виджет СОВЕТ ДНЯ или слайдер по кругу
UMI-CMS: Виджет СОВЕТ ДНЯ или слайдер по кругу

Задача такая: выводим один случайный совет и ссылку на следующий (следующие советы доходят до конца и переходят на первый). В нашем примере в качестве совета дня используется новость. В блоке #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;
}

Добавлять комментарии могут только зарегистрированные пользователи.

Если Вы еще не зарегистрированы на сайте, Вы можете зарегистрироваться.

Войти