Шаблон Современный, версия 2.8.5.
Сделал две галереи. В структуре перетащи одну в другую. Как вывести вложенную галерею в таком же виде, как выводятся фото?
Работаю с файлом album.xsl. Выражение <xsl:value-of select="document('udata://photoalbum/albums/no/10000/0/parentId/')/udata/items" />
выводит просто название вложенной галереи. Подскажите плиз, кто делал уже такое.
для начала надо исправить вызов, так как конструкция 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;, а потом фотографии с пагинацией
Огромное спасибо! Буду сидеть весь пример разбирать :)
До первых строчек я уже дотумкал сам, но получалось все время, что при входе во вложенную галерею в ней присутствовал и список галерей тоже, а здесь все четко.
Кстати пока разбирался ЮМИ переписали класс для фотоальбома. Раньше, например, было так: 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"
);
если глянуть в мой код то увидим <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
а вот фото выводятся обычным своим макросом и если у них в шаблоне есть пагинация она должна сработать.
поэтому можно скрин или подробное описание что значит "разваливается"? интересно же)
если вам надо выводить во сколько -то колонок, то попробуйте такой механизм:
при вызове вывода 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. код писал сразу сюда, могут быть мелкие неточности ;)
проверил, была неточность в шаблоне, надо так....
<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 >
Ломаю голову, как сделать главную фотографию альбома ссылкой не на страницу её альбома, где выводятся все фотографии выложенные в ряд, а сразу на сами эти фотографии для просмотра их ряда уже в "лайт-боксе".
То есть у меня на странице объекта выводиться фотоальбом:
<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"/>
Однако что ж делать, если надо подгрузить в лайт-боксе фотографии ?
А как задать вывод определенного количества символов?
Необходимо чтобы не весь текст выводился, а например всего 50 символов и.....
<div umi:element-id="{@id}" umi:field-name="descr">
<xsl:value-of select="//property[@name = 'descr']/value" disable-output-escaping="yes" />
</div>
Подскажите как вывести список фотоальбомов из конкретного раздела?
<xsl:apply-templates select="document('udata://photoalbum/albums/',$pageId)/udata" />
Так выводятся все списки.
А мне надо что входит в раздел pageId - 227
Подскажите как вывести список фотоальбомов из конкретного раздела?
<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" />