UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: sergeron от 20 Апреля 2012, 18:03:26

Название: Вывод списка вложенных галерей по типу альбома с фото
Отправлено: sergeron от 20 Апреля 2012, 18:03:26
Шаблон Современный, версия 2.8.5.
Сделал две галереи. В структуре перетащи одну в другую. Как вывести вложенную галерею в таком же виде, как выводятся фото?

Работаю с файлом album.xsl. Выражение
        <xsl:value-of select="document('udata://photoalbum/albums/no/10000/0/parentId/')/udata/items" />	
выводит просто название вложенной галереи. Подскажите плиз, кто делал уже такое.
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 22 Апреля 2012, 13:57:12
для начала надо исправить вызов, так как конструкция 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;, а потом фотографии с пагинацией
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: sergeron от 22 Апреля 2012, 23:37:11
Огромное спасибо! Буду сидеть весь пример разбирать :)
До первых строчек я уже дотумкал сам, но получалось все время, что при входе во вложенную галерею в ней присутствовал и список галерей тоже, а здесь все четко.
Кстати пока разбирался ЮМИ переписали класс для фотоальбома. Раньше, например, было так:
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"
);
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 23 Апреля 2012, 08:17:52
добавил видео с подробным описанием процесса http://umihelp.ru/articles/xslt-template-photoalbum-albums/
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: wolfman от 30 Мая 2012, 09:34:07
Сделал все по вашему коду - работает отлично.

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

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

Заранее благодарю.
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 31 Мая 2012, 08:49:30
если глянуть в мой код то увидим
<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

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

поэтому можно скрин или подробное описание что значит "разваливается"? интересно же)
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: wolfman от 31 Мая 2012, 09:10:36
Да я видел у вас это число 20000 и понял что это для альбомов - это мне в принципе так и нужно.
А вот с альбомами нужно чтобы была пагинация.
У меня стандартный шаблон юми в папке library/numpages.xsl но с ним явно что-то не то.

Шаблон разваливается очень интересно. По сути он не разваливается, а дублируется весь шаблон сайта в контенте т.е. там где должен выводиться контент (текст или фото) - выводиться весь шаблон снова, внутри которого контент обычно уже не отображается. Выглядит ужасно :))
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 31 Мая 2012, 09:34:16
и так происходит не только на страниц фотогалерей?
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: wolfman от 31 Мая 2012, 09:56:49
нет только на странице выбранного альбома.
а если прописываю 20000 и в макрос album - шаблон отображается как надо.
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 31 Мая 2012, 12:18:52
это что-то что редактировался вами... что именно сказать сложно, надо смотреть)) но видимо у вас где-то идет вызов генерального шаблона рекурсивно. Сейчас попробовал на свежем локалпаке свою правку, закинул пару дочерних фотоальбомов и сделал 7 фоток, поставил в настройках модуля "фотогалереи" выводить по 3 элемента на странице, все работает, в том числе и пагинация фотографий из фотоальбома который являлся текущей страницей
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: Старник от 17 Марта 2013, 14:42:25
Всем доброго времени.
Представленный уважаемым админом шаблон прекрасно работает, но хочется организовать вывод альбомов в 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>  
только пока не получается. подскажите где я ошибаюсь
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 18 Марта 2013, 01:32:30
если вам надо выводить во сколько -то колонок, то попробуйте такой механизм:

при вызове вывода 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. код писал сразу сюда, могут быть мелкие неточности  ;)
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: Старник от 03 Апреля 2013, 01:12:35
Уважаемый  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 {  }
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 04 Апреля 2013, 08:26:46
проверил, была неточность в шаблоне, надо так....

<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 >

Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: Старник от 11 Апреля 2013, 00:44:23
Еще один вопрос. Посоветуйте как можно сделать:
Есть фото галереи с двойным или тройным уровнем вложения. По шаблону получается, что если в следующем уровне нет ни одной фотографии, а присутствуют только альбомы, то вместо превьюшки всегда видим заставку "нет фото". Можно ли сделать что бы там появлялась рандомная фотка из второго или третьего уровня вложения?
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 11 Апреля 2013, 11:16:42
можно. Например можно сделать usel выборку для получения фотографии в неограчиненным уровнем вложенности
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: Axiomateria от 19 Января 2014, 13:56:39
Ломаю голову, как сделать главную фотографию альбома ссылкой не на страницу её альбома, где выводятся все фотографии выложенные в ряд, а сразу на сами эти фотографии для просмотра их ряда уже в "лайт-боксе".

То есть у меня на странице объекта выводиться фотоальбом:
<xsl:apply-templates select="document(concat('udata://photoalbum/albums/', //property[@name = 'album_design_layouts']/value/page/@id,'/void/1000'))/udata" mode="album_list"/> 
в виде одной фотографии (верхнее фото в списке этого фотоальбома)

