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

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

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
И снова здравствуйте! Продолжаю осваивать demodizzy и расширять возможности представления товаров (объектов каталога)

Задачка такова:
Надо вывести отфильтрованный список объектов по значению справочника "Ведомственные гостиницы" в виде отдельного списка на своей отдельной странице. то есть вывести те самые объекты каталога - "Ведомственные гостиницы", в которых установлено данное значение из справочника.

Вот такой файл HotelsStarsDepartmental.xml в папке usels по идее задаёт условия фильтрации:

<?xml version="1.0" encoding="utf-8"?>
<selection>
   <target expected-result="pages">
 <type module="catalog" method="object" />
[b] <type id="130"/>[/b]
   </target>
   [b]<property name="stars">[/b]
     [b]<object>644</object>[/b]
   </property>
   <limit page="0">{limit}</limit>
</selection>

в котором:  
<type id="130"/> - тип объекта каталога, то есть "Гостиница",
<property name="stars"> - наименование поля в объекте каталога (в гостинице) где выпадающий список со справочником,
<object>644</object> - идентификатор свойства справочника "Ведомственные гостиницы".
.
И этот файл вызывается в простой текстовой странице common.xsl в папке modules/content/

    <xsl:template match="result[@module = 'content' and page/@type-id=164]">             
    <p><xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" /></p>              
             <xsl:apply-templates select="document('usel://HotelsStarsDepartmental/')/udata" mode="filter-list-hotels" />                                    
</xsl:template>

и вот на этой самой странице отображаются два специально созданных объекта с указанными в свойствах элементе справочника "Ведомственные гостиницы":
http://temp03.web-image.ru/information_for_tourists/hotels/hotels_stars_departmental/

и вот я в непонятности - почему только наименования этих объектов (гостиниц) выводятся, когда как там у них ещё большая куча всяких свойств?
Очевидно  конечно что надо создать шаблон для mode="filter-list-hotels", однако в самом файле
http://temp03.web-image.ru/usel://HotelsStarsDepartmental/ ни чего кроме названия этих двух объектов и нет...

Что надо делать в первую очередь -  HotelsStarsDepartmental.xml как-то доделать и/или всё дело в пока не созданном шаблоне mode="filter-list-hotels"
?

В конечном итоге надо отобразить эти два тестовых объекта так же как и они же здесь в числе других отображаются списком в общем разделе "Гостиницы": http://temp03.web-image.ru/information_for_tourists/hotels/

*

NOIRMAN

  • *****
  • 101
  • +16/-1
    • Просмотр профиля
