UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: kinki от 26 Ноября 2013, 18:44:36

Название: Parents name
Отправлено: kinki от 26 Ноября 2013, 18:44:36
Всем привет!
В шаблоне есть три parents. Как вытащить name последнего то есть <name>Москва</name>?

<parents>

<page id="8" parentId="0" link="/partners/" is-visible="1" is-active="1" object-id="337" type-id="120" update-time="1375103098" alt-name="partners" xlink:href="upage://8">
<basetype id="27" module="content">Страницы контента</basetype>
<name>Партнерам</name>
</page>

<page id="453" parentId="8" link="/partners/our_agents/" is-visible="1" is-active="1" object-id="916" type-id="52" type-guid="content-page" update-time="1383815583" alt-name="our_agents" xlink:href="upage://453">
<basetype id="27" module="content">Страницы контента</basetype>
<name>Наши представители</name>
</page>

<page id="454" parentId="453" link="/partners/our_agents/moskva/" is-visible="1" is-active="1" object-id="917" type-id="142" update-time="1383815857" alt-name="moskva" xlink:href="upage://454">
<basetype id="27" module="content">Страницы контента</basetype>
<name>Москва</name></page>

</parents>
Название: Re:Parents name
Отправлено: e.ioffe от 26 Ноября 2013, 23:04:35
parents/page[last()]/name
Название: Re:Parents name
Отправлено: kinki от 28 Ноября 2013, 12:25:26
спасибо
Название: Re:Parents name
Отправлено: Axiomateria от 15 Апреля 2015, 15:24:11
Здравствуйте!
Подскажите, пожалуйста, а как мне вытащить значение атрибута type-id="178" из page страницы, которая не в секции <parents>
?

Пытаюсь получить значение "178" простым вызовом
<xsl:value-of  select="/result//page/@type-id" />
но пока удаётся получить не нужный в данном случае type-id="145", то есть первой страницы в секции <parents>, когда как нужен type-id="178" из элемента page, который вне секции <parents>.
<parents>
<page id="304" parentId="0" link="/market/" is-visible="1" is-active="1" object-id="1003" type-id="145" update-time="1423857971" alt-name="market" xlink:href="upage://304">
<basetype id="55" module="catalog" method="category">Разделы каталога</basetype>
<name>Каталог</name>
</page>
<page id="335" parentId="304" link="/market/otoplenie/" is-visible="1" is-active="1" object-id="1084" type-id="145" update-time="1421623680" alt-name="otoplenie" xlink:href="upage://335">
<basetype id="55" module="catalog" method="category">Разделы каталога</basetype>
<name>Отопление</name>
</page>
<page id="379" parentId="335" link="/market/otoplenie/teplye_poly/" is-visible="1" is-active="1" object-id="1777" type-id="145" update-time="1428500035" alt-name="teplye_poly" xlink:href="upage://379">
<basetype id="55" module="catalog" method="category">Разделы каталога</basetype>
<name>Теплые полы</name>
</page>
</parents>
<page id="380" parentId="379" link="/market/otoplenie/teplye_poly/sam_tyoplyj_pol/" is-active="1" object-id="1778" type-id="178" update-time="1429091699" alt-name="sam_tyoplyj_pol">
...
</page>
Название: Re:Parents name
Отправлено: admin от 20 Апреля 2015, 10:57:31
просто укажите его явно, без //

result/page/@type-id
Название: Re: Parents name
Отправлено: Axiomateria от 21 Апреля 2015, 11:43:04
просто укажите его явно, без //
result/page/@type-id
Спасибо, так и сделал.

А теперь история в развёрнутом виде:

На самом деле просто была нужна переменная для подставления значения атрибута @type-id = 178 в вызов
<xsl:apply-templates select="document(concat('udata://catalog/search////', 178))" mode="search_filter"/>
с целью вывести в разных разделах и подразделах каталога форму поиска по фильтрам с привязкой к определённому типу данных по его type-id, как в данном случае  = 178.
 
То есть переменная в итоге получается такая:
<xsl:variable name="own-filter" select="/result[@module = 'catalog' and @method = 'object']/page/@type-id" />
и если её подставлять в шаблоне
    <xsl:template match="udata[@method = 'getObjectsList'][total]" mode="layout_2">
        <xsl:apply-templates select="document(concat('udata://catalog/search////', $own-filter))" mode="search_filter"/>
        <xsl:call-template name="sorting"/>
        <div umi:element-id="{category_id}" umi:module="catalog" umi:method="getObjectsList" umi:sortable="sortable">
            <xsl:apply-templates select="lines/item" mode="short_view_list">
                <xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
            </xsl:apply-templates>
        </div>
        <xsl:apply-templates select="total" />
    </xsl:template>
