UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: Phoenix-75 от 01 Августа 2011, 17:20:18

Название: Меню из подстаниц на XSLT
Отправлено: Phoenix-75 от 01 Августа 2011, 17:20:18
Добрый день.
Пишу здесь в надежде на помощь. Закипел капитально.
Суть в следущем.
Сайт на бесплатной версии UMI. А надо сделать что-то типа каталога. Постараюсь пояснить детальнее. Имеем мледующую структуру сайта:

Страница 1
Страница 2
Страница 3
    Страница 3.1
        Страница 3.3.1
        Страница 3.3.2
        Страница 3.3.3
        .....................
    Страница 4
        Страница 4.4.1
        Страница 4.4.2
        Страница 4.4.3
        .....................
Страница 5

И надо вывести на страницах 4 и 5 например типа меню из подстраниц которые они содержат, и чтоб это меню отображалась и на самих подстраницах.  Понятно что можно юзать %content menu()% в страницах 4 и 5, и на подстраницах и получить что надо. Но хотелось бы прописать это безобразие именно на XSLT. И вот тут что-то у меня случился ступор. И никак не соображу как сделать. Жара что-то уж черезчур сильно на меня подействовала. Очень пропошу, укажите направление куда копать.
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 01 Августа 2011, 17:23:53
так вопрос в чем как вывести с помощью xslt многоуровневое меню?
или в том как указать на каких страницах откуда отсчитывать начало вывода меню "надо вывести на страницах 4 и 5 например типа меню из подстраниц которые они содержат, и чтоб это меню отображалась и на самих подстраницах"

иил как вывести подобие многоуровневое меню без использования content menu макроса?
Название: Re:Меню из подстаниц на XSLT
Отправлено: Phoenix-75 от 01 Августа 2011, 17:37:42
Точно закипел от жары, даже вопрос не совсем корректно составил.
Вопрос в том как вывести на страницах 4.1 и 3.1 и подстраницах этих страниц меню из подстраниц. Т.е. заходим на страницу 4.1, и на этой странице выводится меню:
        Страница 4.4.1
        Страница 4.4.2
        Страница 4.4.3
Если открываем страницу 4.4.1 то там аналогичное меню, и так же на всех остальных подстраница от страницы 4.1.
Если мы заходим на страницу 3.1 то там меню из подстраниц страницы 3.1, т.е.
        Страница 3.3.1
        Страница 3.3.2
        Страница 3.3.3
И такое же меню на всех этих подстраницах.
Т.е. фактически я хочу добиться что-то типа пагинации по разделу каталога, когда зайдя в последний раздел, у нас выводится меню из товаров данного раздела каталога.
Вот вроде сейчас описал правильно.
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 01 Августа 2011, 17:45:15
если дождетесь ночи, отпишу) сейчас не успею
Название: Re:Меню из подстаниц на XSLT
Отправлено: Phoenix-75 от 01 Августа 2011, 17:51:11
Не знаю, высижу ли я до ночи, но с утра точно здесь буду.
Название: Re:Меню из подстаниц на XSLT
Отправлено: grave от 01 Августа 2011, 21:59:33
Как вариант:
<xsl:variable name="pId" select="/result/@pageId" />
<xsl:variable name="parentId" select="/result/page/@parentId" />
<xsl:choose>
<xsl:when test="$pId = '3' or $parentId = '3'">
<xsl:apply-templates select="document('udata://content/menu//3/3')/udata/items"/>
</xsl:when>
<xsl:when test="$pId = '4' or $parentId = '4'">
<xsl:apply-templates select="document('udata://content/menu//3/4')/udata/items"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="document('udata://content/menu//3/0')/udata/items"/>
</xsl:otherwise>
</xsl:choose>
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 02 Августа 2011, 00:25:59
было бы круто если бы ваши страницы псевдо разделы и псевдо объекты каталога имели отдельные типы данных, дочернии к страницам обычным.
Тогда можно было бы применять к ним шаблон не прописывая все возможные id, а просто проверять страницу на то, является ли она псевдо каталогом или нет.  Если нет, то искать псевдо раздел каталога в родителях данной страницы и первый же найденный был бы отправной точкой для построения меню
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 02 Августа 2011, 09:28:30
grave, спасибо большое, но но сколько я тогда понимаю, в шаблон придется прописывать все id страниц от которых надо будет начинать отсчёт для проверки и отображения меню. Это конечно вариант, но тогда теряется гибкость, ведь если будет создан ещё один раздел, то придется лезть в шаблон и дописывать под него условие.
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 02 Августа 2011, 09:32:48
было бы круто если бы ваши страницы псевдо разделы и псевдо объекты каталога имели отдельные типы данных, дочернии к страницам обычным.
Тогда можно было бы применять к ним шаблон не прописывая все возможные id, а просто проверять страницу на то, является ли она псевдо каталогом или нет.  Если нет, то искать псевдо раздел каталога в родителях данной страницы и первый же найденный был бы отправной точкой для построения меню


