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

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

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

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

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

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

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

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

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

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

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

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

*

Phoenix-75

  • *
  • 3
  • +0/-0
    • Просмотр профиля
Меню из подстаниц на XSLT
« : 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. И вот тут что-то у меня случился ступор. И никак не соображу как сделать. Жара что-то уж черезчур сильно на меня подействовала. Очень пропошу, укажите направление куда копать.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #1 : 01 Августа 2011, 17:23:53 »
так вопрос в чем как вывести с помощью xslt многоуровневое меню?
или в том как указать на каких страницах откуда отсчитывать начало вывода меню "надо вывести на страницах 4 и 5 например типа меню из подстраниц которые они содержат, и чтоб это меню отображалась и на самих подстраницах"

иил как вывести подобие многоуровневое меню без использования content menu макроса?

*

Phoenix-75

  • *
  • 3
  • +0/-0
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #2 : 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
И такое же меню на всех этих подстраницах.
Т.е. фактически я хочу добиться что-то типа пагинации по разделу каталога, когда зайдя в последний раздел, у нас выводится меню из товаров данного раздела каталога.
Вот вроде сейчас описал правильно.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #3 : 01 Августа 2011, 17:45:15 »
если дождетесь ночи, отпишу) сейчас не успею

*

Phoenix-75

  • *
  • 3
  • +0/-0
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #4 : 01 Августа 2011, 17:51:11 »
Не знаю, высижу ли я до ночи, но с утра точно здесь буду.

*

grave

  • *****
  • 32
  • +4/-0
    • Просмотр профиля
    • Студия Webartika
Re:Меню из подстаниц на XSLT
« Ответ #5 : 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>

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #6 : 02 Августа 2011, 00:25:59 »
было бы круто если бы ваши страницы псевдо разделы и псевдо объекты каталога имели отдельные типы данных, дочернии к страницам обычным.
Тогда можно было бы применять к ним шаблон не прописывая все возможные id, а просто проверять страницу на то, является ли она псевдо каталогом или нет.  Если нет, то искать псевдо раздел каталога в родителях данной страницы и первый же найденный был бы отправной точкой для построения меню

*

PHOENIX-75

  • *
  • 22
  • +3/-0
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #7 : 02 Августа 2011, 09:28:30 »
grave, спасибо большое, но но сколько я тогда понимаю, в шаблон придется прописывать все id страниц от которых надо будет начинать отсчёт для проверки и отображения меню. Это конечно вариант, но тогда теряется гибкость, ведь если будет создан ещё один раздел, то придется лезть в шаблон и дописывать под него условие.

*

PHOENIX-75

  • *
  • 22
  • +3/-0
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #8 : 02 Августа 2011, 09:32:48 »
было бы круто если бы ваши страницы псевдо разделы и псевдо объекты каталога имели отдельные типы данных, дочернии к страницам обычным.
Тогда можно было бы применять к ним шаблон не прописывая все возможные id, а просто проверять страницу на то, является ли она псевдо каталогом или нет.  Если нет, то искать псевдо раздел каталога в родителях данной страницы и первый же найденный был бы отправной точкой для построения меню


А можно немного по-подробнее. Т.е. я так понимаю, в модуле "шаблоны данных" надо создать для типа данных "Страница контента" как бы подтип, и назвать например "Раздел каталога". А дальше? Не совсем понял как сделать проверку, ведь у данного типа всё-равно будет и  module="content" method="content"
« Последнее редактирование: 02 Августа 2011, 09:34:44 от PHOENIX-75 »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #9 : 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>

*

PHOENIX-75

  • *
  • 22
  • +3/-0
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #10 : 02 Августа 2011, 12:06:15 »
Спасибо, идею понял. Буду пробовать.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #11 : 02 Августа 2011, 12:10:54 »
как чего получиться, отпиши сюда, другим пригодится)

*

PHOENIX-75

  • *
  • 22
  • +3/-0
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #12 : 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 родительской страницы. Вот как-то так, здесь я приплыл.
Прошу совета, помощи.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #13 : 03 Августа 2011, 22:47:10 »
насчет того что выводит вам шаблон, он все правильно выводит

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

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

на каких страницах какие ссылки вы хотите видеть?

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Меню из подстаниц на XSLT
« Ответ #14 : 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>