UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: Axiomateria от 14 Октября 2014, 15:50:33

Название: Пагинация в объекте каталога
Отправлено: Axiomateria от 14 Октября 2014, 15:50:33
Здравствуйте!
Возможно ли без кастомных решений реализовать макрос, позволяющий в объекте каталога object-view,xsl (demodizzy) вывести пагинацию по типу "Предыдущий / Следующий товар" ?
Тот же вопрос можно и к новостям отнести, как что-то вроде "Читать следующую новость"
Название: Re:Пагинация в объекте каталога
Отправлено: admin от 15 Октября 2014, 23:47:43
есть 2 макроса для этих целей %system getPrevious()% (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_getprevious/) и %system getNext()% (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_getnext/)
Название: Re:Пагинация в объекте каталога
Отправлено: Axiomateria от 25 Октября 2014, 15:17:06
Я нашёл в файле photo.xsl (../xslt/modules/photoalbum/) такой вот вызов:
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',page/@parentId,'//1000'))/udata/items/item[@id = $document-page-id]" mode="slider" />
обрабатываемый так:
   
<xsl:template match="item" mode="slider">
        <xsl:apply-templates select="preceding-sibling::item[1]" mode="slider_back" />
        <xsl:apply-templates select="following-sibling::item[1]" mode="slider_next" />
    </xsl:template>
    <xsl:template match="item" mode="slider_back">
        <a href="{@link}" title="&previous-page;" class="back" />
    </xsl:template>
    <xsl:template match="item" mode="slider_next">
        <a href="{@link}" title="&next-page;" class="next" />
    </xsl:template>

А если как-то переделать вызов с <xsl:apply-templates select="document(concat('udata://photoalbum/album/',page/@parentId,'//1000'))/udata/items/item[@id = $document-page-id]" mode="slider" />
на, допустим, такой:
 <xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/',page/@parentId,'//1000'))/udata/items/item[@id = $document-page-id]" mode="slider" />,
то обработку вызова тоже как-то надо переделывать ?
Название: Re:Пагинация в объекте каталога
Отправлено: admin от 07 Ноября 2014, 20:52:35
тот пример, который вы привели, работае по принципу,

1. вызвать макрос который вернет список всех объектов (в вашем примере выводится фотографии фотоальбома с парамтером per_page = 1000)
2. в получившемся xml документе найти id текущей страницы
3. взять предыдущий и последующий элемент и вывести на них ссылку

Безусловно этот способ может иметь право на существование, но далеко не во всех ситуациях (вернее редко когда) оправданно его использование.

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

В противовес этому, есть 2 макроса ( %system getPrevious()% и %system getNext()%), которые делают все тоже самое, но экономичней к ресурсам системы. И возвращают однозначный простой xml, который остается только вывести.


P.S. Если по каким-то причинам в вашей ситуации все же удобнее использовать вариант приведенный вами выше, то для вызова макроса getObjectsList не забудьте про параметр per_page, он должен наверняка покрывать все товары в разделе. Например так
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList//',page/@parentId,'/1000'))/udata/lines/item[@id = $document-page-id]" mode="slider" />

Остальные шаблоны можно оставить такими же.
Название: Re:Пагинация в объекте каталога
Отправлено: Axiomateria от 09 Ноября 2014, 13:11:12
В противовес этому, есть 2 макроса ( %system getPrevious()% и %system getNext()%), которые делают все тоже самое, но экономичней к ресурсам системы. И возвращают однозначный простой xml, который остается только вывести.

Вот я смотрю в инструкцию про макрос %system getNext()% и вижу, что пример его вызова udata://system/getNext/48/notemplate/price/0
таков, что надо изначально знать ID следующего объекта...
Однако не понятно, как сообщить в данном случае системе этот ID каждого объекта динамически, ведь это ж не ID типа данных всё-таки ?

Попробовал так: <xsl:apply-templates select="document(concat('udata://system/getNext/', page/@id))" />

