попробуй такой код. Вставь его в файл /classes/modules/custom.php
public function getCloseGoods($id=NULL) {
if(!$id) return;
$element = umiHierarchy::getInstance()->getElement($id);
if(!$element) return;
$block_arr = array();
$id_parent = $element->getParentId();
$price = (int)$element->price;
$this_page_name = $element->name;
if ($id_parent && $price) {
$delta = $price / 5;
$min_price = $price - $delta;
$max_price = $price + $delta;
$pages = new selector('pages');
$pages->types('object-type')->name('catalog', 'object');
// $pages->where('object-type')->page($id_parent)->childs(1);
$pages->where('price')->between($min_price, $max_price);
if($this_page_name) $pages->where('name')->notequals($this_page_name);
$pages->order('rand');
$pages->limit(0, 3); //offset, limit
foreach($pages->result as $page) {
$page_ar = array();
$page_ar['attribute:id'] = $page->id;
$page_ar['attribute:parentId'] = $id_parent;
$page_ar['attribute:link'] = $page->link;
$page_ar['xlink:href'] = "upage://" . $page->id;
$page_ar['nodes:name'] = $page->name;
$block_arr['nodes:page'][] = $page_ar;
}
$block_arr['total'] = $pages->length;
return $block_arr;
} else {
$block_arr['total'] = 0;
return $block_arr;
};
}
и в нужном месте вызывай его как
<xsl:apply-templates select="document(concat('udata://custom/getCloseGoods/',@id))/udata" mode="related_item" />
не забудь проследить чтобы @id возвращал id текущего товара. Если будешь вызывать этот макрос на странице товара, то место @id используй @document-page-id
спасибо, только пару моментов
не передается "name" в выходной xml, т.е. строчку
$page_ar['nodes:name'] = $page->name;
надо поменять на (скобки потерялись):
$page_ar['nodes:name'][]=$page->name;
и самое главное выбирает товары с любой категории, т.е. parentId правильно определяет, но отбирает без привязки к нему
а для того чтобы фильтрация учитывала раздел, надо строчки
$pages->types('object-type')->name('catalog', 'object');
// $pages->where('object-type')->page($id_parent)->childs(1);
заменить на
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('hierarchy')->page($id_parent)->childs(1);
точно! все заработало, спасибо. Вот полный код (может кому пригодится)
public function getCloseGoods($id=NULL) {
if(!$id) return;
$element = umiHierarchy::getInstance()->getElement($id);
if(!$element) return;
$block_arr = array();
$id_parent = $element->getParentId();
$price = (int)$element->price;
$this_page_name = $element->name;
if ($id_parent && $price) {
$delta = $price / 5;
$min_price = $price - $delta;
$max_price = $price + $delta;
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('hierarchy')->page($id_parent)->childs(1);
$pages->where('price')->between($min_price, $max_price);
if($this_page_name) $pages->where('name')->notequals($this_page_name);
$pages->order('rand');
$pages->limit(0, 3); //offset, limit
foreach($pages->result as $page) {
$page_ar = array();
$page_ar['attribute:id'] = $page->id;
$page_ar['attribute:parentId'] = $id_parent;
$page_ar['attribute:link'] = $page->link;
$page_ar['xlink:href'] = "upage://" . $page->id;
$page_ar['nodes:name'][] = $page->name;
$block_arr['nodes:page'][] = $page_ar;
}
$block_arr['total'] = $pages->length;
return $block_arr;
} else {
$block_arr['total'] = 0;
return $block_arr;
};
}
вызов (если со страница товара)
<xsl:apply-templates select="document(concat('udata://custom/getCloseGoods/',$document-page-id))" mode="related_item" />
сам шаблон:
<!-- шаблон 3 похожих по цене товара в категории -->
<xsl:template match="udata" mode="related_item">
<hr />
<h4>
<xsl:text>&recommended-items;:</xsl:text>
</h4>
<div class="closest_goods">
<div class="objects" umi:element-id="{page[@parentId > 0]/@parentId}" umi:module="custom" umi:method="getCloseGoods" umi:region="list" umi:add-method="none">
<xsl:apply-templates select="page" mode="short-view">
<xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
</xsl:apply-templates>
</div>
</div>
<div class="clear" />
</xsl:template>
Подскажите, что я забыл.
В админке в Шаблоне данных в шаблоне с id 72
http://localhost/admin/data/type_edit/72/
Создал Новую "Группу полей" в нем создал новое "Поле" с идентификатором "NOMER"
В файле /usels/new.xml прописал
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type id="72" />
</target>
<property name="nomer" value="1" />
</selection>
И в шаблоне вывода списка каталога пытаюсь его вывести
/xsltTpls/modules/catalog/common.xsl
<xsl:apply-templates select="page" mode="new" />
<xsl:apply-templates select="document('usel://new/1')/udata" mode="new" />
У меня выводит значение "ноль" хотя поля заполнены цифрами
1. Поле nomer например поменять на имя new? или какие поля?
2. Результат <udata module="usel" method="new" generation-time="0.069139"><total>0</total></udata>
3. <xsl:template match="udata" mode="new" />
<xsl:template match="udata[page]" mode="new">
<xsl:apply-templates select="page" mode="new" />
</xsl:template>
</xsl:template>
Такой шаблон для вывода результатов?
4. И потом вызываю макросом
<xsl:apply-templates select="document('usel://new/0')/udata" mode="new" />
Не работает
1 я имею ввиду регистр букв чтобы был одинаковый (вдруг это влияет)
т.е. в админке у вас поле NOMER, а в выборке (usel) nomer
2 шаблон явно не такой, но это пока не важно
3 Какой тип поля nomer у вас? число, строка?
4 попробуйте добавить в usel строчку
<category depth="5">0</category>
после <type id="72" />, т.е. типа
<target result="pages">
<type id="72" />
<category depth="5">0</category>
</target>
1. Проверил, регистр у всех одинаковый.
3. Тип поля "Число"
4. Добавил строчку, <udata module="usel" method="new" generation-time="0.076974"><total>0</total></udata>
тоже самое
john,
подытожим,
1. ты создал поле с именем nomer (тип поля "число") в типе данных 72 (я так понимаю это "Объект каталога")
2. создал usel шаблон /usels/new.xml
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type id="72" />
</target>
<property name="nomer" value="1" />
</selection>
3. в итоге? чтобы запрос http://localhost/usel/new вернул что-то, надо в любом товаре в поле "nomer" проставить 1
шаблоны для вывод в каталог поищи на форуме, уже выкладывались шаблоны для вывода usel запроса
но насколько я понимаю ты хотел видимо динамически подставлять значение поля number? тогда тебе надо изменить свой xml шаблон на такой
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type id="72" />
</target>
<property name="nomer" value="{1}" />
</selection>
и тогда выборка "Объектов каталога" со значение 1 в поле number вызов usel будет таким: http://localhost/usel/new/1