Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

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

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
И снова здравствуйте!
Основываясь на теме http://umihelp.ru/forum/index.php/topic,1128.msg3656.html#msg3656  я немного отредактировал шаблон category-view.xsl  из набора "demodizzy"в папке ../modules/catalog/

и в категории (то есть в разделе) туров у меня успешно выводятся ссылки на программы туров так:
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '////2/'))/udata" mode="table-view" />

сама ссылка на тур выводится уже далее в шаблоне так:

    <xsl:template match="udata[@method = 'getObjectsList'][total]" mode="table-view">      
         <xsl:apply-templates select="lines/item">
            <xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
         </xsl:apply-templates>                    
            <xsl:apply-templates select="total" />   
   </xsl:template>

и в конечном виде так:    
<xsl:template match="page|item">         
    <a href="{@link}" title="{.//property[@name='h1']/value}">
            <xsl:value-of select="name" />
            <xsl:if test="not(name)">
               <xsl:apply-templates />
            </xsl:if>
         </a>
   </xsl:template>


И вот теперь суть вопроса:
надо в этой категории (разделе) туров что бы помимо ссылки на сам тур вывести ещё три его значения параметров как:
1. дата заезда (с и по)
2. количество дней (3 дня)
3. дни недели (пн-ср)
. и сама ссылка на тур, которая и так уже выводиться.
Эти данные параметров и их значений успешно введены и выводятся на уровне просмотра каждого объекта отдельно в своём шаблоне object-view.xsl  

А вот как сделать что бы на уровне категории (раздела) эти данные подгружать для каждого объекта?
(планируется в табличной форме их выводить).

Через <xsl:copy-of select="." /> в xml файле страницы категории (разделов)  туров эти параметры так же видны, вот кусочек кода с ними:

<body>
<property id="124" name="h1" type="string">
<title>Поле H1</title>
<value>Столица Российской империи - 3 дня</value>
</property><property id="429" name="start_tour" type="date">
<title>Начало тура</title>
<value formatted-date="01.07.2013 00:00" unix-timestamp="1372622400">Mon, 01 Jul 2013 00:00:00 +0400</value>
</property><property id="430" name="end_tour" type="date">
<title>Окончание тура</title>
<value formatted-date="03.07.2013 00:00" unix-timestamp="1372795200">Wed, 03 Jul 2013 00:00:00 +0400</value>
</property><property id="432" name="day_score" type="relation">
<title>Количество дней</title>
<value><item id="683" name=" - 3 дня" type-id="138" ownerId="628" xlink:href="uobject://683"/></value>
</property>

 вопрос конечно каких вытащить наружу ?

Вот вроде бы ещё одна тема похожая по смыслу моего вопроса, только про макрос "getCategoryList":
http://umihelp.ru/forum/index.php/topic,1519.msg6158.html#msg6158
там речь идёт о вытаскивания наружу отдельных значений параметров из объектов каталога...
« Последнее редактирование: 09 Июля 2013, 15:15:36 от Axiomateria »

*

thecoder

  • *
  • 44
  • +0/-0
    • Просмотр профиля
у меня сделано так (может и не правильно, сам еще учусь, но работает)

<xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>

выводит номер дома
« Последнее редактирование: 09 Июля 2013, 15:26:50 от thecoder »

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
<xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>

$link - это переменная от чего именно ? и кстати, этот вызов вы в какую конкретно часть шаблона вставляете ?  

*

thecoder

  • *
  • 44
  • +0/-0
    • Просмотр профиля
на странице надо вывести список объявлений из раздела каталога
 <xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53')/udata" mode =  "adv"/>

потом шаблон вывода каждого объявления

<xsl:template match="udata[@module = 'catalog'][@method = 'getObjectsList']" mode = "adv">
в котором
<xsl:apply-templates select="lines/item" mode="adv"/>

<xsl:template match="item" mode="adv">
        <xsl:variable name="link" select="@link"/>
        ............
        <xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>
</xsl:template>

@link - ссылка на страницу объекта каталога, которую уже и обрабатываешь через upage.

Но мой подход скорее все не правильный. т.к. если таким образом выводить 10 значений из объявления, то будет 10 обращений к БД, что не есть гуд, т.к. замедляет работу. Надо как-то решить этот вопрос за одно обращение. Может admin подскажет как сделать.

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
... мой подход скорее все не правильный. т.к. если таким образом выводить 10 значений из объявления, то будет 10 обращений к БД, что не есть гуд, т.к. замедляет работу. Надо как-то решить этот вопрос за одно обращение. Может admin подскажет как сделать....

