Всем привет!
В шаблоне есть три 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>
Здравствуйте!
Подскажите, пожалуйста, а как мне вытащить значение атрибута 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>
просто укажите его явно, без //
Спасибо, так и сделал.
А теперь история в развёрнутом виде:
На самом деле просто была нужна переменная для подставления значения атрибута @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. .............
Если вы хотите чтобы находясь в любом разделе, система выводила фильтр по товарам внутри раздела, то зачем вам перед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. данную переменную стоит вызывать в самом шаблоне для раздела каталога, чтобы она лишний раз не формировалась
теперь для получения 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! Вот в который раз уже только на Вас и была надежда :)