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

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

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
вывод объектов каталога
« : 15 Октября 2012, 17:57:22 »
Здравствуйте. Подскажите в таком вопросе: Мне надо вывести списком объекты каталогов на странице... вывести то я их вывела, только необхеодимо списком по 3 штуки выводить..
т.е.
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>

Ну и т.д. Как можно такое организовать? если можно...
Заранее огромное спасибо.

*

PHOENIX-75

  • *
  • 22
  • +3/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #1 : 16 Октября 2012, 09:34:40 »
А Вам надо именно группировать в несколько <ul>?
Может быть возможно все объекты вывести только в один <ul>, а уже в нем выводить по три объекта в ряд. Если так, то решение может быть примерно такое:

<?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="udata[@module = 'catalog'][@method = 'getObjectsList']" />

<xsl:template match="udata[@module = 'catalog'][@method = 'getObjectsList'][total]">
<ul class="objectList">
    <xsl:apply-templates select=".//lines/item" />
</ul>
      
<xsl:apply-templates select="total" />
      
</xsl:template>


<xsl:template match="udata[@module = 'catalog'  and  @method = 'getObjectsList']//item">
<li>
<!-- Проверяем позицию объекта, и для каждого третьего присваиваем специальный класс. Потом в CSS для него задать отдельный стиль -->
<xsl:if test="position() mod 3 = 0">
<xsl:attribute name="class">item_right</xsl:attribute>
</xsl:if>

<a  href="{@link}" class="linkItem">
    <xsl:value-of select="." />
</a>
<!-- Ну и остальной код который надо отобразить для объекта каталога -->
</li>

<!-- Проверяем позицию объекта, и после каждого третьего вставляем разделительную черту -->
<xsl:if test="position() mod 3 = 0 and position() != last()">
<hr />
</xsl:if>

</xsl:template>

Примерно как-то так.

Можно еще как вариант обойтись и без if в xslt, для этого все проверки через if убираем, и пишем ещё один шаблон ниже специально для каждого третьего item:

<xsl:template match="udata[@module = 'catalog'  and  @method = 'getObjectsList']//item[position() mod 3 = 0]">
    <!-- Здесь код для отображения каждого  третьего объекта каталога -->
</xsl:template>


Писал сразу в ответ, поэтому желательно проверить синтаксис, может где чего забыл закрыть.

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #2 : 16 Октября 2012, 09:40:46 »
ну по верстке надо в ul запихивать.. но попробую так.. спрошу.. может прокатит...

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #3 : 16 Октября 2012, 09:45:19 »
О, я такое делал. :) По коду криво получилось, я тогда только-только hello world освоил.

Берём кратный 3-м элемент. забираем элементы с position равным position()-2  и position-1.
Нужно предусмотреть варианты, если у вас меньше 3-х элементов и если к примеру 5. т.е. кратное 3-м - 3, а 4 и 5 остаются не тронутыми.

Потом я решил что проще брать каждый 3-ий элементы и следующие за ним два, а первые элементы предварительно обработать.
Обработал варианты если всего 1,2,3 элемента. Если 3 и более, то за счёт following-sibling нормально работает

Сейчас я уже понял, что это нужно делать в макросе и заране готовить xml для парсинга. Но тогда я не умел этого делать и решил каким-то диким способом.
Мне нужно было выводить в таблицу модификаций авто... И решил как-то так:

Первые элементы обрабатываю вручную.
Остальные в цикле беру используя following-sibling


<!-- обработка первых элементов -->

<table class="table_news">
<thead>
<tr><td class="first">Модель</td>
<xsl:choose>
<xsl:when test="count(page)=1">
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_last"/>
</xsl:when>
<xsl:when test="count(page)=2">
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 2]" mode="modify_head_last"/>
</xsl:when>
<xsl:when test="count(page)=3">
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 2]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 3]" mode="modify_head_last"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 2]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 3]" mode="modify_head_last"/>
</xsl:otherwise>
</xsl:choose>

</tr>
</thead>
<tbody>
..... тут выводим первые элементы .....
</tbody>
</table>

<!-- / обработка первых элементов -->

<!-- обработка следующих элементов -->
 <xsl:variable name="itemcount" select="count(page)"/>
  
  <xsl:for-each select="page[position() mod 3 = 0]">

