UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: KTI от 13 Апреля 2012, 09:06:21

Название: как работать с выборками USEL
Отправлено: KTI от 13 Апреля 2012, 09:06:21
У меня такая проблема, мне нужно сделать выборку похожих по цене товаров (например 3), из определенной категории. Так вот, если в этой категории мало товаров, то большая вероятность попадания в выборку самого товара.
Т.е. другими словами - как исключить из выборки определенный товар? чтобы он не попадал в выборку. мой usel:
<?xml version="1.0" encoding="utf-8"?>
<selection>
   <target result="pages">
      <type module="catalog" method="object" />
      <category depth="3">{1}</category>
   </target>
   <property name="price">
      <min-value>{2}</min-value>
      <max-value>{3}</max-value>
   </property>
   <sort>rand()</sort>
   <limit page="0">3</limit>
</selection>
Название: Re:как работать с выборками USEL
Отправлено: admin от 22 Апреля 2012, 12:12:18
если usel не дорабатывали, то тогда usel не умеет учитывать id страницы, так что для вывода схожих товаров проще писать кастом, хотя можно попробовать другие варианты если кастомы пока сложно писать
Название: Re:как работать с выборками USEL
Отправлено: KTI от 23 Апреля 2012, 13:41:07
я хотел не по id, а по имени, например:
<property name="name" value="{1}" mode="not"/>
но почему-то не работает, хотя без not все работает, т.е. выбирает только этот товар.
Временно решил проблему так: в шаблоне сравнивается id, и если совпадает то этот товар не выводится. Еще написал кастом, но тоже в нем не могу сделать отбор:
    public function getCloseGoods($id_parent, $price) {
        $block_arr = array();
        $id_parent = (int)$id_parent;
        $price = (int)$price;
        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);
            $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;
        };
    }

(как код правильно вставлять?)

Он в принципе заменяет мой usel, только этот кастом как-то не стабильно себя ведет, мож в коде что не так. И id категории как-то сам определяет..
Но самое главное, какое условие (и как) добавить что-бы товар с нужным id не попадал в selector?
Название: Re:как работать с выборками USEL
Отправлено: admin от 26 Апреля 2012, 01:58:30
попробуй такой код. Вставь его в файл /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
Название: Re:как работать с выборками USEL
Отправлено: KTI от 26 Апреля 2012, 08:28:32
спасибо, только пару моментов
не передается "name" в выходной xml, т.е. строчку
$page_ar['nodes:name'] = $page->name;
надо поменять на (скобки потерялись):
$page_ar['nodes:name'][]=$page->name;
и самое главное выбирает товары с любой категории, т.е. parentId правильно определяет, но отбирает без привязки к нему
Название: Re:как работать с выборками USEL
Отправлено: admin от 26 Апреля 2012, 08:33:59
а для того чтобы фильтрация учитывала раздел, надо строчки
$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);
Название: Re:как работать с выборками USEL
Отправлено: KTI от 26 Апреля 2012, 08:37:32
точно! все заработало, спасибо. Вот полный код (может кому пригодится)

	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;
};
}
Название: Re:как работать с выборками USEL
Отправлено: admin от 26 Апреля 2012, 08:52:45
тогда напиши еще и примеры xslt шаблонов для обработки результатов твоего кастомного скрипта
Название: Re:как работать с выборками USEL
Отправлено: KTI от 27 Апреля 2012, 10:49:12
вызов (если со страница товара)
<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 &gt; 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>

Название: Re:как работать с выборками USEL
Отправлено: john от 04 Мая 2012, 13:00:34
Подскажите, что я забыл.
В админке в Шаблоне данных в шаблоне с 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" />

У меня выводит значение "ноль" хотя поля заполнены цифрами
Название: Re:как работать с выборками USEL
Отправлено: KTI от 04 Мая 2012, 13:21:14
1. попробуй назвать поля одинаково, т.е. например в нижнем регистре
2. в строке браузера можно сразу посмотреть результат выборки
localhost/usel/new (и ответ можно сюда)
3. нужен шаблон для вывода результатов выборки
4. Поле NOMER должно быть индексируемым
Название: Re:как работать с выборками USEL
Отправлено: john от 04 Мая 2012, 15:02:06
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" />

Не работает
Название: Re:как работать с выборками USEL
Отправлено: KTI от 04 Мая 2012, 15:46:35
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>
Название: Re:как работать с выборками USEL
Отправлено: john от 04 Мая 2012, 15:56:23
1. Проверил, регистр у всех одинаковый.
3. Тип поля "Число"
4. Добавил строчку,
<udata module="usel" method="new" generation-time="0.076974"><total>0</total></udata>
тоже самое
Название: Re:как работать с выборками USEL
Отправлено: admin от 05 Мая 2012, 09:10:13
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 запроса
Название: Re:как работать с выборками USEL
Отправлено: admin от 05 Мая 2012, 09:12:41
но насколько я понимаю ты хотел видимо динамически подставлять значение поля 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