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

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

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

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

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

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

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

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

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

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

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

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

*

muralex

  • *
  • 23
  • +0/-0
    • Просмотр профиля
    • Muralex - создание сайтов
Шаблон для модуля на XSLT
« : 04 Октября 2012, 17:35:21 »
Приветствую!
Взялись за написание своего модуля. Знания по XSLT очень скудные, и не можем разобраться в том, как вывести в нашем модуле информацию из модуля новостей.

Задача:
В новостях мы создаем структуру из лент новостей:
Категория 1
 - Подкатегория 1.1
    - Подкатегория 1.1.1
        - ....
    - Подкатегория 1.1.2
    - ...
Категория 2
  - ...
Вложенность может быть большой (но возможно получится ограничится 4-5 уровнем)

В нашем модуле нужно вывести список названий + id всех лент новостей (можно выпадающим списком, не принципиально думаю главное его получить)

Подскажите как это сделать?)

*

muralex

  • *
  • 23
  • +0/-0
    • Просмотр профиля
    • Muralex - создание сайтов
Re:Шаблон для модуля на XSLT
« Ответ #1 : 05 Октября 2012, 17:03:06 »
 <xsl:apply-templates select="document('udata://news/listlents/(20)/notemplate/10')" mode="news.lents">
                    <xsl:param name="doc-lents" select="document('udata://news/listlents/(20)')"></xsl:param>
                </xsl:apply-templates>
Но выводит все вместе...

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #2 : 07 Октября 2012, 11:17:17 »
Ну если чисто на XSLT, то получается на нужно применить lastlents к корню, потом к каждому элементу внутри и так до тех пор, пока количество элементов не станет равно нулю, т.е. будет означать что больше нет вложенных категорий.
На xslt это решается, но как-то будет выглядеть не особо красиво.

Проще использовать USEL.

Мы знаем, что нам нужно вернуть объекты типа "лента новостей". Знаем каталог, из которого нам нужно вернуть.

Пишем usel, указываем предполагаемую глубину deph.... тут думаю можно без комментариев.:
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type module="news" method="rubric" />
<category depth="10">{1}</category>
</target>
</selection>


Вызываем его -  localhost/usel/lentslist/37
Параметром идёт ID корня от которого начинаем поиск
Собственно вот мы и получили список лент.

Есть ещё варианты, если нужно воз можно написать свой макрос, если нужно возвращать именно в виде:
1. лента родитель
1.1 лента наследник
1.1.1. лента наследник

P.S. Я на тему подписался, если будут вопросы - задавай, подскажу/расскажу, вроде я уже шишек себе нормально набил.. Пора помочь фонду пострадавших от UMI

*

muralex

  • *
  • 23
  • +0/-0
    • Просмотр профиля
    • Muralex - создание сайтов
Re:Шаблон для модуля на XSLT
« Ответ #3 : 07 Октября 2012, 14:53:11 »
Вот полный листинг шаблона:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:spry="http://ns.adobe.com/spry">
  
    <xsl:template match="result[@method = 'tree']">

        <form enctype="multipart/form-data" method="POST">

            <span>Выберите zip архив</span>
            <input type="file" name="filename"/>
            <input type="submit" value="Отправить"/>

        </form>

       <SELECT name="state" size="1">
            <OPTION value="1">
                <xsl:apply-templates select="document('udata://news/listlents/(20)/notemplate/10')" mode="news.lents">
                    <xsl:param name="doc-lents" select="document('udata://news/listlents/(20)')"></xsl:param>
                </xsl:apply-templates>      
            </OPTION>
        </SELECT>    


    </xsl:template>  


</xsl:stylesheet>


Вот как получить нормальный список не понятно =(

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #4 : 07 Октября 2012, 21:48:05 »
Не могу понять - вообще ничего не получается сделать, т.е. такие операции на xslt не получаются ? Или что-то ещё ?...

Если я правильно понял, то нужно:
1. Создать в папке /usels/ файл lentslist.xml с содержимым
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type module="news" method="rubric" />
<category depth="10">{1}</category>
</target>
</selection>
2. Далее в ваш код нужно добавить вызов этого usel
   <SELECT name="state" size="1">
                <xsl:apply-templates select="document('usel://lentslist/20')/udata/page" mode="news-lents-usel"/>

        </SELECT>   

3. Описать шаблон для обработки USEL:
<xsl:template match="page" mode="news-lents-usel>
<option value="{@id}"><xsl:value-of select="./name"/></option>
</xsl:template>

*

muralex

  • *
  • 23
  • +0/-0
    • Просмотр профиля
    • Muralex - создание сайтов
Re:Шаблон для модуля на XSLT
« Ответ #5 : 08 Октября 2012, 15:42:29 »
Rodogor, спасибо!
Да теперь получилось, почти то что нужно =)

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

*

muralex

  • *
  • 23
  • +0/-0
    • Просмотр профиля
    • Muralex - создание сайтов