<xsl:variable name="colsibling" select="count(following-sibling::page[position() &lt;= 3])"/>

<xsl:if test="count(following-sibling::page[position() &lt;= 3]) &gt; 0">


<table class="table_news">
<thead>
<tr><td class="first">Модель</td>

<xsl:apply-templates select="following-sibling::page[position() &lt;= 3]" mode="modify_head"/>

</tr>
</thead>
<tbody>
...... выводим элементы ........
</tbody>
</table>


</xsl:if>

  </xsl:for-each>
<!-- / обработка следующих элементов -->
« Последнее редактирование: 16 Октября 2012, 09:48:44 от Rodogor »

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #4 : 16 Октября 2012, 11:54:59 »
еще одна вариация последнего решения.

<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" />

<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList' and //item]">
<div class="objectList">
<xsl:apply-templates select="//item[position() mod 3 =1]" mode="col"/>
<xsl:apply-templates select="//item[position() mod 3 =2]" mode="col"/>
<xsl:apply-templates select="//item[position() mod 3 =0]" mode="col"/>
</div>
 
<xsl:apply-templates select="total" />
</xsl:template>


<xsl:template match="//item" mode="col">
<ul class="col_one">
<xsl:apply-templates select="." mode="col_item"/>
</ul>
</xsl:template>

<xsl:template match="//item" mode="col_item">
<li>
<a  href="{@link}" class="linkItem">
<xsl:value-of select="." />
</a>
...
</li>
</xsl:template>

P.S. Решение писалось по памяти, так что возможны неточности

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #5 : 16 Октября 2012, 16:04:53 »
Rodogor, кошмарище... мегамозг прям..)))) не могу разобраться чет...

admin, пробовала как у вас.. но получается он в ul  только по одной <li> запихивает... амне надо 3...(

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #6 : 16 Октября 2012, 16:51:30 »
возможно я немного не верно написал, попробуйте так

<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" />

<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList' and //item]">
<div class="objectList">
<ul class="col_one">
<xsl:apply-templates select="//item[position() mod 3 =1]" mode="col_item"/>
</ul>
<ul class="col_one">
<xsl:apply-templates select="//item[position() mod 3 =2]" mode="col_item"/>
</ul>
<ul class="col_one">
<xsl:apply-templates select="//item[position() mod 3 =0]" mode="col_item"/>
</ul>
</div>
 
<xsl:apply-templates select="total" />
</xsl:template>

<xsl:template match="//item" mode="col_item">
<li>
<a  href="{@link}" class="linkItem">
<xsl:value-of select="." />
</a>
...
</li>
</xsl:template>

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #7 : 17 Октября 2012, 09:31:07 »
нет((( теперь 3 <ul> и в нем по 4-6 <li>....((( мне бы наоборот(((

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #8 : 17 Октября 2012, 10:37:28 »
то есть в каждом ul по 3 элемента, а количество ul уже динамический параметр, да?

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #9 : 17 Октября 2012, 11:05:29 »
Rodogor, кошмарище... мегамозг прям..)))) не могу разобраться чет...

admin, пробовала как у вас.. но получается он в ul  только по одной <li> запихивает... амне надо 3...(
Да всё просто.....
Алгоритм такой - в цикле пробегаем по элементам, берём каждый 3-ий. Забираем 2 следующих за ним.
Один минус - если элементов 3 или меньше 3-х, то нужно забирать первые два перед циклом. 3-ий заберётся уже в цикле.
Вроде не так всё страшно. ;D

*

niakriss

  • ***
  • 190
  • +2/-0
    • Просмотр профиля
Re:вывод объектов каталога
« Ответ #10 : 17 Октября 2012, 11:07:13 »
да... именно так... но ul тоже только 3 на страницу вмещается.. дальше идет пейджинг... но это не главное... главное чтобы <li> только 3 было)

Rodogor, может и так.. я просто новичок в этом деле))) щас вот с формами разберусь и вернусь к вопросу о выводе объектов)

Написала еще в техподдержку.. может они чего умного предложат)
« Последнее редактирование: 17 Октября 2012, 11:09:29 от niakriss »