Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
отображение запроса USEL в виде запроса SQL

Автор BaceHРаздел Custom макросы

Ответов: 5
Просмотров: 2618
Последний ответ 11 Январь 2013, 19:48:58
от admin
Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю

Автор AksukРаздел Шаблоны XSLT

Ответов: 11
Просмотров: 4225
Последний ответ 05 Март 2012, 23:01:29
от Aksuk
Вывод объектов каталога через USEL по элементу в справочнике

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 6
Просмотров: 2426
Последний ответ 20 Июль 2013, 20:31:56
от NOIRMAN
Выборка USEL с несколькими параметрами для одного поля

Автор sempl84Раздел Шаблоны XSLT

Ответов: 3
Просмотров: 1649
Последний ответ 29 Ноябрь 2012, 11:05:03
от niakriss
Вывод порядковый номер (нумерация) при usel выдачи

Автор atachРаздел Custom макросы

Ответов: 5
Просмотров: 1933
Последний ответ 25 Сентябрь 2013, 13:37:27
от admin

0 Пользователей и 1 Гость просматривают эту тему.

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
как работать с выборками USEL
« : 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>

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #1 : 22 Апрель 2012, 12:12:18 »
если usel не дорабатывали, то тогда usel не умеет учитывать id страницы, так что для вывода схожих товаров проще писать кастом, хотя можно попробовать другие варианты если кастомы пока сложно писать

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #2 : 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?

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #3 : 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

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #4 : 26 Апрель 2012, 08:28:32 »
спасибо, только пару моментов
не передается "name" в выходной xml, т.е. строчку
$page_ar['nodes:name'] = $page->name;
надо поменять на (скобки потерялись):
$page_ar['nodes:name'][]=$page->name;
и самое главное выбирает товары с любой категории, т.е. parentId правильно определяет, но отбирает без привязки к нему

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #5 : 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);

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #6 : 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;
};
}

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #7 : 26 Апрель 2012, 08:52:45 »
тогда напиши еще и примеры xslt шаблонов для обработки результатов твоего кастомного скрипта

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #8 : 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>


*

john

  • ***
  • 206
  • +6/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #9 : 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" />

У меня выводит значение "ноль" хотя поля заполнены цифрами

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #10 : 04 Май 2012, 13:21:14 »
1. попробуй назвать поля одинаково, т.е. например в нижнем регистре
2. в строке браузера можно сразу посмотреть результат выборки
localhost/usel/new (и ответ можно сюда)
3. нужен шаблон для вывода результатов выборки
4. Поле NOMER должно быть индексируемым

*

john

  • ***
  • 206
  • +6/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #11 : 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" />

Не работает

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #12 : 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>

*

john

  • ***
  • 206
  • +6/-0
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #13 : 04 Май 2012, 15:56:23 »
1. Проверил, регистр у всех одинаковый.
3. Тип поля "Число"
4. Добавил строчку,
<udata module="usel" method="new" generation-time="0.076974"><total>0</total></udata>
тоже самое

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:как работать с выборками USEL
« Ответ #14 : 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 запроса