Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Вывод количества объектов в категории. XSLT

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

Ответов: 6
Просмотров: 6047
Последний ответ 18 Октября 2014, 17:39:24
от idu.kuru
Сортировка по алфавиту в xslt

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

Ответов: 2
Просмотров: 5354
Последний ответ 14 Января 2012, 17:25:36
от admin
Не выводятся все теги в xslt

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

Ответов: 2
Просмотров: 5090
Последний ответ 03 Июня 2014, 13:52:04
от goodprofy
webforms & XSLT & модальное окно

Автор graveРаздел JS и AJAX

Ответов: 8
Просмотров: 10016
Последний ответ 13 Июня 2011, 00:41:56
от talanter
Как вывести itemprop="position" content="" в XSLT?

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

Ответов: 0
Просмотров: 3204
Последний ответ 15 Ноября 2018, 09:30:06
от makarov2979

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

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
xslt многоуровневое меню
« : 09 Апреля 2011, 15:44:57 »
Настраиваю xslt шаблон интернет-магазина, который идет при установки CMS
Пытаюсь разобраться с меню, которое слева.
Он выводит список разделов и подразделов сразу.
Хочу чтобы подраздел был виден, только у активного раздела.
Нашел в документации настройки xslt-nested-menu в файле config.ini,
поставить параметр '0', должен делать так как надо. Увы не получилось
Нашел в шаблоне /catalog/left-column-category-list.xsl
Если убрать эту строчку
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/';, @id))" />
Подразделы не выводятся в обще, как можно решить такую задачу?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #1 : 09 Апреля 2011, 17:17:47 »
нужно эту строчку поставить в условие, то есть <xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/';, @id))" /> выводит подразделы каталога. А нам надо чтобы подразделы выводились тольку для текущего раздела, тогда нам надо сделать проверку на равенство id текущей страницы и id раздела, для которого мы собираемся выводить подраздел
<xsl:variable name="current_page_id" select="./result/@pageId" />
<xsl:if test="@id=$current_page_id">
      <xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/';, @id))" />
</xsl:if>

Могу ошибаться в строчке <xsl:variable name="current_page_id" select="./result/@pageId" />, так как пишу по памяти, возможно там должно быть <xsl:variable name="current_page_id" select="/result/@pageId" />, в любом случае поищите в шаблонах, как получить id текущей страницы, там есть такие примеры

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #2 : 04 Октября 2011, 19:18:31 »
Не могу разобраться, помогите исправить ошибки.


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/19.../XSL/Transform";>
<xsl:output encoding="UTF-8" method="html" indent="yes"/>

<!-- шаблон разметки страницы -->

<xsl:template match="/">
<html>
<head></head>
<body>

<div class="left-menu">
<xsl:apply-templates s elect="document('udata:// catalog/getCategoryList/void/s hop/')" mode="left-column" />
</div>

<div class="content">
<!-- здесь располагается контент страницы -->
</div>
</body>
</html>
</xsl:template>

<!-- шаблон для начала всех списков -->

<xsl:template match="items" mode="left-column">
<ul>
<xsl:apply-templates select="item" mode="left-column"/>
</ul>
</xsl:template>

<!-- шаблон для ВСЕХ неактивных пунктов меню -->

<xsl:template match="item" mode="left-column">
<li>
<a href="{@link}">
<xsl:value-of select="@name"/>
</a>
</li>
</xsl:template>

<!-- шаблон для ВСЕХ активных пунктов меню -->

<xsl:template match="item[@status = 'active']" mode="left-column">
<li>
<span>
<xsl:value-of select="@name"/>
</span>
<xsl:apply-templates select="items" mode="left-column"/>
</li>
</xsl:template>

<!-- шаблон для ВСЕХ пунктов меню, являющихся родительскими для текущей страницы -->

<xsl:template match="item[.//item[@status = 'active']]" mode="left-column">
<li>
<a href="{@link}">
<xsl:value-of select="@name"/>
</a>
<xsl:apply-templates select="items" mode="left-column"/>
</li>
</xsl:template>

</xsl:stylesheet>

*

thecoder

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #3 : 07 Октября 2011, 12:51:06 »
А не пробовали вывод подменю сделать в шаблоне вывода активного пункта меню?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #4 : 07 Октября 2011, 13:10:51 »
в корневом шаблоне ты используешь <xsl:apply-templates s elect="document('udata:// catalog/getCategoryList/void/s hop/')" mode="left-column" />

а шаблон который должен его подхватить
<xsl:template match="items" mode="left-column"> где промежуточный шаблон?

и вообще, для твоей задачи решение следующее (вставь это в файл /catalog/left-column-category-list.xsl затерев то что там было)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:umi="http://www.umi-cms.ru/TR/umi">


<xsl:template match="udata[@method = 'getCategoryList']" mode="left-column">
<ul class="catalog_menu" umi:button-position="bottom left"
umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable">
<xsl:apply-templates select="//item" mode="left-column" />
</ul>
</xsl:template>


<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column">
<li umi:element-id="{@id}" umi:region="row">
<span>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
</span>
<xsl:if test="@id=$document-page-id or @id=/result/parents/page/@id">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" />
<xsl:if>
</li>
</xsl:template>

