UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: niakriss от 15 Октября 2012, 17:57:22

Название: вывод объектов каталога
Отправлено: niakriss от 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>

Ну и т.д. Как можно такое организовать? если можно...
Заранее огромное спасибо.
Название: Re:вывод объектов каталога
Отправлено: PHOENIX-75 от 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>


Писал сразу в ответ, поэтому желательно проверить синтаксис, может где чего забыл закрыть.
Название: Re:вывод объектов каталога
Отправлено: niakriss от 16 Октября 2012, 09:40:46
ну по верстке надо в ul запихивать.. но попробую так.. спрошу.. может прокатит...
Название: Re:вывод объектов каталога
Отправлено: Rodogor от 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>
<!-- / обработка следующих элементов -->
Название: Re:вывод объектов каталога
Отправлено: admin от 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. Решение писалось по памяти, так что возможны неточности
Название: Re:вывод объектов каталога
Отправлено: niakriss от 16 Октября 2012, 16:04:53
Rodogor, кошмарище... мегамозг прям..)))) не могу разобраться чет...

admin, пробовала как у вас.. но получается он в ul  только по одной <li> запихивает... амне надо 3...(
Название: Re:вывод объектов каталога
Отправлено: admin от 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>
Название: Re:вывод объектов каталога
Отправлено: niakriss от 17 Октября 2012, 09:31:07
нет((( теперь 3 <ul> и в нем по 4-6 <li>....((( мне бы наоборот(((
Название: Re:вывод объектов каталога
Отправлено: admin от 17 Октября 2012, 10:37:28
то есть в каждом ul по 3 элемента, а количество ul уже динамический параметр, да?
Название: Re:вывод объектов каталога
Отправлено: Rodogor от 17 Октября 2012, 11:05:29
Rodogor, кошмарище... мегамозг прям..)))) не могу разобраться чет...

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

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

Написала еще в техподдержку.. может они чего умного предложат)