UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: Zadira от 22 Марта 2011, 15:29:38

Название: Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Zadira от 22 Марта 2011, 15:29:38
Добрый день,
Подскажите как реализовать фильтры по параметрам в XSLT шаблоне на примере стандартного шаблона "Современный интернет-магазин"?
Если зайти в категорию с товарами, то фильтры отображаются, а вот выводя тот же макрос на главной странице, он не работает.
С UMI.CMS работать начал только не давно, это первый проект на этой системе, еще очень многое не понятно.
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 22 Марта 2011, 15:33:34
отпишите сюда какую строчку вы вставляете в шаблон на главной
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Zadira от 22 Марта 2011, 15:56:03
отпишите сюда какую строчку вы вставляете в шаблон на главной

Вставляю вот такую строчку

<xsl:apply-templates select="document('udata://catalog/search')" />

На страницах контента фильтры работают, в смысле отображаются,  но ни где больше не работают.
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 22 Марта 2011, 16:33:59
ответ очень прост, хотя никак не очевиден)
используйте
<xsl:apply-templates select="document('udata://catalog/search/id')" />
, где id номер каталога с товарами (любого ) или более правильный вариант

<xsl:apply-templates select="document('udata://catalog/search////11')" />


пояснение:
дело в том что для того чтобы система вывела поля фильтра она должна знать какие поля выводить для фильтрации (для этого в шаблоне данных у поля должна стоять галочка "фильтровать"), но это еще не все система же должна знать в каком типе данных искать поля для фильтрации, по умолчпнию фильтр выводит поля относящиеся к типу данных который доминантен в данном разделе (раздел это первый параметр макроса, если он не указан берется id текущей страницы), в первом варианте мы подкинули системе id раздела внутри которого лежат объекты каталога и она правильно определила тип домининрующих страниц., но так как к разделу привязывать не стоит (вдруг его удалят).

В макросе search есть еще один параметр, который не описали в документации. Параметры макроса:
public function search($category_id = false, $group_names = "", $template = "default", $type_id = false) 
первые 3 описанны, а вот 4 и есть тот тип данных (hierarhy type id)? который система и определяет пj id раздела (наш первый вариант), и если указать при вызове макроса search параметр $type_id , то внезависимости от места вызова система будет выводить поля этого типа данный (11 это id типа данных "объект каталога"). отсюда и получилась у нас строчка 
<xsl:apply-templates select="document('udata://catalog/search////11')" />
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Zadira от 22 Марта 2011, 17:07:54
Огромное спасибо за разъяснение. Очень помогло.
Я указал ID своего типа данных и все заработало.
Но вот теперь другая проблема, выбирая какие то параметры не отображается результат фильтрации.
После нажатия в строке адреса параметры переданы, а результата нет.

http://localhost/?fields_filter[price][1]=&fields_filter[price][0]=&fields_filter[brend]=&fields_filter[tip_sumki]=&fields_filter[diagonal_ekrana]=611&fields_filter[material]=&fields_filter[cvet]=

Если я правильно понимаю, то надо под вызовом макроса поиска вставить макрос вывода объектов каталога?
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 22 Марта 2011, 19:03:28
сейчас форма фильтра сслается на
?fields_filter[price][1]=&fields_filter[price][0]=&fields_filter[brend]=&fields_filter[tip_sumki]=&fields_filter[diagonal_ekrana]=611&fields_filter[material]=&fields_filter[cvet]=
надо в шаблоне в форме в параметре action указать вначале страницу на которой будут выводиться все объекты каталога, тогда при применении фильтра вас перекинет на эту страницу а так как фильтры уже будут в адресной строке, то выведуться не все товары, а лишь отфильтрованные.