</xsl:stylesheet>

возможно в этой строчке
<xsl:if test="@id=$document-page-id or @id=/result/parents/page/@id">
могут быть ошибки если не сработает проверь так
<xsl:if test="@id=$document-page-id">
но такой код не будет показывать подменю активного раздела если есть 3 уровень подменю и мы в нем

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #5 : 12 Октября 2011, 18:18:56 »
Выше указанный пример не работает, пустая страница выводится.
Нашел решение такое вставить это в файл /catalog/left-column-category-list.xsl
Но меню работает не глубже второго уровня и цифры на странци под меню отображаются
<total>12</total>
<per_page>25</per_page>
Как убрать ХЗ, подскажите?
Кстати никто не сталкивался, когда находишься в разделе каталога, щелкаешь на вторую третью страницу каталога, меню слева исчезает, из-за чего это может быть?

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:umi="http://www.umi-cms.ru/TR/umi">


<xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column">
 
<!-- вызов кастомного скрипта -->
<xsl:variable name="actmenu" select="document(concat('udata://custom/activmenu/',@id,'/',$document-page-id))/udata" />
 
<ul class="catalog_menu" umi:button-position="bottom left"
umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable">
<span>
<a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
<xsl:value-of select="." />
</a>
</span>
 
<!-- условие - отображать только тот раздел в котором мы находимся -->
<xsl:if test="$actmenu = 1">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id))" />
</xsl:if>
 
</ul>
</xsl:template>
   
</xsl:stylesheet>

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #6 : 09 Апреля 2012, 22:40:31 »
Всем привет, вернулся к разбору менюшки.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:umi="http://www.umi-cms.ru/TR/umi">
 
 
    <xsl:template match="udata[@method = 'getCategoryList']" mode="left-column">
        <ul class="catalog_menu" umi:button-position="bottom left"
          umi:element-id="{@category-id}" umi:region="list" umi:module="catalog" umi:sortable="sortable">
        <xsl:apply-templates select="//item" mode="left-column" />
        </ul>
    </xsl:template>
   
     
    <xsl:template match="udata[@method = 'getCategoryList']//item" mode="left-column">
      <!-- вызов кастомного скрипта -->
        <xsl:variable name="actmenu" select="document(concat('udata://custom/activmenu/',@id,'/',$document-page-id))/udata" />
        <li><span>
            <a href="{@link}" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">
              <xsl:value-of select="." />
            </a>
</span>
          <!-- условие - отображать только тот раздел в котором мы находимся -->
            <xsl:if test="$actmenu = 1">
              <xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id, '//1'))" />
            </xsl:if>
         </li>
     </xsl:template>
       
</xsl:stylesheet>

Меню слева отображается глубиной до 2-го уровня, а как сделать чтобы он смотрел глубже?

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #7 : 16 Апреля 2012, 00:30:52 »
в TPL щаблоне мы вызывали class="%custom is_active_page(%id%)%
кастомный макрос, а как правильно в XSLT вызвать его?

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #8 : 17 Апреля 2012, 23:40:02 »
Я так понимаю что-то такое должно быть
class="Method custom::is_active_page doesn't exists"
Все равно не работает
в TPL щаблоне мы вызывали class="%custom is_active_page(%id%)%
кастомный макрос, а как правильно в XSLT вызвать его?

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #9 : 18 Апреля 2012, 19:12:39 »
Правильно ли?
в файле /xsltTpls/modules/catalog/category-list.xsl
<xsl:apply-templates select="document('udata://custom/is_active_page/parametr/')" />
<a href="{@link}" class="def_module::parseTemplate($шаблон, $массив_с_блоками, $id_елемента);" umi:field-name="name" umi:delete="delete" umi:empty="&empty-section-name;">

В XSLT вызов макросов производится с помощью udata, тоесть
<xsl:apply-templates select="document('udata://custom/is_active_page/parametr/')" />
Где parametr - передаваемый в макрос параметр.
Также, должен быть описан шаблон, по которому будет выводится значение, а сам результат должен возвращаться из метода посредством
def_module::parseTemplate($шаблон, $массив_с_блоками, $id_елемента);

Как точно все написать?
Или как можно легче вывести в class"значение active" и как?
« Последнее редактирование: 18 Апреля 2012, 19:14:39 от john »

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #10 : 22 Апреля 2012, 22:48:48 »
Кто-нибудь решал такую задачу? Или может каким-нибудь другим способом?

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #11 : 24 Апреля 2012, 23:06:51 »
А как поставить условие проверки?
Если в разделе имеются подразделы то оно выполняется, как это реализовать?
<xsl:if test="$podrazdel= 1">
<xsl:apply-templates select="document(concat('udata://catalog/getCategoryList/void/', @id, '//1/' ))" mode="left-column3" />
</xsl:if>

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:xslt многоуровневое меню
« Ответ #12 : 25 Апреля 2012, 01:23:27 »
давайте вернемся к вопросу изначалному...
в этой ветке столько всего уже наобсуждалось что я уже запутался что именно нужно вам?

поправите если я не прав...
"нужно рассказать как вывести многоуровневое меню разделов каталога, используя макрос getCategoryList, плюс выделять активные ветки и разделы"