А можно немного по-подробнее. Т.е. я так понимаю, в модуле "шаблоны данных" надо создать для типа данных "Страница контента" как бы подтип, и назвать например "Раздел каталога". А дальше? Не совсем понял как сделать проверку, ведь у данного типа всё-равно будет и  module="content" method="content"
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 02 Августа 2011, 10:55:53
да ты правильно понял создаем в шаблоне данных "псевдо каталог"  (у меня у этого типа id=126) он подтип "Старинца контента"

В итоге обычная страница имеет такие строки в xml виде
<page id="22" parentId="0" link="/obychnaya_stranica/" is-visible="1" is-active="1" object-id="504" type-id="43" type-guid="content-page" update-time="1312267043" alt-name="obychnaya_stranica">

А страница тиа "псевдо каталог" такую строку
<page id="67" parentId="0" link="/obychnaya_stranica1/" is-visible="1" is-active="1" object-id="591" type-id="126" update-time="1312267046" alt-name="obychnaya_stranica1">

ориентируясь по type-id ты можешь строит предикаты для достижению нужного эффекта например такой файл шаблона если его назначить обычной странице и странице с типом данных 126 (псевдо каталог) при выводе покажет кто есть кто)

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/TR/xlink"
xmlns:umi="http://www.umi-cms.ru/TR/umi"
exclude-result-prefixes="xlink">

<xsl:output encoding="utf-8" method="html" indent="yes"/>

<xsl:template match="/">
<html class="u-eip">
<head>
</head>

<body>
<h1 umi:element-id="{result/@pageId}" umi:field-name="h1" umi:delete="delete" umi:empty="Заголовок страницы">
<xsl:value-of select="result/@header" />
</h1>
<xsl:apply-templates select="result" />
</body>
</html>
</xsl:template>

<xsl:template match="result">
шаблон для всех остальных страниц
</xsl:template>

<xsl:template match="result[page/@type-id='126']">
шаблон для псевдо каталога
</xsl:template>

</xsl:stylesheet>
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 02 Августа 2011, 12:06:15
Спасибо, идею понял. Буду пробовать.
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 02 Августа 2011, 12:10:54
как чего получиться, отпиши сюда, другим пригодится)
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 03 Августа 2011, 10:57:41
Где-то я всё-таки не догоняю. Итак, что получилось а что нет.
Как посоветовал admin заводим отдельный тип данных для уже имеющегося типа "Страница контента", и назовём его пусть "Страница каталога". Пусть id нашего нового типа данных будет 126. При создании(редактировании) страницы, если она должна быть в разделе каталога не забываем в админке поменять тип данных со "Страница контента" на "Страница каталога".
Теперь пропишем отдельный шаблон для этого типа. По аналогии (смотрим чуть выше на два сообщения). Я редактировал шаблон content.xsl который находится у меня в \xsltTpls\modules\content. В него добавил следущее:
<xsl:template match="result[page/@type-id='126']">
        <xsl:apply-templates select=".//property[@name = 'content']" />
       
        <!-- Выводим ссылки -->
        <div class="paging">
           
            <xsl:apply-templates select="document('udata://content/menu')/udata" mode="catalog"/>
           
        </div>
</xsl:template>

Теперь надо добавить в файл в котором у нас формируется меню шаблон для наших ссылок с mode="catalog"
И вот тут опять ступор. Дошёл вот до такого кода:
<xsl:template match="udata[@method = 'menu']" mode="catalog">
<ul>
    <xsl:apply-templates select="items/item" mode="catalog"/>
</ul>
</xsl:template>
   
    <xsl:template match="items/item" mode="catalog">
       
    </xsl:template>
   
    <xsl:template match="items/item[@status = 'active']" mode="catalog">
<li>
    <xsl:apply-templates select="document(concat('udata://content/menu///', @id))/udata[items/item]"/>
</li>
</xsl:template>
   
    <xsl:template match="items/item">
        <a href="{@link}">
            <xsl:value-of select="@name"/>
        </a>
