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

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

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Шаблон Современный, версия 2.8.5.
Сделал две галереи. В структуре перетащи одну в другую. Как вывести вложенную галерею в таком же виде, как выводятся фото?

Работаю с файлом album.xsl. Выражение
        <xsl:value-of select="document('udata://photoalbum/albums/no/10000/0/parentId/')/udata/items" />	
выводит просто название вложенной галереи. Подскажите плиз, кто делал уже такое.

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
для начала надо исправить вызов, так как конструкция xsl:value-of выводит только содержимое узлов, а вы при выводе дочерних альбомов явно хотите и картинку вывести , и название, и ссылку на альбом.

для этого, в файле /xsltTpls/modules/photoalbum/album.xsl

вместо строчек
<xsl:template match="result[@module = 'photoalbum'][@method = 'album']">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',$document-page-id))/udata" />
</xsl:template>

вставляем
<xsl:template match="result[@module = 'photoalbum'][@method = 'album']">
<xsl:apply-templates select="document(concat('udata://photoalbum/albums//20000/1/',$document-page-id))/udata" />
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',$document-page-id))/udata" />
</xsl:template>

<!--album templetes-->
<xsl:template match="udata[@module = 'photoalbum' and @method = 'albums']" />

<xsl:template match="udata[@module = 'photoalbum' and @method = 'albums' and total]">
<div id="photoalbums">
<div class="descr" umi:element-id="{id}" umi:field-name="descr">
<xsl:value-of select="document(concat('upage://',id,'.descr'))/udata/property/value" disable-output-escaping="yes" />
</div>
<xsl:apply-templates select="items/item" mode="album_list" />
<div class="clear" />
</div>
<xsl:apply-templates select="total" />
</xsl:template>

<xsl:template match="item" mode="album_list">
<xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="album_list" />
</xsl:template>

<xsl:template match="page" mode="album_list">
<div class="gray_block">
<a href="{@link}" umi:element-id="{@id}" umi:field-name="photo">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',@id,'//1/1'))/udata" mode="album_first_photo"/>
</a>
<div class="descr">
<h3>
<a href="{@link}" umi:element-id="{@id}" umi:field-name="h1">
<xsl:value-of select="//property[@name = 'h1']/value" />
</a>
</h3>
<div umi:element-id="{@id}" umi:field-name="descr">
<xsl:value-of select="//property[@name = 'descr']/value" disable-output-escaping="yes" />
</div>
</div>
<div class="clear" />
</div>
</xsl:template>

<!--album first photo-->
<xsl:template match="udata[@module = 'photoalbum'][@method = 'album']" mode="album_first_photo">
<img src="&empty-photo;" />
</xsl:template>

<xsl:template match="udata[@module = 'photoalbum'][@method = 'album'][total]" mode="album_first_photo">
<xsl:apply-templates select="items/item" mode="album_first_photo" />
</xsl:template>

<xsl:template match="item" mode="album_first_photo">
<xsl:call-template name="catalog-thumbnail">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="empty">&empty-photo;</xsl:with-param>
<xsl:with-param name="width">154</xsl:with-param>
<xsl:with-param name="height">110</xsl:with-param>
</xsl:call-template>
</xsl:template>

<!--/album first photo-->
<!--/album templetes-->

