Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю

Автор AksukРаздел Шаблоны XSLT

Ответов: 11
Просмотров: 4225
Последний ответ 05 Март 2012, 23:01:29
от Aksuk
Как задействовать модуль Новости для простых статей без отображения даты

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 8
Просмотров: 2649
Последний ответ 28 Апрель 2013, 22:07:18
от Axiomateria
Ошибка при добавлении новости через клиентскую часть UMI.CMS

Автор kibal4iwРаздел Макросы UMI.CMS

Ответов: 2
Просмотров: 1862
Последний ответ 03 Апрель 2012, 22:20:25
от kibal4iw
Вывести список месяцев в которых есть новости

Автор serhioРаздел Custom макросы

Ответов: 3
Просмотров: 1318
Последний ответ 08 Август 2013, 12:34:17
от admin
Несколько разных шаблонов для модуля Новости

Автор koroganРаздел Шаблоны TPL

Ответов: 8
Просмотров: 3747
Последний ответ 02 Апрель 2012, 09:47:51
от admin

0 Пользователей и 1 Гость просматривают эту тему.

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Здравствуйте! Столкнулась с такой проблемой. Мне надо чтобы на странице Новости были ссылки на предыдущую новость и следующую. Определяются структурой. Как можно сделать такое?
Думала в сторону preceding-sibling и following-sibling... но не знаю как прицепить их у текущей странице(((
Заранее спасибо.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Предыдущая и следующая новости
« Ответ #1 : 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;
}
}

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Предыдущая и следующая новости
« Ответ #2 : 15 Март 2013, 07:51:51 »
еще можно посмотреть в сторону дефолтных макросов... system getPrevious() и system getNext()

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Re:Предыдущая и следующая новости
« Ответ #3 : 15 Март 2013, 12:43:26 »
спасибо большое..)) дефолтные вполне подошли)))

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Предыдущая и следующая новости
« Ответ #4 : 17 Март 2013, 18:58:29 »
Блин, точно, есть дефолтные решения. Совсем загналсо..

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Re: Предыдущая и следующая новости
« Ответ #5 : 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>

Теперь эти ссылки выводятся на всех страницах) Как сделать, чтобы выводились только для страниц с конкретным родителем?
« Последнее редактирование: 07 Июнь 2016, 09:01:48 от luciuz »

*

aghigay

  • *****
  • 607
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Предыдущая и следующая новости
« Ответ #6 : 07 Июнь 2016, 01:17:58 »
http://site.ru/bla-bla-bla/tra-ta-ta/.xml

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

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

Мой блог http://umicms.me

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Re: Предыдущая и следующая новости
« Ответ #7 : 07 Июнь 2016, 09:07:12 »
Осталось понять куда
match="udata[@module = 'news']"
прописать
« Последнее редактирование: 07 Июнь 2016, 09:08:56 от luciuz »

*

aghigay

  • *****
  • 607
  • +28/-3
  • Просто пытаюсь помочь. Иногда пинком
    • Просмотр профиля
    • umicms.me
Re: Предыдущая и следующая новости
« Ответ #8 : 07 Июнь 2016, 09:33:56 »
Туда, где ты обрабатываешь udata[@module = 'news']
Мой блог http://umicms.me

*

luciuz

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Re: Предыдущая и следующая новости
« Ответ #9 : 07 Июнь 2016, 10:29:04 »
Да там link
« Последнее редактирование: 07 Июнь 2016, 21:58:11 от luciuz »