то в конечных подразделах каталога в которых есть товары (как "Канальные вентиляторы" и "Радиальные вентиляторы") фильтр выводится, но надо что бы и в старшем разделе "Вентиляторы", тоже фильтр выводился.
 
То есть структура такая (см. приложенный скриншот):
 
1. Вентиляторы
    1.1. Канальные вентиляторы.
    1.2. Радиальные вентиляторы.
    1.3. .............
Название: Re: Parents name
Отправлено: admin от 21 Апреля 2015, 12:28:44
Если вы хотите чтобы находясь в любом разделе, система выводила фильтр по товарам внутри раздела, то зачем вам передfвать фильтру type-id самого раздела (ведь фильтр вы выводите на странице раздела и type-id берете с текущей страницы)/ И у вас все работает только по тому, что находясь на странице раздела переменная $own-filter пустая, так как мы не находимся на странице товара.

По умолчанию система сама определяет тип данных дочерних товаров, но при этом ищет товары только на один уровень вниз. Что у вас и происходит:
- переменная $own-filter пустая
- система автоматически пытается определить тип данных дочерних товаров и там где они есть, она выводит фильтр.

К сожалению в макросе %catalog search()% нет возможности задать определение типа товаров лежащих на 2 и более глубоких уровнях вложенности. Поэтому предлагаю вам воспользоваться маленьким кастомным скриптом, который вернет type-id доминирующих у товаров в определенном разделе с указанной глубиной вложенности.

Разместите его где вам удобнее, например в /classes/modules/custom.php
/**
 * Возвращает доминирующий тип данных среди дочерних всех страниц (в независимости от уровня вложенности)

 * @return объектный тип данных
 * @category_id id страницы, внутри которой ищем доминирующий тип данных
 * @i_need_deep искать во всех уровнях вложенности. Если необходимо искать только в первом уровне вложенности, необходимо передать значение "0"
*/
public function getDepthDominantTypeId($category_id=NULL, $i_need_deep = 2) {
if(!$category_id) return ;
        $type_id = umiHierarchy::getInstance()->getDominantTypeId($category_id,$i_need_deep);
return $type_id;
}

теперь для получения type-id используйте такой запрос:
<xsl:variable name="own-filter" select="document(concat('udata://custom/getDepthDominantTypeId/',$document-page-id))/udata" />
P.S. данную переменную стоит вызывать в самом шаблоне для раздела каталога, чтобы она лишний раз не формировалась
Название: Re: Parents name
Отправлено: Axiomateria от 22 Апреля 2015, 14:16:25
теперь для получения type-id используйте такой запрос:
<xsl:variable name="own-filter" select="document(concat('udata://custom/getDepthDominantTypeId/',$document-page-id))/udata" />
P.S. данную переменную стоит вызывать в самом шаблоне для раздела каталога, чтобы она лишний раз не формировалась

и последнее уточнение: я, если конечно правильно понял, переменную
<xsl:variable name="own-filter" select="document(concat('udata://custom/getDepthDominantTypeId/',$document-page-id))/udata" />

вставил в шаблон:
    <xsl:template match="udata[@method = 'getObjectsList'][total]" mode="layout_2">
        <xsl:variable name="own-filter" select="document(concat('udata://custom/getDepthDominantTypeId/',$document-page-id))/udata" />
        <xsl:choose>
            <xsl:when test="$catalog-main">   
                <xsl:apply-templates select="document(concat('udata://catalog/search////', 144))" mode="search_filter"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="document(concat('udata://catalog/search////', $own-filter))" mode="search_filter"/>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:call-template name="sorting"/>
        <div umi:element-id="{category_id}" umi:module="catalog" umi:method="getObjectsList" umi:sortable="sortable">
            <xsl:apply-templates select="lines/item" mode="short_view_list">
                <xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
            </xsl:apply-templates>
        </div>
        <xsl:apply-templates select="total" />
    </xsl:template>

В общем всё заработало!
Спасибо, Admin! Вот в который раз уже только на Вас и была надежда  :)