Я уже составил обращение с вопросом к уважаемому admin про расширенный вывод значений параметров к объекту в с списке превьюшек категории (раздела). Будем ожидать ответа.
У меня пока ни чего получается с этим...
В demodizzyy превьюшки объектов в списке категории очень-таки упрощённые по сравнению с тем же магазином хомячков...
« Последнее редактирование: 09 Июля 2013, 20:20:52 от Axiomateria »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
вс
на странице надо вывести список объявлений из раздела каталога
 <xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53')/udata" mode =  "adv"/>

потом шаблон вывода каждого объявления

<xsl:template match="udata[@module = 'catalog'][@method = 'getObjectsList']" mode = "adv">
в котором
<xsl:apply-templates select="lines/item" mode="adv"/>

<xsl:template match="item" mode="adv">
        <xsl:variable name="link" select="@link"/>
        ............
        <xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>
</xsl:template>

@link - ссылка на страницу объекта каталога, которую уже и обрабатываешь через upage.

Но мой подход скорее все не правильный. т.к. если таким образом выводить 10 значений из объявления, то будет 10 обращений к БД, что не есть гуд, т.к. замедляет работу. Надо как-то решить этот вопрос за одно обращение. Может admin подскажет как сделать.

вариант имеет место быть, а вообще у вас есть 3 варианта

1. при обработке каждого item в шаблоне для краткой карточки товара сделать по отдельному вызову для каждого параметра, как предложил thecoder

2. при обработке каждого item в шаблоне для краткой карточки товара получить xml с информацией о странице (один запрос) и работать уже с ней вытягивая из него дочерние узлы и атрибуты, как будто вы работаете со страницей данного товара (разница только в том что вы подставляете переменную из которой вытягиваете какие-то данные). Пример на основе thecoder  примера:
<xsl:template match="item" mode="adv">
        <xsl:variable name="link" select="@link"/>
        <xsl:variable name="item_info" select="document(concat('upage://', $link))/udata"/>
        ............
        <xsl:value-of select="$item_info//property[@name='num_house']/value"/>
        <xsl:value-of select="$item_info//property[@name='day_score']/value/item/@name"/>

3. при вызове макросов которые возвращают списки чего-то (список категорий, список товаров, список новостей) вы можете воспользоаться параметром ?extProps который сразу вернет вам необходимые данные (см в документации). В итоге указав эти свойства в вызове:

<xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53?extProps=day_score,num_house')/udata" mode =  "adv"/>

вы можете спокойно их выводить в шаблоне краткой карточки, так как они уже присутствуют в вашем xml
<xsl:template match="item" mode="adv">
        ............
        <xsl:value-of select=".//property[@name='num_house']/value"/>
        <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>

только помните что раз у вас появились доп данные то вызов в краткой карточке вида
<xsl:apply-templates />
(вы используете его при выводе имени) выведет еще и внутреннюю информацию о расширенных полях, так что замените его на
<xsl:value-of select="text()" />
, который выведет только текст текущего узла (то что вам и надо)

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Я решил использовать третий вариант:
3. при вызове макросов которые возвращают списки чего-то (список категорий, список товаров, список новостей) вы можете воспользоаться параметром ?extProps который сразу вернет вам необходимые данные (см в документации). В итоге указав эти свойства в вызове:

<xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53?extProps=day_score,num_house')/udata" mode =  "adv"/>

вы можете спокойно их выводить в шаблоне краткой карточки, так как они уже присутствуют в вашем xml
<xsl:template match="item" mode="adv">
        ............
        <xsl:value-of select=".//property[@name='num_house']/value"/>
        <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>

только помните что раз у вас появились доп данные то вызов в краткой карточке вида
<xsl:apply-templates />
(вы используете его при выводе имени) выведет еще и внутреннюю информацию о расширенных полях, так что замените его на
<xsl:value-of select="text()" />
, который выведет только текст текущего узла (то что вам и надо)

Однако что-то или где-то я упустил или недопонял.
Получается так: пытаюсь вывести данные из свойства поля "Кол-во дней", то есть из "day_score" значение которого у каждого объекта каталога (тура) своё так:
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/> 

Обработка шаблоном этого вывода успешно совершается таким:
    <xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="dayscore">
       <xsl:apply-templates select="lines/item" mode="dayscore"/>      
    </xsl:template>
    <xsl:template match="item" mode="dayscore">
        <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>  
    </xsl:template>

Однако вот в чём загвоздочка - объектов у меня несколько (то есть пока два тура) и данные по количеству дней как "2 дня", "3 дня" и т.п. должны по идее выводится в каждом объекте (туре) свои собственные.

НО получается так, что в каждом туре количество дней выводиться сразу все значения "2 дня", "3 дня" вместе для обоих туров.

Выглядит это в табличке так:
http://temp03.web-image.ru/travel_tours/prefabricated_tours_to_st_petersburg_for_individual_tourists/