и в результате выводится строчка 54130 /snoubord/burton/snoubord_burton_blunt_13-14/, где 54130 это и есть ID объекта, а /snoubord/burton/snoubord_burton_blunt_13-14/ URL на сам объект.
То есть не получилось строку выдать с ID и URL на следующий объект... Получилось так, что это строка URL выдаёт данные для ссылки на текущий открытый объект, а не следующий...

что я не доделал ?
Название: Re:Пагинация в объекте каталога
Отправлено: Axiomateria от 09 Ноября 2014, 13:26:03
В итоге так доделал вызов следующего объекта (по аналогии там уж и предыдущий так же):
<xsl:apply-templates select="document(concat('udata://system/getPrevious//notemplate/price/0', page/@id))/udata/link" mode="lister" />
а обработал его:
    <xsl:template match="link" mode="lister">
        <a href="{.}">Следующий</a>
    </xsl:template>
Название: Re:Пагинация в объекте каталога
Отправлено: admin от 09 Ноября 2014, 14:27:54
Вот я смотрю в инструкцию про макрос %system getNext()% и вижу, что пример его вызова udata://system/getNext/48/notemplate/price/0
таков, что надо изначально знать ID следующего объекта...

Еще раз внимательно посмотрите документацию
Цитировать
Id или путь страницы, относительно которой берется следующая.
То есть вы указываете текущую страницу, а вам возвращается xml с информацией о следующей или предыдущей страницы (в зависимости от того, какой макрос вы используете)

Вижу, в последнем сообщении вы уже сделали правильный разбор xml ответа данного макроса и работаете с узлом link.

Теперь ваш вопрос решен?
Название: Re:Пагинация в объекте каталога
Отправлено: Axiomateria от 09 Ноября 2014, 17:39:10
Вижу, в последнем сообщении вы уже сделали правильный разбор xml ответа данного макроса и работаете с узлом link.
Теперь ваш вопрос решен?

В моём случае вопрос успешно решён для объектов, страницы которых описывают подробную информацию этих объектов, или иначе говоря,
в карточках товаров есть переход от одного к другому по очереди в обычном виде.

Но есть ещё вопрос про тоже самое, но только для  раздела каталога, где все объекты представлены в виде превью и эти превью которые у меня при нажатии на картинку открывает в всплывающем окне подробную карточку товара (про этот случай тема   открыта здесь: http://umihelp.ru/forum/index.php/topic,1913.msg8420.html#msg8420 )
с теми же ссылками на "Предыдущий/Следующий".  Ссылки, правда, в сплывающем окне ведёт куда и должны вести, то есть на предыдущий или следующий объект, вот только они не в сплывающем окне его открывают, а просто как обычно открывается объект... А надо сделать так что бы в модальном окне был такой же листинг объектов, как и в обычном виде.


Название: Re:Пагинация в объекте каталога
Отправлено: admin от 10 Ноября 2014, 01:19:24
вам надо сделать так, чтобы при нажатии на ссылку во всплывающем окне (последующий и предыдущий) ajax получал html для следующего\предыдущего товара для всплывающего окна и отображал его
Название: Re:Пагинация в объекте каталога
Отправлено: Axiomateria от 10 Ноября 2014, 09:46:41
вам надо сделать так, чтобы при нажатии на ссылку во всплывающем окне (последующий и предыдущий) ajax получал html для следующего\предыдущего товара для всплывающего окна и отображал его

Наверное это уже тема про JS, так как скорее всего надо в тег <a> надо вставить класс как на подобии вставки классов из набора "Fancybox" 
    <xsl:template match="link" mode="lister">
        <a class="fancybox" rel="media-gallery" href="{.}">Следующий</a>
    </xsl:template>

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

В рабочем варианте это пока вот так: http://tct-st.ru.fstest.ru/catalog/torgovoe_oborudovanie.html
где в сплывающем окне объекта каталога есть ссылки Вперёд/Назад, которые ведут на html страницы, но в чистом виде, то есть в модальном варианте они не открываются...