UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: john от 09 Апреля 2011, 15:44:57

Название: xslt многоуровневое меню
Отправлено: john от 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))" />
Подразделы не выводятся в обще, как можно решить такую задачу?
Название: Re:xslt многоуровневое меню
Отправлено: admin от 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 текущей страницы, там есть такие примеры
Название: Re:xslt многоуровневое меню
Отправлено: john от 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>
Название: Re:xslt многоуровневое меню
Отправлено: thecoder от 07 Октября 2011, 12:51:06
А не пробовали вывод подменю сделать в шаблоне вывода активного пункта меню?
Название: Re:xslt многоуровневое меню
Отправлено: admin от 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 уровень подменю и мы в нем
Название: Re:xslt многоуровневое меню
Отправлено: john от 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>
Название: Re:xslt многоуровневое меню
Отправлено: john от 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-го уровня, а как сделать чтобы он смотрел глубже?
Название: Re:xslt многоуровневое меню
Отправлено: john от 16 Апреля 2012, 00:30:52
в TPL щаблоне мы вызывали class="%custom is_active_page(%id%)%
кастомный макрос, а как правильно в XSLT вызвать его?
Название: Re:xslt многоуровневое меню
Отправлено: john от 17 Апреля 2012, 23:40:02
Я так понимаю что-то такое должно быть
class="Method custom::is_active_page doesn't exists"
Все равно не работает
в TPL щаблоне мы вызывали class="%custom is_active_page(%id%)%
кастомный макрос, а как правильно в XSLT вызвать его?
Название: Re:xslt многоуровневое меню
Отправлено: john от 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" и как?
Название: Re:xslt многоуровневое меню
Отправлено: john от 22 Апреля 2012, 22:48:48
Кто-нибудь решал такую задачу? Или может каким-нибудь другим способом?
Название: Re:xslt многоуровневое меню
Отправлено: john от 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>
Название: Re:xslt многоуровневое меню
Отправлено: admin от 25 Апреля 2012, 01:23:27
давайте вернемся к вопросу изначалному...
в этой ветке столько всего уже наобсуждалось что я уже запутался что именно нужно вам?

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