при этом у нас выводяться вначале все фотоальбомы дочерние к данному разделу, с картинкой являющейся первой фотографией данного фотоальбома или картинкой заглушкой взятой из сущности &empty-photo;, а потом фотографии с пагинацией

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Огромное спасибо! Буду сидеть весь пример разбирать :)
До первых строчек я уже дотумкал сам, но получалось все время, что при входе во вложенную галерею в ней присутствовал и список галерей тоже, а здесь все четко.
Кстати пока разбирался ЮМИ переписали класс для фотоальбома. Раньше, например, было так:
public function albums($template = "default", $limit = false, $ignore_paging = false, $parentElementId = false) {
list($template_block, $template_block_empty, $template_line) = def_module::loadTemplates("tpls/photoalbum/{$template}.tpl", "albums_list_block", "albums_list_block_empty", "albums_list_block_line");
, а теперь эдак:
public function albums($template = "default", $limit = false, $ignore_paging = false, $parentElementId = false, $order = 'asc') {
list(
$template_block, $template_block_empty, $template_line
) = def_module::loadTemplates("photoalbum/".$template,
"albums_list_block", "albums_list_block_empty", "albums_list_block_line"
);

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
добавил видео с подробным описанием процесса http://umihelp.ru/articles/xslt-template-photoalbum-albums/

*

wolfman

  • *
  • 23
  • +0/-0
    • Просмотр профиля
Сделал все по вашему коду - работает отлично.

НО, когда в альбоме фото больше 10 (в админке указано, что на 1 странице показывать 10 фото) - шаблон начинает разваливаться.

Видимо это происходит из за отсутствия переключателя страниц, можете подсказать пожалуйста как это исправить?

Заранее благодарю.

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
если глянуть в мой код то увидим
<xsl:template match="result[@module = 'photoalbum'][@method = 'album']">
        <xsl:apply-templates select="document(concat('udata://photoalbum/albums//20000/1/',$document-page-id))/udata" />
        <xsl:apply-templates select="document(concat('udata://photoalbum/album/',$document-page-id))/udata" />
    </xsl:template>

отсюда видно, что альбомы выводятся без пагинации, так как мы задали per_page параметр макросу %photoalbum albums()% в размере 20000

а вот фото выводятся обычным своим макросом и если у них в шаблоне есть пагинация она должна сработать.

поэтому можно скрин или подробное описание что значит "разваливается"? интересно же)

*

wolfman

  • *
  • 23
  • +0/-0
    • Просмотр профиля
Да я видел у вас это число 20000 и понял что это для альбомов - это мне в принципе так и нужно.
А вот с альбомами нужно чтобы была пагинация.
У меня стандартный шаблон юми в папке library/numpages.xsl но с ним явно что-то не то.

Шаблон разваливается очень интересно. По сути он не разваливается, а дублируется весь шаблон сайта в контенте т.е. там где должен выводиться контент (текст или фото) - выводиться весь шаблон снова, внутри которого контент обычно уже не отображается. Выглядит ужасно :))
« Последнее редактирование: 31 Мая 2012, 09:20:47 от wolfman »

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
и так происходит не только на страниц фотогалерей?

*

wolfman

  • *
  • 23
  • +0/-0
    • Просмотр профиля
нет только на странице выбранного альбома.
а если прописываю 20000 и в макрос album - шаблон отображается как надо.

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
это что-то что редактировался вами... что именно сказать сложно, надо смотреть)) но видимо у вас где-то идет вызов генерального шаблона рекурсивно. Сейчас попробовал на свежем локалпаке свою правку, закинул пару дочерних фотоальбомов и сделал 7 фоток, поставил в настройках модуля "фотогалереи" выводить по 3 элемента на странице, все работает, в том числе и пагинация фотографий из фотоальбома который являлся текущей страницей

*

Старник

  • *
  • 14
  • +3/-0
    • Просмотр профиля
Всем доброго времени.
Представленный уважаемым админом шаблон прекрасно работает, но хочется организовать вывод альбомов в 2 или N число колонок...
http://umihelp.ru/articles/xslt-template-photoalbum-albums/
Поэтому прошу помощи в данном вопросе. т.к. еще не оч хорошо разбираюсь в XSLT.
Предполагалось использование примерно такой конструкции для вывода
            <table>
            <xsl:apply-templates select="items/item" mode="album_list" />
            </table>
            <div class="clear" />
            </div>
            <xsl:apply-templates select="total" />
            </xsl:template>
           
    <xsl:template match="item" mode="album_list">
               <xsl:variable name="i" select="position()"/>
               <xsl:if test="$i mod 3 = 1">
           <tr class="{$i}">
           <td> <xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="album_list" /> </td>
       
           <td> <xsl:apply-templates select="document(concat('upage://',@id))/udata/page[$i+1]" mode="album_list" /> </td>
       
           <td> <xsl:apply-templates select="document(concat('upage://',@id))/udata/page[$i+2]" mode="album_list" /> </td>
        </tr>
           </xsl:if>
    </xsl:template>  