1. Конечно же создавать шаблон для вывода информации из запроса надо. Тут вы правы на все 100
2. Способ первый. Вы в запросе получили самое главное - id страницы с объектом гостиницы. В создаваемом шаблоне можно воспользоваться им для обращения к странице самого объекта (upage://@id) и дальше творить что угодно.
3. Способ второй. Воспользоваться в самом запросе usel тегом <extended> (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/#extended) и собрать в него самого все необходимые для вывода свойства объекта.

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
1. Конечно же создавать шаблон для вывода информации из запроса надо. Тут вы правы на все 100
2. Способ первый. Вы в запросе получили самое главное - id страницы с объектом гостиницы. В создаваемом шаблоне можно воспользоваться им для обращения к странице самого объекта (upage://@id) и дальше творить что угодно.
3. Способ второй. Воспользоваться в самом запросе usel тегом <extended> (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/#extended) и собрать в него самого все необходимые для вывода свойства объекта.

Спасибо, NOIRMANN!
Я сразу два способа (пункт 2 и 3) применил в дело.

В итоге получилось, то что и задумывалось по идее - отфильтрованный список объектов по указанному элементу справочника, который обрабатывается в шаблоне mode="filter-list-hotels":

<xsl:template match="result[@module = 'content' and page/@type-id=164]">             
  <p><xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" /></p>              
          <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>
                <td>Цена от (руб)</td>
              </tr>
                <xsl:apply-templates select="document(concat('usel://HotelsStarsDepartmental/', page/@id, '////2/?extProps=name,stars,metro,hotel_address,minimum_price_per_room'))/udata" mode="filter-list-hotels" />
                
            </table>
          </div>  
     </xsl:template>      
     <xsl:template match="udata[@method = 'getObjectsList']" mode="filter-list-hotels">
       <xsl:apply-templates select="document('udata://catalog/search')" />
          <xsl:text>&empty-category;</xsl:text>
     </xsl:template>  
     <xsl:template match="udata[@method = 'getObjectsList'][total]" mode="filter-list-hotels">      
          <xsl:apply-templates select="lines/item" mode="filter-list-hotels">
             <xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
          </xsl:apply-templates>              
     </xsl:template>
     <xsl:template match="page|item" mode="filter-list-hotels">  
       <tr>
         <td>          
<a href="{@link}" title="{.//property[@name='h1']/value}">
<xsl:value-of select="name" />
</a>
           </td>
           <td>              
              <xsl:value-of select=".//property[@name='stars']/value/item/@name"/>
           </td>
           <td>                
              <xsl:value-of select=".//property[@name='metro']/value/item/@name"/>  
           </td>
           <td>            
              <xsl:value-of select=".//property[@name='hotel_address']/value"/>        
           </td>
           <td>            
             <xsl:value-of select=".//property[@name='minimum_price_per_room']/value/item/@name"/>      
          </td>
        </tr>
     </xsl:template>  
Сам же файл HotelsStarsDepartmental.xml теперь вот такой изнутри:
<?xml version="1.0" encoding="utf-8"?>
<selection>
   <target expected-result="pages">
 <type module="catalog" method="object" />
 <type id="130"/>
   </target>
   <property name="stars">
      <object>644</object>
   </property>
   <extended>
      <properties>name, stars, metro, hotel_address, minimum_price_per_room</properties>
   </extended>
   <limit page="0">{limit}</limit>
</selection>

Однако то что снаружи выходит из этих файлов имеет место вывода и количества <total>2</total> этих отфильтрованных объектов, которое на данный момент на странице http://temp03.web-image.ru/information_for_tourists/hotels/hotels_stars_departmental/ равно 2. Эта цифра видна над таблицей.
Не могу найти где эту цифру закрыть в шаблоне , подскажите, пожалуйста.
 

*

NOIRMAN

  • *****
  • 101
  • +16/-1
    • Просмотр профиля
Что то не так в вашем выводе тут ... в запросе есть одна переменная и у нее есть имя limit, тогда как в вы пытаетесь вызвать его выполнение с применением @id конкретной страницы, и без значения переменной (в данном случае ограничение просто прооигнорируется).
<xsl:apply-templates select="document(concat('usel://HotelsStarsDepartmental/', page/@id, '////2/?extProps=name,stars,metro,hotel_address,minimum_price_per_room'))/udata" mode="filter-list-hotels" />

Дальше. Посмотрите внимательно на ваш вывод usel и попробуейте найти указываемый вами метод
<xsl:template match="udata[@method = 'getObjectsList'][total]" mode="filter-list-hotels"> 
Думаю, что у вас этого не получится. Точно то же самое будет и у скрипта )) оставтье просто
<xsl:template match="udata[total]" mode="filter-list-hotels"> 
« Последнее редактирование: 20 Июля 2013, 17:06:08 от NOIRMAN »

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
... оставтье просто
<xsl:template match="udata[total]" mode="filter-list-hotels"> 
Я попробовал сделать
<xsl:template match="udata[total]" mode="filter-list-hotels"> 
, но в итоге ни одного объекта вообще не вывелось...

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Дальше. Посмотрите внимательно на ваш вывод usel и попробуейте найти указываемый вами метод
<xsl:template match="udata[@method = 'getObjectsList'][total]" mode="filter-list-hotels"> 
Думаю, что у вас этого не получится. Точно то же самое будет и у скрипта )) оставтье просто
- это понятно, что дело не в USEL,
Что то не так в вашем выводе тут ... в запросе есть одна переменная и у нее есть имя limit, тогда как в вы пытаетесь вызвать его выполнение с применением @id конкретной страницы, и без значения переменной
скорее всего надо  конечнопеределать этот вызов
<xsl:apply-templates select="document(concat('usel://HotelsStarsDepartmental/', page/@id, '////2/?extProps=name,stars,metro,hotel_address,minimum_price_per_room'))/udata" mode="filter-list-hotels" />
но даже и не знаю с какой стороны тут подойти...разные варианты пробую, но ни чего путного не выходит...

*

NOIRMAN

  • *****
  • 101
  • +16/-1
    • Просмотр профиля
Как бы я решил данную задачу. Примем за факт, что usel запрос в том виде, что мы видим в его последней редакции здесь.
Для начала надо определиться - нужно нам ограничение выборки по количеству или нет. Если нет, то строчку тега <limit> просто долой. (По логике показывать все объекты данного типа на одной странице, я бы так и поступил. Иначе надо бы еще где то и пагинатор постраничный вписывать).
Далее.
Из шаблона страницы вызываем наш запрос. Тут ничего не прибавить ни убавить от вашего же кода:
<xsl:template match="result[@module = 'content' and page/@type-id=164]">
  <p><xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" /></p>
   <xsl:apply-templates select="document('usel://HotelsStarsDepartmental/')/udata" mode="filter-list-hotels" />
</xsl:template>
Дальше обрабатываем вариант, когда нам ничего не вернулось
<xsl:template match="udata" mode="filter-list-hotels">
  <!-- Кусок html, сообщающий о том, что нет таких гостиниц в нашей системе. -->
</xsl:template>
Обработка варианта, когда есть удовлетворяющие нас объекты:
<xsl:template match="udata[total]" mode="filter-list-hotels">
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
              <tr align="center" bgcolor="#E2C4A4">
                <td>Вариант размещения</td>
                <td>Тип-категория</td>
                <td>Метро</td>
                <td>Адрес</td>
                <td>Цена от (руб)</td>
              </tr>
  <xsl:apply-templates select="page" mode="filter-list-hotels" />
  </table>
</xsl:template>
Ну и шаблон
<xsl:template match="page|item" mode="filter-list-hotels">
...
</xsl:template>
я бы оставил в вашей редакции, поскольку в нем вроде как все верно.

вот как то так ))