</xsl:template>
Но работает он криво. Выводит ссылки на текущий уровень вложенности, а не на следующий как по идее должно быть. И отрабатывает не совсем корректно, все ссылки выводятся в одном <li> и в конце выводится какая-то циферка. Ну понятно что не какая-то а номер id родительской страницы. Вот как-то так, здесь я приплыл.
Прошу совета, помощи.
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 03 Августа 2011, 22:47:10
насчет того что выводит вам шаблон, он все правильно выводит

перечитал еще раз всю переписку и понял что видимо не так вас понял.
у вас нет каталога, но вы хотите видеть слева(предположим слева или справа, не суть) список.... товаров из какого-то дочернего псевдо каталога, то есть

у вас есть:
псевдокаталог1
--псевдокаталог1.1
----псевдотовар1.1.1
----псевдотовар1.1.2
--псевдокаталог1.2
----псевдотовар1.2.1
----псевдотовар1.2.2

на каких страницах какие ссылки вы хотите видеть?
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 03 Августа 2011, 23:24:09
я сегодня удалил какого-то пользователя или его сообщение, в процессе чистки форума от спамеров. Отзовись, мы тебя восстановим или перерегистрируем))
пользователь оставил сообщение:

Что-то в этом роде.. проверить пока не могу )

<xsl:template match="result[page/@type-id='126']">
       <xsl:apply-templates select=".//property[@name = 'content']" />
       <!-- Выводим ссылки -->
       <div class="paging">
               <xsl:apply-templates select="document('udata://content/menu//3/0')/udata/items" mode="catalog"/>
       </div>
</xsl:template>

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

       <xsl:template match="item" mode="catalog">
               <li>
                       <xsl:apply-templates select="document(concat('udata://content/menu//2/', @id))/udata/items"/>
               </li>
       </xsl:template>

       <xsl:template match="item[@status = 'active']" mode="catalog">
               <li>
                       <xsl:apply-templates select="document(concat('udata://content/menu//2/', @id))/udata/items"/>
               </li>
       </xsl:template>
Название: Re:Меню из подстаниц на XSLT
Отправлено: grave от 04 Августа 2011, 09:15:43
это мое сообщение было, и я сам его удалил.. так как заданный вопрос оно не решало )
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 04 Августа 2011, 09:30:30
ок, тогда я его тоже удаляю, я уж подумал что вместе со спамом кого настоящего репрессировал )
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 04 Августа 2011, 09:54:33
насчет того что выводит вам шаблон, он все правильно выводит

перечитал еще раз всю переписку и понял что видимо не так вас понял.
у вас нет каталога, но вы хотите видеть слева(предположим слева или справа, не суть) список.... товаров из какого-то дочернего псевдо каталога, то есть

у вас есть:
псевдокаталог1
--псевдокаталог1.1
----псевдотовар1.1.1
----псевдотовар1.1.2
--псевдокаталог1.2
----псевдотовар1.2.1
----псевдотовар1.2.2

на каких страницах какие ссылки вы хотите видеть?
Да, именно так. Как такового модуля каталога нет (если бы он был, то всё решалось бы наверное проще, но увы). И именно с использованием псевдокаталога и была идея решить сей вопрос. В идеале хочу дойти до того, чтоб выводить на странице псевдокаталога ссылки на товары. Т.е если взять за пример уже то что привели Вы, то на выходе получить следующее. Вывести на странице "Псевдокаталог1.1" ссылки на "Псевдотовар1.1.1", "Псевдотовар1.1.2", а также эти же ссылки выводить на страницах с описанием самих товаров.
Т.е. на странице "Псевдотовар1.1.1" у нас есть ссылки на "Псевдотовар1.1.1", "Псевдотовар1.1.2".
Аналогично и с "Псевдокаталогом1.2" , там выводить ссылки на "Псевдотовар1.2.1", "Псевдотовар1.2.2".

А вообще довести решение до того, что если у пседвдокаталога есть псевдотовар, то формировать и выводить меню из псевдотовара. Причем не важно какой уровень вложенности псевдокаталог у нас будет.

Фактически мы должны сформировать меню только для страниц, а возможно даже и из страниц которые имеют определенный тип данных (который фактически мы можем сами задать благодаря модулю Шаблоны Данных). Или более детально даже так.
Мы формируем псевдокаталог и доходим в итоге до какого-то уровня вложенности. Когда мы заносим страницы псевдокаталога на сайте, мы знаем, где у нас будет последний уровень псевдокаталога внутри которого уже будут псевдотовары. Для этого последнего уровня псевдокаталога мы можем присвоить определенный тип данных, и вот как раз от него и начинаем строить наше меню из псевдотоваров. И в итоге вывести его как на странице последнего уровня псевдокаталога, так и на страницах с псевдотоваром.