Re:Шаблон для модуля на XSLT
« Ответ #6 : 10 Октября 2012, 09:54:06 »
Есть еще вопросик, как получить их алиасы (имена транслитом нужны)?

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #7 : 10 Октября 2012, 10:33:58 »
Если мы посмотрим USEL ещё раз, то увидим, что usel возвращает alt-name, оно как бы и является именем в транслите.
<page id="107" parentId="4" link="/catalogue/audi/" is-active="1" object-id="712" type-id="168" update-time="1345953349" alt-name="audi" xlink:href="upage://107"><basetype id="48" module="catalog" method="category">Разделы каталога</basetype><name>Audi</name></page>

Для того, что бы вывести его, нужно использовать следующий код:
<xsl:value-of select="@alt-name"/>

Рекоммендую Вам посмотреть имеющиеся уроки от umi, темы на это форуме и прочую инфу, т.к. это является своего рода "hello, world!"

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #8 : 16 Октября 2012, 12:29:17 »
вы выводите в админке список новостных лент используя макросы для клиентской части сайта, почему решили отказаться от стандартной таблице которая например используется в модуле "Новости" ?

*

muralex

  • *
  • 23
  • +0/-0
    • Просмотр профиля
    • Muralex - создание сайтов
Re:Шаблон для модуля на XSLT
« Ответ #9 : 16 Октября 2012, 12:47:10 »
Потому что не знаем как на XSLT ее вывести в нашем модуле \=
Это решение тоже подошло, модуль реализовали =) м.б. не так красиво как хотелось бы, но пока подойдет.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #10 : 16 Октября 2012, 12:48:30 »
ну красиво, это не самоцель, по крайне мере пока вы разбираетесь)

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #11 : 20 Марта 2014, 20:46:51 »
Подскажите.
Как выводить ленту новостей автоматически?

В шаблоне если вписать вручную код, то все выводится
udata://news/lastlents/(vse_novosti)/notemplate/10/0

Есть разделы:
Лента
    Лента 1
          Новость 1
          Новость 2
    Лента 2
          Новость 3
          Новость 4
Почему код
<xsl:apply-templates select="result" />
Не выводит список вложенных лент 1 и 2, если зайти в раздел "Лента"
в шаблоне /news/lastlents.xsl подключен.
    <xsl:template match="udata[@module = 'news'][@method = 'lastlents']">
        <xsl:param name="page_id" select="'6'" />
        <div class="news_lents" umi:element-id="{$page_id}" umi:region="list" umi:module="news" umi:sortable="sortable" umi:button-position="top right" />
    </xsl:template>

    <xsl:template match="udata[@module = 'news'][@method = 'lastlents'][total]">
        <xsl:param name="page_id" select="'6'" />
        <div class="news_lents" umi:element-id="{$page_id}" umi:region="list" umi:module="news" umi:sortable="sortable" umi:button-position="top right">
            <xsl:apply-templates select="items/item" />
        </div>
    </xsl:template>

    <xsl:template match="udata[@method = 'lastlents']/items/item">
        <a href="{@link}" umi:element-id="{@id}" umi:region="row" umi:field-name="name" umi:field-type="string" umi:delete="delete" umi:empty="&empty-section-name;" umi:url-attribute="href">
            <xsl:apply-templates />
        </a>
    </xsl:template>



*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #12 : 20 Марта 2014, 20:56:19 »
Объясните, в чём именно заключается Ваш вопрос:
Вы заходите на страницу, тип данных которой "лента новостей", а лента новостей автоматически не выводится ?

В описываемой Вами структуре (..есть разделы..) есть ЛЕНТЫ и НОВОСТИ. Там должно быть чуть посложнее кодэ, что бы выводилась именно такая структура.

Мне кажется, что-то намудрено с шаблонами, судя по  <xsl:param name="page_id" select="'6'" />

Опишите более подробно, что хотите сделать и проверьте, может быть создаётся пустой <div class="news_lents"..../>
p.s. ну и давненько же я не заходил сюда

*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #13 : 20 Марта 2014, 21:22:50 »
Да, захожу на страницу, тип данных которой "лента новостей"
И хочу увидеть вложенные страницы, тип данных которых тоже "лента новостей".

Изначально было <xsl:param name="page_id" select="'0'" />

Пустых <div class="news_lents"..../> нету.

Я могу сделать отдельный шаблон,
зайдя на страницу, тип данных которой "лента новостей"
и в шаблоне /layouts/default.xsl
Прописать <xsl:apply-templates select="document('udata://news/lastlents/(6)/notemplate/10/0')/udata"/> и тогда увижу вложенные ленты новостей и это работает. В общем чтобы не городить отдельный шаблон, как вывести вложенные страницы.

Или может в  этом шаблона написать, условие если мы на странице news то выводим вложенные ленты.
                        
<xsl:if test="$pageid = 6">
<xsl:apply-templates select="document('udata://news/lastlents/(6)/notemplate/10/0')/udata"/>
</xsl:if>
                        



*

john

  • ***
  • 207
  • +6/-0
    • Просмотр профиля
Re:Шаблон для модуля на XSLT
« Ответ #14 : 08 Мая 2014, 19:15:46 »
Если мы посмотрим .XML
Видим
<result module="news" method="rubric" domain="domain.ru"  lang="ru" header="Новости" title="UMI.CMS - Новости" site-name="umicms.demo site" request-uri="/news1.xml" pageId="6">
<xsl:if test="$pageid = 6"> то почему не выполняется проверка, как написать проверку текущей страницы?