С днями недели такая же несуразица...
« Последнее редактирование: 10 Июля 2013, 14:52:51 от Axiomateria »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
приведите ваш шаблон который выводит краткую карточку товара (из вашего примера это шаблон

<xsl:template match="item" mode="dayscore">
        <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/> 
    </xsl:template>
)

но что-то мне подсказывает, что вы вызываете его немного не там или не так и таким образом подхватываете лишние  данные.

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
но что-то мне подсказывает, что вы вызываете его немного не там или не так и таким образом подхватываете лишние  данные.

У меня такие же ощущения - накорявил я где-то...

Вот полностью шаблон как есть на данный момент:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">

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

  <xsl:template match="/result[@method = 'category' and page/@type-id=150]">                
           <div class="rama">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr align="center" bgcolor="#E2C4A4">
    <td>Заезды</td>
    <td>Кол-во дней</td>
    <td>Дни недели</td>
    <td>Тур</td>
  </tr>
    <xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '////2/'))/udata" mode="table-view-1" />
</table>
     
           </div>
           <div class="bord3"> </div>
              <xsl:if test=".//property[@name = 'attention']/value">
                  <span class="warning">
                     <xsl:value-of select=".//property[@name = 'attention']/value" disable-output-escaping="yes" />
                  </span>         
              </xsl:if>
              <xsl:if test=".//property[@name = 'descr']/value">
                  <div class="text2">
                     <xsl:value-of select=".//property[@name = 'descr']/value" disable-output-escaping="yes" />
                  </div>
               </xsl:if>                   
</xsl:template>


 
    <xsl:template match="udata[@method = 'getObjectsList']" mode="table-view-1">
<xsl:apply-templates select="document('udata://catalog/search')" />
<xsl:text>&empty-category;</xsl:text>
</xsl:template>
   
    <xsl:template match="udata[@method = 'getObjectsList'][total]" mode="table-view-1">   
<xsl:apply-templates select="lines/item">
<xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
</xsl:apply-templates>                     
            <xsl:apply-templates select="total" />
</xsl:template>
 
 
    <xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="dayscore">
       <xsl:apply-templates select="lines/item" mode="dayscore"/>     
    </xsl:template>
    <xsl:template match="item" mode="dayscore">
        <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/> 
    </xsl:template>
 
   
    <xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="adv2">
      <xsl:apply-templates select="lines/item" mode="adv2"/>
    </xsl:template>
    <xsl:template match="item" mode="adv2">
      <xsl:value-of select=".//property[@name='first_day_tours']/value/item/@name"/> - <xsl:value-of select=".//property[@name='last_day_tours']/value/item/@name"/>
    </xsl:template>
 
    <xsl:template match="page|item">
    <tr>
    <td><b> 00 </b></td>
    <td>
     <xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/>           
    </td>
    <td>
       <xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=first_day_tours,last_day_tours')/udata" mode="adv2"/>
    </td>
    <td>           
    <a href="{@link}" title="{.//property[@name='h1']/value}">
<xsl:value-of select="name" />
<xsl:if test="not(name)">
<xsl:apply-templates mode="table-view-1" />
</xsl:if>
</a>
    </td>
    </tr>
</xsl:template>
 

</xsl:stylesheet>

*

thecoder

  • *
  • 44
  • +0/-0
    • Просмотр профиля
Ошибка скорее всего тут:

Цитировать
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/>   
         

getObjectsList Выводит список объектов каталога в указанном разделе.
а раздел у вас не указан.

Я тоже использую getObjectsList, но  у меня так:

udata://catalog/getObjectsList/0/53

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
вы не совсем верно применили extProps, Его нужно применять при самом первом вызове, а затем разбирая список который вернул вам макрос внутри item или page (в зависимости от макроса) у вас появляются новые данные, с которыми вы и работаете в шаблоне для item или page. То есть в вашем шаблоне лишние вызовы, лишние шаблоны. Ваш шаблон будет выглядеть так (опять же не проверял, но логика верная)