Уфф, многа букв, но надеюсь не зря столько понаписал.
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 10 Августа 2011, 12:30:48
Спасибо всем. Вопрос более не актуален. Не найдя решения просто воспользовался подстановкой макроса %content menu()% в область контента с необходимыми параметрами. XSLT в моем случае прошёл лесом.
Название: Re:Меню из подстаниц на XSLT
Отправлено: admin от 10 Августа 2011, 13:34:34
о боже, мой ответ потерся!!!! а я то думал что все заработало и не заглядывал в эту тему(
Название: Re:Меню из подстаниц на XSLT
Отправлено: grave от 10 Августа 2011, 21:20:40
о боже, мой ответ потерся!!!! а я то думал что все заработало и не заглядывал в эту тему(
ну дык продублируй )
Название: Re:Меню из подстаниц на XSLT
Отправлено: PHOENIX-75 от 21 Августа 2011, 17:23:06
о боже, мой ответ потерся!!!! а я то думал что все заработало и не заглядывал в эту тему(
ну дык продублируй )

Ну в общем-то можно ничего и не дублировать, хотя если будет ещё одно решение, то только плюсом в копилку как и что можно обыграть.
А вообще как вариант можно сделать вот что. Придумал работая над очередным сайтом. В системе в версии Start для реализации каталога или чего-то другого что требует реализации вложенных категорий можно использовать модуль "Новости". Создать в шаблоне данных новый тип данных (вернее подтип для "Лента новостей"), и для этого подтипа прописать свои шаблоны. И как говориться в путь. Можно в итоге вывести и меню для необходимого раздела, и организовать постраничную разбивку и.т.д.
В общем всё реализуется без проблем.
Название: Re:Меню из подстаниц на XSLT
Отправлено: pro2type.ru от 01 Декабря 2011, 14:11:30
Решение проблемы с Подменю...
Просто необходимо сделать проверку, если мы находимся в  Папке, то выводим подразделы, а если находимся в самом подразделе, то выводим все подразделы папки нашего подраздела в котором находимся.
Вот и все...

Папка
- Подраздел 1
- Подраздел 2
Папка 2
- Подраздел 1
- Подраздел 2

Это вставляем где надо выводить подменю:
<!-- Дополнительное меню -->
<xsl:for-each select="/result">
<xsl:choose>
<xsl:when test="/result/page/@parentId='0'">
<xsl:apply-templates select="document(concat('udata://content/menu/0/1/',/result/@pageId))/udata" mode="menu"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="document(concat('udata://content/menu/0/1/',/result/page/@parentId))/udata" mode="menu"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<!-- #Конец доп. меню -->

И сам шаблон подменю:
<!-- Menu -->
<xsl:template match="udata[@module = 'content'][@method = 'menu']" mode="menu">
<ul umi:add-method="popup"
umi:sortable="sortable"
umi:method="menu"
umi:module="content"
umi:element-id="{../@id}">
<xsl:apply-templates select="items/item" mode="menu"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="menu">
<li>
— <a href="{@link}" class="left" umi:element-id="{@id}" umi:region="row" umi:field-name="name" umi:empty="&empty-section-name;" umi:delete="delete">
<xsl:value-of select="@name" />
</a>
</li>
</xsl:template>
<xsl:template match="item[@status = 'active']" mode="menu">
<li class="active">
— <a href="{@link}" class="left">
<xsl:value-of select="@name"/>
</a>
</li>
</xsl:template>
<!-- #Menu -->

Внимание! В приведенном шаблоне подключен Edit-in-Place. Будьте внимательны!
Название: Re:Меню из подстаниц на XSLT
Отправлено: Axiomateria от 10 Мая 2013, 15:28:13
Решение проблемы с Подменю...
Просто необходимо сделать проверку, если мы находимся в  Папке, то выводим подразделы, а если находимся в самом подразделе, то выводим все подразделы папки нашего подраздела в котором находимся.

Попробовал вставить в объект каталога и не работает...
Вы эти шаблоны создали для простой информационной страницы (тип данных "Страница контента") ?
Название: Re:Меню из подстаниц на XSLT
Отправлено: BaceH от 12 Мая 2013, 01:17:30
Цитировать
@module = 'content'][@method = 'menu'
- да
для каталога используйте http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/katalog/catalog_getcategorylist/#xslt-templating - catalog getCategoryList()