UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: muralex от 04 Октября 2012, 17:35:21

Название: Шаблон для модуля на XSLT
Отправлено: muralex от 04 Октября 2012, 17:35:21
Приветствую!
Взялись за написание своего модуля. Знания по XSLT очень скудные, и не можем разобраться в том, как вывести в нашем модуле информацию из модуля новостей.

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

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

Подскажите как это сделать?)
Название: Re:Шаблон для модуля на XSLT
Отправлено: muralex от 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>
Но выводит все вместе...
Название: Re:Шаблон для модуля на XSLT
Отправлено: Rodogor от 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
Название: Re:Шаблон для модуля на XSLT
Отправлено: muralex от 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>


Вот как получить нормальный список не понятно =(
Название: Re:Шаблон для модуля на XSLT
Отправлено: Rodogor от 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>
Название: Re:Шаблон для модуля на XSLT
Отправлено: muralex от 08 Октября 2012, 15:42:29
Rodogor, спасибо!
Да теперь получилось, почти то что нужно =)

Попробуем доработать дальше, тему пока не закрываю, возможно будут еще вопросы по улучшению)
Название: Re:Шаблон для модуля на XSLT
Отправлено: muralex от 10 Октября 2012, 09:54:06
Есть еще вопросик, как получить их алиасы (имена транслитом нужны)?
Название: Re:Шаблон для модуля на XSLT
Отправлено: Rodogor от 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!"
Название: Re:Шаблон для модуля на XSLT
Отправлено: admin от 16 Октября 2012, 12:29:17
вы выводите в админке список новостных лент используя макросы для клиентской части сайта, почему решили отказаться от стандартной таблице которая например используется в модуле "Новости" ?
Название: Re:Шаблон для модуля на XSLT
Отправлено: muralex от 16 Октября 2012, 12:47:10
Потому что не знаем как на XSLT ее вывести в нашем модуле \=
Это решение тоже подошло, модуль реализовали =) м.б. не так красиво как хотелось бы, но пока подойдет.
Название: Re:Шаблон для модуля на XSLT
Отправлено: admin от 16 Октября 2012, 12:48:30
ну красиво, это не самоцель, по крайне мере пока вы разбираетесь)
Название: Re:Шаблон для модуля на XSLT
Отправлено: john от 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>


Название: Re:Шаблон для модуля на XSLT
Отправлено: Rodogor от 20 Марта 2014, 20:56:19
Объясните, в чём именно заключается Ваш вопрос:
Вы заходите на страницу, тип данных которой "лента новостей", а лента новостей автоматически не выводится ?

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

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

Опишите более подробно, что хотите сделать и проверьте, может быть создаётся пустой <div class="news_lents"..../>
p.s. ну и давненько же я не заходил сюда
Название: Re:Шаблон для модуля на XSLT
Отправлено: john от 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>
                        


Название: Re:Шаблон для модуля на XSLT
Отправлено: john от 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"> то почему не выполняется проверка, как написать проверку текущей страницы?
Название: Re:Шаблон для модуля на XSLT
Отправлено: admin от 14 Мая 2014, 13:26:12
Подскажите.
Как выводить ленту новостей автоматически?

В шаблоне если вписать вручную код, то все выводится
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>




Ваш вопрос почему вы не видите на странице "Лента" дочерние ленты новостей?
При этом, в приведенном вами xml куске шаблонов мы видим шаблоны для вывода дочерних лент. Но мы не видим шаблона, который срабатывает по умолчанию для страниц типа "Лента новостей". По умолчанию, он такой
<xsl:template match="/result[@module = 'news'][@method = 'rubric']">
<xsl:apply-templates select="document('udata://news/lastlist/?extProps=publish_time,anons')" />
</xsl:template>

и тут четко видно, что система и не пытается вызвать макрос udata://news/lastlents/ для вывода дочерних лент. Возможно, в этом и есть решение вашей проблемы.