то есть делайте страницу в админе типа "результаты фильтра" в область контента вписывайте макрос (http://wiki.umisoft.ru/%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%BF%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D0%BC_%D0%BF%D0%BE_%D0%B2%D1%81%D0%B5%D0%BC%D1%83_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D1%83%3F , http://wiki.umisoft.ru/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0_%D0%BF%D0%BE_%D0%B2%D1%81%D0%B5%D0%BC_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC)

для xslt как-то так
<xsl:apply-templates select="document('udata://catalog/getObjectsList/notemplate/(mode=all)')" />

Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: sergeron от 13 Августа 2012, 10:53:55
А, чего-то не выходит фильтр получить на главной. В файл special-offers вставляю код
<xsl:template match="result[page/@is-default = '1']" priority="1">
   <xsl:apply-templates select="document('udata://catalog/search////11')" />
<xsl:apply-templates select="document('usel://special-offers/?limit=&specials-limit;')" mode="special-offers" />
</xsl:template>
вроде именно это место, ан нет ничего :(
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 13 Августа 2012, 11:11:54
а 11 - точно правильный id типа данных в вашей системе?
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: sergeron от 13 Августа 2012, 12:48:51
слепая вера в гуру подвела :)  id=71
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 13 Августа 2012, 19:17:58
а ведь писал об этом, в скучном куске текста срок так на 7  ;)
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: sergeron от 14 Августа 2012, 23:57:28
а как вывод результатов все же сделать для xslt, тоже делать страницу контентную? и туда писать
<xsl:template match="/result[page/@id = 11111]">
    <xsl:apply-templates select="document('udata://catalog/getObjectsList/notemplate/(mode=all)')" />
    </xsl:template>
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 17 Августа 2012, 10:46:24
и такой вариант возможен. Я, так понимаю, у вас получается страница с id = 11111, на которой выводятся все товары и куда вы редиректите форму фильтра?
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: sergeron от 20 Августа 2012, 16:30:08
хм... не выводится :(   
А по-умолку на какую страницу выводится результат фильтрации? Есть спецстраница или туду же, где форма висит?
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 20 Августа 2012, 20:57:53
по умолчанию на туже страницу где фильтр
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Rodogor от 25 Сентября 2012, 11:00:28
Здравствуйте. Решаю аналогичную задачу, делаю фильтр по всему каталогу по цене. Не получается сделать фильтр по всему каталогу по конкретным полям при указание типа

Сформировал такой запрос:
http://localhost/udata/catalog/search/(36)/(cenovye_svojstva)//113

Ответ такой -
<udata xmlns:xlink="http://www.w3.org/TR/xlink" category_id="36" module="catalog" method="search" generation-time="0.353681">
<group name="cenovye_svojstva" title="Ценовые свойства">
<field name="price" title="Цена" data-type="price"/>
</group>
</udata>

Вроде бы всё правильно, но мне надо задавать минимальные и максимальные значения для price.

http://localhost/udata/catalog/search/(156)/(cenovye_svojstva)?fields_filter[price][0]=10&fields_filter[price][1]=110
ответ такой:
<udata xmlns:xlink="http://www.w3.org/TR/xlink" category_id="156" module="catalog" method="search" generation-time="0.016223">
<group name="cenovye_svojstva" title="Ценовые свойства">
<field name="price" title="Цена" data-type="price">
<value_from>10</value_from>
<value_to>110</value_to>
</field>
</group>
</udata>

Пытаюсь так же сделать для варианта с передачей hierarhy type id:
http://localhost/udata/catalog/search/(36)/(cenovye_svojstva)?fields_filter[price][0]=10&fields_filter[price][1]=110//68
ответ -  <udata xmlns:xlink="http://www.w3.org/TR/xlink" category_id="36" module="catalog" method="search" generation-time="0.005078"/>

Через var_dump() вывел $_REQEST, посмотрел переменные и пришёл к выводу, что когда запрос выполняется таким образом - всё после символ ? воспринимается как 2-ой параметр. Собственно не получается сделать фильтр по всему каталогу по конкретным полям, хотелось бы узнать как это решить...

Пока решил так - public function search($category_id = false, $group_names = "", $template = "default", $type_id = 68)
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: admin от 25 Сентября 2012, 11:26:57
для того чтобы осуществить поиск по всем объектам каталога, надо

во-первых, сделать вывод всех объектов каталога на одной странице

во-вторых, поле по которому будет осуществляться фильтрация должно быть назначено типу данных "Объект каталога" (чтобы подхватились все дочерние типы данных если такие имеются)

в-третьих, макрос для фильтрации должен иметь параметр который явно задает с каким типом данных надо работать, то есть udata/catalog/search/(36)/(cenovye_svojstva)//113 (если 113 hierarhy type id "Объект каталога")

хотя по сути системе все равно как вы выведите фильтр главное чтобы при его применении в адресную строку попали параметры вида ?fields_filter[field_name]=some_value и чтобы товары которые выводятся на этой странице имели в своем типе данных поле с таким названием
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Rodogor от 26 Сентября 2012, 12:42:12
Решил вопрос, залез на форум, прочитал Ваш пост - оказывается, что сделал именно так же. :) Благодарю за ответ.
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Axiomateria от 05 Марта 2014, 23:23:40
ответ очень прост, хотя никак не очевиден)
используйте
<xsl:apply-templates select="document('udata://catalog/search/id')" />
, где id номер каталога с товарами (любого ) или более правильный вариант

