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

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

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

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

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

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

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

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

Ответов: 8
Просмотров: 5530
Последний ответ 13 Июнь 2011, 00:41:56
от talanter
XSLT: вызов существующего раздела из вновь созданной пустой старницы

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

Ответов: 9
Просмотров: 1541
Последний ответ 16 Ноябрь 2014, 23:19:20
от admin

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

  • *****
  • 2421
  • +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

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

*

john

  • ***
  • 206
  • +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

  • ***
  • 206
  • +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

  • ***
  • 206
  • +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"> то почему не выполняется проверка, как написать проверку текущей страницы?