Обрабатывается этот фотоальбом вот так:
    <xsl:template match="result[@module = 'photoalbum' and @method = 'album' and page/@type-id=152]">
        <xsl:apply-templates select="document(concat('udata://photoalbum/albums/',$document-page-id))/udata" mode="album_list" />
    </xsl:template>
   
    <xsl:template match="udata[@module = 'photoalbum' and @method = 'albums']" mode="album_list" />
 
    <xsl:template match="udata[@module = 'photoalbum' and @method = 'albums' and total]" mode="album_list">
        <div class="photoalbums">           
            <xsl:value-of select="document(concat('upage://',@id,'.snippet_album'))/udata/property/value" disable-output-escaping="yes" />                          
            <xsl:apply-templates select="items/item" mode="album_list" />     
        </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">
            <xsl:apply-templates select="document(concat('udata://photoalbum/album/',@id,'//1/1'))/udata" mode="album_first_photo"/>   
            <a href="{@link}">
                <xsl:value-of select="//property[@name = 'h1']/value" />
            </a>       
    </xsl:template>

    <xsl:template match="udata[@module = 'photoalbum' and @method = 'album']" mode="album_first_photo">
        <img src="&empty-photo;" alt="{$altimg}" />
    </xsl:template>
 
    <xsl:template match="udata[@module = 'photoalbum' and @method = 'album' and 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:variable name="src" select="document(concat('upage://',@id,'.photo'))/udata//value" />     
        <a href="{$src}" class="fancybox-thumbs" rel="media-gallery" title="{.//property[@name='title']/value}">
            <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">450</xsl:with-param>
                <xsl:with-param name="height">450</xsl:with-param>
            </xsl:call-template>
        </a>
    </xsl:template>
- где при нажатии на эту одну фотографию в лайт-боксе она одна и загружается...
Видимо причина её одинокой загрузки - это указанные единички в:
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',@id,'//1/1'))/udata" mode="album_first_photo"/>

Однако что ж делать, если надо подгрузить в лайт-боксе фотографии ?
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: Axiomateria от 19 Января 2014, 14:26:18
Наверное будет проще просто в объекте каталога сделать поле для загрузки одной фотографии как бы "главной" фотоальбома, на который и подвесить уже ссылку на ярд его фотографий
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 19 Января 2014, 14:36:13
Вопрос не в этом. Вы  написали шаблоны, которые выведут список фотоальбомов. Каждый фотоальбом выведет свою обложку. В данный момент, вы выводите первую фотку из альбома. Можно сделать и спец поле в самом фотоальбоме для обложки и выводить его, но это не влияет на вашу проблему лайтбокса, который бы прокручивал все фотки фотоальбома.

Для того, чтобы он начал отображать все фотки, которые есть в вашем фотоальбоме, вам необходимо указать fancybox'у список фотографий.

Обычно это делается выводом в html список этих фоток, внутри ссылок со спец классом (у вас сейчас в таком виде выводиться только первая фотка). Можно подгрузить остальные фото фотоальбома в скрытом блоке и указать на него js'е, но это не верно, так как лишняя нагрузка при формировании html. Лучше подгрузить остальные фото в виде js кода, который сформирует список фотографий, которые будет отображать fancybox. Пример есть на самом сайте fancybox ( Method two - Open fancyBox manually (http://fancyapps.com/fancybox/#instructions)) или вот, прямая ссылка на пример (http://jsfiddle.net/wg4MD/)
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: john от 07 Февраля 2014, 22:34:16
А как задать вывод определенного количества символов?
Необходимо чтобы не весь текст выводился, а например всего 50 символов и.....
<div umi:element-id="{@id}" umi:field-name="descr">
                    <xsl:value-of select="//property[@name = 'descr']/value" disable-output-escaping="yes" />
                </div>
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 07 Февраля 2014, 23:12:23
посмотрите тут http://umihelp.ru/forum/index.php/topic,1332.msg6002.html#msg6002
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: savinov80 от 28 Февраля 2014, 10:21:40
Посмотрел ваш урок и попытался прикрутить это к своему сайту (у меня шаблон demohunt), но не заработало, возможно проблема в выводе?
Мои действия: Я создал файл album.xsl и подключил его к шаблону.
Прошу помочь, что я сделал не так?
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: NOIRMAN от 06 Марта 2014, 00:23:32
Для полноты картины хотелось бы узнать что не получилось, какую ошибку выдала система и что Вы вообще сделали (ну это уже на уровне кода) ... Иначе ответа можно долго ждать  ::)
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: john от 10 Июля 2014, 22:42:08
Подскажите как вывести список фотоальбомов из конкретного раздела?
<xsl:apply-templates select="document('udata://photoalbum/albums/',$pageId)/udata" />
Так выводятся все списки.
А мне надо что входит в раздел pageId - 227
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: NOIRMAN от 14 Июля 2014, 16:52:33
Подозреваю, что вызов происходит вне зоны видимости переменной pageId или она не объявлена ранее.
Название: Re:Вывод списка вложенных галерей по типу альбома с фото
Отправлено: admin от 14 Июля 2014, 17:06:30
Подскажите как вывести список фотоальбомов из конкретного раздела?
<xsl:apply-templates select="document('udata://photoalbum/albums/',$pageId)/udata" />
Так выводятся все списки.
А мне надо что входит в раздел pageId - 227

если вы хотите в document() вставить строчку сформированную из параметров\переменных\строк, то вам следует использовать concat()

<xsl:apply-templates select="document(concat('udata://photoalbum/albums/',$pageId))/udata" />