<xsl:apply-templates select="document('udata://catalog/search////11')" />


пояснение:
дело в том что для того чтобы система вывела поля фильтра она должна знать какие поля выводить для фильтрации (для этого в шаблоне данных у поля должна стоять галочка "фильтровать"), но это еще не все система же должна знать в каком типе данных искать поля для фильтрации, по умолчпнию фильтр выводит поля относящиеся к типу данных который доминантен в данном разделе (раздел это первый параметр макроса, если он не указан берется id текущей страницы), в первом варианте мы подкинули системе id раздела внутри которого лежат объекты каталога и она правильно определила тип домининрующих страниц., но так как к разделу привязывать не стоит (вдруг его удалят).

В макросе search есть еще один параметр, который не описали в документации. Параметры макроса:
public function search($category_id = false, $group_names = "", $template = "default", $type_id = false) 
первые 3 описанны, а вот 4 и есть тот тип данных (hierarhy type id)? который система и определяет пj id раздела (наш первый вариант), и если указать при вызове макроса search параметр $type_id , то внезависимости от места вызова система будет выводить поля этого типа данный (11 это id типа данных "объект каталога"). отсюда и получилась у нас строчка  
<xsl:apply-templates select="document('udata://catalog/search////11')" />


Как я вижу -  у меня сходная задача, то есть вывод фильтров у меня такой:
<xsl:apply-templates select="document(concat('udata://catalog/search////', 132))"/>
где 132 это ID типа данных объекта каталога, по параметрам которого необходимо делать поиск по фильтрам.
Вывод этих фильтров успешно выводится у меня в шаблоне "сквозняком", то есть на всех страницах сайта, включая и на главной странице сайта и на всех остальных контентных, новостных и прочих.
Но на данный момент результаты поиска по фильтрам выводятся только в разделах каталога.  

Вопрос вот в чём: как вывести эти результаты поиска на отдельную контентую страницу (специально созданную в структуре сайта) ? Или как выводить эти результаты на главную страницу каталога http://domen.ru/shop/, если можно обойтись без отдельной контентной страницы ?
Ведь пользователь, допустим, находясь на главной странице или к примеру на странице новостей вдруг захочет воспользоваться поиском по каталогу и результатов не увидит...

В идеале хотелось бы вывести результаты поиска по фильтрам на главный раздел каталога, который выводится по такому шаблону:
    <xsl:template match="result[page/@type-id=82]">
        <div umi:element-id="{$document-page-id}" umi:field-name="descr" umi:empty="&empty-page-content;">
            <xsl:value-of select=".//property[@name = 'descr']/value" disable-output-escaping="yes" />
        </div>
        <xsl:apply-templates select="document('udata://catalog/getObjectsList/notemplate/(mode=all)')" />
    </xsl:template>
где 82 это ID типа данных "Раздел каталога"
Название: Re:Реализовация фильтров поиска по парметрам по всему каталогу
Отправлено: Axiomateria от 08 Марта 2014, 13:27:00
Вопрос решился очень просто. Если кому интересно - могу поделиться опытом.