==========================================
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM   "ulang://i18n/constants.dtd:file">

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

     <xsl:template match="/result[@method = 'category' and page/@type-id=150]">                  
           <div class="rama">
            <table width="100%" border="0" cellspacing="0" cellpadding="0">
              <tr align="center" bgcolor="#E2C4A4">
               <td>Заезды</td>
               <td>Кол-во дней</td>
               <td>Дни недели</td>
               <td>Тур</td>
              </tr>
               <xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '////2/?extProps=day_score,first_day_tours,last_day_tours'))/udata" mode="table-view-1" />
            </table>
     
           </div>
           <div class="bord3"> </div>
              <xsl:if test=".//property[@name = 'attention']/value">
                  <span class="warning">
                     <xsl:value-of select=".//property[@name = 'attention']/value" disable-output-escaping="yes" />
                  </span>         
              </xsl:if>
              <xsl:if test=".//property[@name = 'descr']/value">
                  <div class="text2">
                     <xsl:value-of select=".//property[@name = 'descr']/value" disable-output-escaping="yes" />
                  </div>
               </xsl:if>                   
   </xsl:template>


 
    <xsl:template match="udata[@method = 'getObjectsList']" mode="table-view-1">
      <xsl:apply-templates select="document('udata://catalog/search')" />
         <xsl:text>&empty-category;</xsl:text>
   </xsl:template>
   
    <xsl:template match="udata[@method = 'getObjectsList'][total]" mode="table-view-1">      
         <xsl:apply-templates select="lines/item">
            <xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
         </xsl:apply-templates>                     
            <xsl:apply-templates select="total" />   
   </xsl:template>
 
 
    <!-- <xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="dayscore">
       <xsl:apply-templates select="lines/item" mode="dayscore"/>     
    </xsl:template>
    <xsl:template match="item" mode="dayscore">
        <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/> 
    </xsl:template>
 
   
    <xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="adv2">
      <xsl:apply-templates select="lines/item" mode="adv2"/>
    </xsl:template>
    <xsl:template match="item" mode="adv2">
      <xsl:value-of select=".//property[@name='first_day_tours']/value/item/@name"/> - <xsl:value-of select=".//property[@name='last_day_tours']/value/item/@name"/>
    </xsl:template> -->
 
    <xsl:template match="page|item">   
      <tr>
         <td><b> 00 </b></td>
         <td>                
            <xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>      
         </td>
      <td>            
          <xsl:value-of select=".//property[@name='first_day_tours']/value/item/@name"/> - <xsl:value-of select=".//property[@name='last_day_tours']/value/item/@name"/>
         
      </td>
      <td>           
      <a href="{@link}" title="{.//property[@name='h1']/value}">
               <xsl:value-of select="name" />
               <xsl:if test="not(name)">
                  <xsl:apply-templates mode="text()" />
               </xsl:if>
            </a>
      </td>
      </tr>
   </xsl:template>
 

</xsl:stylesheet>
==========================================

выделили места которые правил

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Ошибка скорее всего тут:

Цитировать
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/>   
         

getObjectsList Выводит список объектов каталога в указанном разделе.
а раздел у вас не указан.

Я тоже использую getObjectsList, но  у меня так:

udata://catalog/getObjectsList/0/53

параметр указывающий id или ссылку страницы, не обязателен, если вы вызываете макрос в разделе товары которого и хотите вывести (то есть макрос в отсутствии этого параметра будет работать с текущим каталогом)

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
         
      <a href="{@link}" title="{.//property[@name='h1']/value}">
               <xsl:value-of select="name" />
               <xsl:if test="not(name)">
                  <xsl:apply-templates mode="text()" />
               </xsl:if>

ну вот почти всё идеально сработало!
однако если указан вызов в таком виде как <xsl:apply-templates mode="text()" />
то система пишет ошибку такую :
---------------------------------------------------------
Warning: XSLTProcessor::importStylesheet(): compilation error: file /var/www/clients/client0/web106/web/templates/rusgorod/xslt/modules/catalog/category-view-id150.xsl line 75 element apply-templates in /var/www/clients/client0/web106/web/classes/system/subsystems/umiTemplaters/types/umiTemplaterXSLT.php on line 33 Warning: XSLTProcessor::importStylesheet(): The value 'text()' of the attribute 'mode' is not a valid QName. in /var/www/clients/client0/web106/web/classes/system/subsystems/umiTemplaters/types/umiTemplaterXSLT.php on line 33 Warning: XSLTProcessor::transformToXml(): No stylesheet associated to this object in /var/www/clients/client0/web106/web/classes/system/subsystems/umiTemplaters/types/umiTemplaterXSLT.php on line 53
--------------------------------------------------------

где 75 строчка это <xsl:apply-templates mode="text()" />

а если указать такой: <xsl:apply-templates />, то вместе с ссылкой на объект (тур) выводится и его свойства как количество дней, первый и последний день недели да ещё и дату заездов в придачу, которую я только что подставил...
в общем это сейчас вот так и выглядит здесь:
http://temp03.web-image.ru/travel_tours/prefabricated_tours_to_st_petersburg_for_individual_tourists/


« Последнее редактирование: 10 Июля 2013, 23:33:30 от Axiomateria »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
пардон, вместо
<xsl:apply-templates mode="text()" />
надо
<xsl:value-of select="text()" />

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
надо
<xsl:value-of select="text()" />

Отлично, сработало!  Спасибо за разъяснения!

У меня осталось последние уточнение (для отдельной темы наверное) по выводу даты.
Вопрос:
возможно ли выводить дату для содержимого поля "start_tour" без указания года, то есть что бы дата начала и окончания заезда тура была такой "01.07- 03.07.2013"
?