только пока не получается. подскажите где я ошибаюсь
« Последнее редактирование: 17 Марта 2013, 19:21:58 от Старник »

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
если вам надо выводить во сколько -то колонок, то попробуйте такой механизм:

при вызове вывода item выводим тольок каждый position() mod n = 1, то есть если у вас 3 колонки, то каждый 1,4,7 и т.д.

делается это таким выводом
<xsl:apply-templates select="items/item[position() mod 3 = 1]" mode="album_list" />

а шаблон пишем так:
<xsl:template match="item" mode="album_list">
<xsl:variable name="pos2" select="position() +1" />
<xsl:variable name="pos3" select="position() +2" />

вывод первого item: <xsl:value-of select="text()" />
вывод второго item: <xsl:value-of select="//item[position()=$pos2]/text()" />
вывод третьего item: <xsl:value-of select="//item[position()=$pos3]/text()" />
</xsl:template >

p.s. код писал сразу сюда, могут быть мелкие неточности  ;)
« Последнее редактирование: 18 Марта 2013, 01:36:27 от admin »

*

Старник

  • *
  • 14
  • +3/-0
    • Просмотр профиля
Уважаемый  admin ваша конструкция выводит первые три элемента правильно, а вот потом начинает мудрить выходит примерно следующе
1-2-3
2-4-5
плюс выводится в текстовом виде, а как вывести превьюшки я не разобрался.

Но подумав я решил для себя данную проблему посредством CSS
Так как у меня ширина страницы фиксированная я просто засунул вызов в div  и прописал классы. Если комуто будет полезно вот код

<div id="col1"> <xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="album_list" /> </div>

и с стили добавляем

#col1, #col2  { /* 1 */
    font-family: Verdana, Arial, sans-serif; /* Рубленый шрифт */
    font-weight: bold; /* Жирное начертание текста заголовка */
    font-size: 80%; /* Размер шрифта */
    color: white; /* Цвет текста заголовка */
    width: 190px; /* Ширина колонок */
    padding: 5px; /* Поля вокруг текста */
   /* border: 1px solid black; /* Рамка вокруг слоя */
    margin-left: 5px; /* Отступ слева */
    margin-top: 2px; /* Отступ сверху */
    float: left; /* Состыковка колонок по горизонтали */
   }
  
#col1  { /* 2 */
    font-family: "Times New Roman", Times, serif; /* Шрифт с засечками */
    font-size: 100%; /* Размер шрифта */
    font-weight: normal; /* Нормальное начертание */
    color: black; /* Цвет текста */
   }

   /* Цвет фона каждого слоя */
  
#col1 {  }
« Последнее редактирование: 03 Апреля 2013, 01:14:34 от Старник »

*

admin

  • *****
  • 2416
  • +171/-1
    • Просмотр профиля
проверил, была неточность в шаблоне, надо так....

<xsl:apply-templates select="items/item" mode="album_list" />

шаблоны:
<xsl:template match="item" mode="album_list" />
<xsl:template match="item[position() mod 3 = 1]" mode="album_list">
<xsl:variable name="pos2" select="position() +1" />
<xsl:variable name="pos3" select="position() +2" />

вывод <xsl:value-of select="position()" /> item: <xsl:value-of select="@id" />
<xsl:if test="//item[position()=$pos2]/@id">
вывод <xsl:value-of select="$pos2" /> item: <xsl:value-of select="//item[position()=$pos2]/@id" />
</xsl:if>
<xsl:if test="//item[position()=$pos3]/@id">
вывод <xsl:value-of select="$pos3" /> item: <xsl:value-of select="//item[position()=$pos3]/@id" />
</xsl:if>
<hr/>
</xsl:template >


*

Старник

  • *
  • 14
  • +3/-0
    • Просмотр профиля
Еще один вопрос. Посоветуйте как можно сделать:
Есть фото галереи с двойным или тройным уровнем вложения. По шаблону получается, что если в следующем уровне нет ни одной фотографии, а присутствуют только альбомы, то вместо превьюшки всегда видим заставку "нет фото". Можно ли сделать что бы там появлялась рандомная фотка из второго или третьего уровня вложения?