Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

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

*

31rus

  • *
  • 46
  • +2/-0
    • Просмотр профиля
Требуется вывести с разным оформлением предпоследнюю и последнюю категорию каталога на основе demodizzy.
Возможно это реализовать только средствами XSLT?

Смысл, если это не предпоследняя или последняя, то только названия, а если предпоследняя то вывести по 5 товаров из всех вложенных в нее последних категорий, а если последняя то просто все товары. Сломал голову уже всю, считаю по родителям (<xsl:template match="/result[@method = 'category'][count(/result/parents/page) &gt; 1]">), но не везде одинаковое количество уровней вложенности(

Первая
 Вторая
  Предпоследняя
   Последняя категория
     |
    ├─ товар
    └─ товар
   Последняя категория
     |
    ├─ товар
    └─ товар
Первая
  Предпоследняя
   Последняя категория
    |
   ├─ товар
   └─ товар

Заранее спасибо всем!
« Последнее редактирование: 23 Августа 2015, 17:20:23 от 31rus »

*

31rus

  • *
  • 46
  • +2/-0
    • Просмотр профиля
Не кто не может помочь или я не понятно описал ситуацию?(
Как создать условие, что если это последная по уровню вложенности страница соответствующая разделу каталога (@method = 'category'), то вывести ее по определенному моду?

*

e.ioffe

  • ****
  • 369
  • +81/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
Если коротко, то

<xsl:apply-templates select="document('udata://catalog/getObjectsList/')/udata" mode="check-category" />

<xsl:template match="udata" mode="check-category">
  <p>В категории нет товаров</p>
</xsl:template>

<xsl:template match="udata[lines/item]" mode="check-category">
  <p>В категории есть товары</p>
</xsl:template>
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/

*

31rus

  • *
  • 46
  • +2/-0
    • Просмотр профиля
Нет это не то, это вывод объектов и разделов, а мне нужно выводить на предпоследней страницы в каждом подразделе по 4 товара из всех
дочерних разделов, а на последнем все товары из него.

Ест вариант для страниц в структуре проставить свой шалон, но это крайний случай

*

e.ioffe

  • ****
  • 369
  • +81/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
В лоб:
писать свой кастом, который будет проверять, является ли данный раздел предпоследним.

С заботой о производительности:
написать обработчик события, который при сохранении / изменении / удалении / перемещении раздела каталога будет проверять, является ли он предпоследним. Если да - ставит в поле сохраняет значение 1. В шаблонах проверять - если в поле "1", то показывать по 4 товара из дочерних.
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/

*

31rus

  • *
  • 46
  • +2/-0
    • Просмотр профиля
Я думал про кастом, но хотелось бы средствами xsl сделать. А какие есть идеи по повод кастома? Selector но не понятно как отсортировать тогда все дочерние объекты, он же выведет с предпоследней все последние, limit не решает данную задачу(

*

e.ioffe

  • ****
  • 369
  • +81/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
Цитировать
Selector но не понятно как отсортировать тогда все дочерние объекты, он же выведет с предпоследней все последние, limit не решает данную задачу(

Если совсем "в лоб", то

$sel = new selector('pages');
$sel->types('hierarchy-type')->name('catalog', 'category');
$sel->where('hierarchy')->page($pageId)->childs(1);
$sel->where('is_active')->equals(1);

foreach($sel as $element) {
  $objectsSel = new selector('pages');
  $objectsSel->types('hierarchy-type')->name('catalog', 'object');
  $objectsSel->where('hierarchy')->page($element->getId())->childs(1);
  $objectsSel->where('is_active')->equals(1);
}

Но я бы выносил все это в событие добавления / изменения / удаления элемента.
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/

*

31rus

  • *
  • 46
  • +2/-0
    • Просмотр профиля
Мне подсказали как, вот вывод custom

 public function getchild($id)
     {
         $hierarchyTypes = umiHierarchyTypesCollection::getInstance();
$hierarchyTypeId = $hierarchyTypes->getTypeByName("catalog", "category")->getId();
$arr = umiHierarchy::getInstance()->getChilds($id,true,true,2,$hierarchyTypeId);
if(empty($arr)){ return 'last'; exit();}
else {
    $arr1 = umiHierarchy::getInstance()->getChilds($id,true,true,1,$hierarchyTypeId);
    if($arr1 == $arr){ return 'pre-last'; exit();}
    else return ''; exit();
}
     }

позволит вам вывести разные уровни вложенности каталога, по разным шаблонам.

*

admin

  • *****
  • 2419
  • +172/-1
    • Просмотр профиля
Требуется вывести с разным оформлением предпоследнюю и последнюю категорию каталога на основе demodizzy.
Возможно это реализовать только средствами XSLT?

Удобнее кастомом (как вариант тот, что вы привели выше).
Но если говорить на уровне xslt, то получается затратно, так как вам придется делать такую логику:
- в шаблоне? который выводит раздел делаем следующие проверки:
   - вызываем макрос catalog/getCategorylist, если есть подразделы, то проверяем подразделы у первого подраздела из текущего результата
   - проверяем сколько уровней вглубь у нас получилось и в зависимости от этого
   - выводим название раздела, или список товаров, или список 5 товаров из каждого подраздела

Как вы видите, сделать это одним запросом на уровне кастома будет намного более верно, в плане нагрузки и быстродействия.