UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: niakriss от 14 Марта 2013, 13:39:19

Название: Предыдущая и следующая новости
Отправлено: niakriss от 14 Марта 2013, 13:39:19
Здравствуйте! Столкнулась с такой проблемой. Мне надо чтобы на странице Новости были ссылки на предыдущую новость и следующую. Определяются структурой. Как можно сделать такое?
Думала в сторону preceding-sibling и following-sibling... но не знаю как прицепить их у текущей странице(((
Заранее спасибо.
Название: Re:Предыдущая и следующая новости
Отправлено: Rodogor от 14 Марта 2013, 17:26:26
Немножко не понял про определение структурой.
Т.е. нужно брать соседние внутри родителя ?

Гуляют по форумам пара решений.

Я когда-то делал это, сейчас смотрю код - мне за него стыдно, сейчас намного быстрее и проще сделаю.. Надо будет переписать...
Скину говнокод, в нём сама идея будет понятна. В коде присутствуют лишние моменты в виде $prop_name, полей parent и т.п. - нужно почистить


public function getNextProduct($path, $template = "default", $prop_name = "", $order = 0) {
if(!$template) $template = "default";

$element_id = def_module::analyzeRequiredPath($path);

if($element_id === false) {
throw new publicException(getLabel('error-page-does-not-exist', null, $path));
}

$element = umiHierarchy::getInstance()->getElement($element_id);

if($element instanceof iUmiHierarchyElement == false) {
throw new publicException('error-require-more-permissions');
}

$parent_id = $element->getParentId();
$objectTypes = umiObjectTypesCollection::getInstance();
$objectTypeId = $objectTypes->getBaseType("catalog", "object");
$objectType = $objectTypes->getType($objectTypeId);
if($prop_name) {

$sel = new umiSelection;
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();

$sel->addPropertyFilterIsNull($objectType->getFieldId('parent'));
$object_type_id = $element->getObject()->getTypeId();
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);

$order_field_id = $object_type->getFieldId($prop_name);
if(!$order_field_id) {
throw new publicException(getLabel('error-prop-not-found', null, $prop_name));
}
$sel->setOrderByProperty($order_field_id, $order);

$sort_array = umiSelectionsParser::runSelection($sel);
} else {
$sel = new umiSelection;

$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();

$sort_array = umiSelectionsParser::runSelection($sel);
}

$next_id = false;
$is_matched = false;

foreach($sort_array as $id) {
if($is_matched) {
$next_id = $id;
break;
}

if($id == $element_id) {
$is_matched = true;
}
}

list($tpl, $tpl_last) = def_module::loadTemplates("content/slider/".$template, "next", "next_last");

if($next_id !== false) {
$block_arr = Array();
$block_arr['id'] = $next_id;
$block_arr['link'] = umiHierarchy::getInstance()->getPathById($next_id);
return def_module::parseTemplate($tpl, $block_arr, $next_id);
} else {
return $tpl_last;
}



return $element_id;
}

public function getPreviousProduct($path, $template = "default", $prop_name = "", $order = 0) {
if(!$template) $template = "default";

$element_id = def_module::analyzeRequiredPath($path);

if($element_id === false) {
throw new publicException(getLabel('error-page-does-not-exist', null, $path));
}

$element = umiHierarchy::getInstance()->getElement($element_id);
$parent_id = $element->getParentId();
$objectTypes = umiObjectTypesCollection::getInstance();
$objectTypeId = $objectTypes->getBaseType("catalog", "object");
$objectType = $objectTypes->getType($objectTypeId);
if($prop_name) {
$sel = new umiSelection;
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();

$objectTypes = umiObjectTypesCollection::getInstance();
$objectTypeId = $objectTypes->getBaseType("catalog", "object");
$objectType = $objectTypes->getType($objectTypeId);

$object_type_id = $element->getObject()->getTypeId();
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);

$order_field_id = $object_type->getFieldId($prop_name);
if(!$order_field_id) {
throw new publicException(getLabel('error-prop-not-found', null, $prop_name));
}
$sel->setOrderByProperty($order_field_id, $order);

$sort_array = umiSelectionsParser::runSelection($sel);
} else {
$sel = new umiSelection;
$sel->addPropertyFilterIsNull($objectType->getFieldId('parent'));
$sel->addHierarchyFilter($parent_id);
$sel->addActiveFilter(true);
$sel->addPermissions();
$sort_array = umiSelectionsParser::runSelection($sel);
}

$prev_id = false;

foreach($sort_array as $id) {

if($id == $element_id) {
break;
} else {
$prev_id = $id;
}
}

list($tpl, $tpl_first) = def_module::loadTemplates("content/slider/".$template, "previous", "previous_first");

if($prev_id !== false) {
$block_arr = Array();
$block_arr['id'] = $prev_id;
$block_arr['link'] = umiHierarchy::getInstance()->getPathById($prev_id);
return def_module::parseTemplate($tpl, $block_arr, $prev_id);
} else {
return (def_module::isXSLTResultMode()) ? "" : $tpl_first;
}
}
Название: Re:Предыдущая и следующая новости
Отправлено: admin от 15 Марта 2013, 07:51:51
еще можно посмотреть в сторону дефолтных макросов... system getPrevious() (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_getprevious/) и system getNext() (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_getnext/)
Название: Re:Предыдущая и следующая новости
Отправлено: niakriss от 15 Марта 2013, 12:43:26
спасибо большое..)) дефолтные вполне подошли)))
Название: Re:Предыдущая и следующая новости
Отправлено: Rodogor от 17 Марта 2013, 18:58:29
Блин, точно, есть дефолтные решения. Совсем загналсо..
Название: Re: Предыдущая и следующая новости
Отправлено: luciuz от 06 Июня 2016, 00:19:13
Можете написать, как сделать подобные ссылки в случае xsl-шаблона для новостей news?

Прописал

<xsl:apply-templates select="document(concat('udata://system/getPrevious/', @id))/udata/link" mode="prev" />
<xsl:apply-templates select="document(concat('udata://system/getNext/', @id))/udata/link" mode="next" />

        <xsl:template match="link" mode="prev">
<a href="{.}">&#171; Предыдущая сататья</a>
</xsl:template>

<xsl:template match="link" mode="next">
<a href="{.}" class="pull-right">Следующая сататья &#187;</a>
</xsl:template>

Теперь эти ссылки выводятся на всех страницах) Как сделать, чтобы выводились только для страниц с конкретным родителем?
Название: Re: Предыдущая и следующая новости
Отправлено: aghigay от 07 Июня 2016, 01:17:58
http://site.ru/bla-bla-bla/tra-ta-ta/.xml

После этого видна структура, где в теге parents указаны все родители. xsl:if решает условия.

Но вообще-то такой проблемы не должно быть если следовать хотя бы элементарной идеологии demodizzy, где в result отслеживается модуль и метод. Ведь ссылки на следующие и предыдущие статьи должны быть доступны только в том случае, если модуль и метод конкретные. А какой там родитель - по сути пофигу.

Название: Re: Предыдущая и следующая новости
Отправлено: luciuz от 07 Июня 2016, 09:07:12
Осталось понять куда
match="udata[@module = 'news']"
прописать
Название: Re: Предыдущая и следующая новости
Отправлено: aghigay от 07 Июня 2016, 09:33:56
Туда, где ты обрабатываешь udata[@module = 'news']
Название: Re: Предыдущая и следующая новости
Отправлено: luciuz от 07 Июня 2016, 10:29:04
Да там link