Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

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

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Есть такая задача:
У товара 2 цены. Например 100р и 200р. Одну пишем в поле price, вторую в дополнительное поле price2 (тоже с типом ЦЕНА). Как сделать фильтрацию, чтобы при запросе цены от 100 до 200, товар выводился? Т.е. отслеживать не четкую цену а коридор от минимума до максимума.

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #1 : 25 Апреля 2012, 16:49:19 »
про какую фильтрацию идет речь. Что значит отслеживать.
пишите подробнее, фильтровать можно много где: на сайте, xslt, php, js, sql и т.д.

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #2 : 25 Апреля 2012, 17:00:45 »
Сайт Современный, xslt. Каталог товаров. Вверху выводится фильтр по цене От-До. Надо товару прописать 2 цены (например первая цена - 100, вторая - 200) . Если теперь в фильтре задать поиск от 100 до 150, он должен вывести товар, а также если задать от 150 до 300, тоже должен вывести.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #3 : 25 Апреля 2012, 17:10:46 »
то есть диапазон указанный в фильтре должен охватывать как минимум одно поле из тех, что вы прописываете товару (price и price2 например)?

а зачем вам 2 цены у товара, если не секрет?

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #4 : 25 Апреля 2012, 20:27:47 »
Прошу прощения за задержку с ответом, переезд не близкий. Да, с диапазоном все так. А две цены - это, например, стоимость проживания в гостинице (номера могу по-разному стоить, но гостиница должна попасть в выборку от мин до макс)

*

BaceH

  • ***
  • 141
  • +21/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #5 : 25 Апреля 2012, 22:41:17 »
при стоимости в 100 можно делать проверку +/- 50, то есть при поиске от 150 до 300, вы будете показывать результаты от 100 до 350.
с двумя ценами вы как то переборщили, если это только для подбора.

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #6 : 25 Апреля 2012, 22:56:01 »
Так с двумя ценами это не я переборщил, а заказчик. Мне обход этой темы не нужен, мне решение нужно :)

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #7 : 26 Апреля 2012, 00:09:37 »
Прмерно таким был мой ответ изначально

Цитировать
если никак не поменять задачу, с чего я бы и начал, то реализация будет кастомной что явно не добавит приятного к последующей поддержке.

Но если говорит про практическую сторону решения вопроса, то фактически umi api не даст вам возможность написать запрос, который будет проверять попадает ли в указанный диапазон 1 или 2 поле и если хотя бы одно попадает то выведет этот товар... И тут, скорее всего, придется писать прямой запрос в базу, что еще больше усложняет доработку и поддержание её работоспособности при обновлениях системы в будущем.

Так что я опять же подумал бы имеет ли смысл биться именно над этой реализацией.

но что-то дернуло покопаться))

Выяснилось что в usel протоколе появилась возможность задать  параметр объединения правил фильтрации. Один из параметров позволяет объединить правила фильтрации логичиским ИЛИ.
В итоге, создав файл фильтрации /usels/test.xml
<?xml version="1.0" encoding="utf-8"?>
<selection>
<target result="pages">
<type id="117" />
</target>
<option name="or-mode" value="1" />
<property name="price">
<min-value>{1}</min-value>
<max-value>{2}</max-value>
</property>
<property name="cena2">
<min-value>{1}</min-value>
<max-value>{2}</max-value>
</property>
</selection>

где type id = 117 это тип данных, в котором есть эти 2 поля цены (price и cena2). Если у тебя эти 2 поля с ценой есть во всех типах данных относящихся к базовому типу "Объект каталога", то пиши вместо строчки <type id="117" />, такую строчку <type module="catalog" method="object" />.

В итоге ты можешь проверить работоспособность данного usel запроса например создав товар у которого одно из полей цены имеет значение 302 и прописав вв адресной строке /usel/test/300/310 ты должен получить этот товар

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #8 : 26 Апреля 2012, 12:53:18 »
Гениально, запрос отработал четко. Осталось понять как подключить это к фильтру, буду пробовать.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #9 : 26 Апреля 2012, 13:00:37 »
чтобы подключить это к фильтру выводишь ручками <input/> от и до с произвольными именами в свой форме фильтрации, при нажатии на кнопку фильтровать система перекинет эти значения в адресную строку, ты их подхватываешь через глобальную <xsl:param> конструкцию, так же как и параметр p в файле /xsltTpls/default.xsl

а на  странице где выводишь результаты пишешь вызов usel протокола подставляя параметры которые ты определил шагом ранее и все работает.

P.S. Только если у тебя будут другие параметры, по которым нужно будет фильтровать... их надо тоже как-то в usel использовать, но там может получиться проблема, так как usel файле уже есть option который позволяет попасть в результаты любому товару, даже если он, например, по цене не подходит, но подходит по производителю.

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #10 : 26 Апреля 2012, 13:36:54 »
Спасибо, пошел делать  :)

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #11 : 27 Апреля 2012, 16:11:51 »
Не вышло сделать. Попробуем по шагам, может так получится?
Цитировать
чтобы подключить это к фильтру выводишь ручками <input/> от и до с произвольными именами в свой форме фильтрации
Моя форма фильтрации определяется файлом search-filter модуля каталог, потому что мне нужны еще и другие фильтры, кроме ценового. Весь фильтр построен по принципу поиска по field, а в параметрах либо имена, либо типы. Код который выводит фильтр по типу данных "price", выглядит вот так:
<xsl:template match="field[@data-type = 'price' or @data-type = 'int' or @data-type = 'float']" mode="search">
<div class="grade">
<label class="right">
<span>
<xsl:text>&range-to;</xsl:text>
</span>
<input type="text" name="fields_filter[{@name}][1]" value="{value_to}" class="textinputs" />
</label>
<label>
<span>
<xsl:value-of select="@title" />
<xsl:text> &range-from;</xsl:text>
</span>
<input type="text" name="fields_filter[{@name}][0]" value="{value_from}" class="textinputs" />
</label>
</div>
</xsl:template>
вот вместо этого @data-type = 'price' мне нужно что-то загнать, но я не понимаю что именно.

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #12 : 28 Апреля 2012, 06:45:43 »
во первых вынеси @data-type = 'price' в отдельный шаблон. т.е. скопируй этот и удали все кроме @data-type = 'price', т.е.
<xsl:template match="field[@data-type = 'price']" mode="search">
у тебя будет отдельный шаблон для обработки поля цена
в нем input поставь например так
<input type="text" name="fields_filter['cena'][1]" value="{value_to}" class="textinputs" />
а подхват параметров с адресной строки я тоже ничего не знаю
где их подхватывать и как..
будем надеяться ув. admin нам подскажет
« Последнее редактирование: 28 Апреля 2012, 07:07:56 от KTI »

*

sergeron

  • **
  • 59
  • +2/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #13 : 28 Апреля 2012, 10:43:37 »
это форма
<xsl:template match="field[@data-type = 'price']" mode="search">		
<div class="grade">
<label class="right">
<span>
<xsl:text>&range-to; </xsl:text>
</span>
<input id="amount_to" type="text" name="fields_filter[cena][1]" value="{value_to}" class="textinputs" />
</label>
<label>
<span>
<xsl:value-of select="@title" />
<xsl:text> &range-from; </xsl:text>
</span>
<input id="amount_from" type="text" name="fields_filter[cena][0]" value="{value_to}" class="textinputs" />
</label>
</div>
</xsl:template>
не уверен cena в кавычках ставится или без.

В шаблоне default вставил
<xsl:param name="cena">0</xsl:param>
и дальше, надо вставить в место вывода запрос usel.

Выводится видимо где-то здесь в файле category-view:
<xsl:template match="udata[@method = 'getObjectsList'][total]">
<xsl:apply-templates select="document('udata://catalog/search')" />
<div class="catalog_sort" />
<div class="catalog">       
<div class="objects" umi:element-id="{category_id}" umi:module="catalog" umi:method="getObjectsList" umi:sortable="sortable">
<xsl:apply-templates select="lines/item" mode="short-view">
<xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
</xsl:apply-templates>
<div class="clear" />
</div>
</div>
<div class="clear" />

<xsl:apply-templates select="total" />
</xsl:template>
и запрос надо вставить типа <xsl:apply-templates select="document(concat('usel://test/?cena=',$cena))/udata" />
Ох, че-то мне кажется, что все я неправильно написал  :)


*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
Re:Две цены для одного товара (фильтрация)
« Ответ #14 : 28 Апреля 2012, 17:27:03 »
Да, кавычки не нужны.
Поле cena должно быть фильтруемым и видимым, и оно должно появится в форме фильтра. Появляется?
Вбиваешь туда цифры и жмешь "Применить", в строке браузера должны добавится твои поля, типа
?fields_filter[price][1]=&fields_filter[price][0]=&fields_filter[cena][1]=1000&fields_filter[cena][0]=5000
теперь их надо отловить в category-view, и подсунуть в usel вместо
<xsl:apply-templates select="document('udata://catalog/search')" />
Как-то так, мне кажется