Прмерно таким был мой ответ изначально
если никак не поменять задачу, с чего я бы и начал, то реализация будет кастомной что явно не добавит приятного к последующей поддержке.
Но если говорит про практическую сторону решения вопроса, то фактически 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 ты должен получить этот товар
Не вышло сделать. Попробуем по шагам, может так получится?
чтобы подключить это к фильтру выводишь ручками <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' мне нужно что-то загнать, но я не понимаю что именно.
во первых вынеси @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 нам подскажет
это форма
<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" />
Ох, че-то мне кажется, что все я неправильно написал :)
Да, кавычки не нужны.
Поле 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')" />
Как-то так, мне кажется
неее... у меня фильтр вот такой <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>
я по типу price фильтрую, у меня и так поля price и cena2, которые для товара заполнены, сюда попадают. Еще одно поле мне не нужно по-идее. Это новое поле "cena" (как админ писал - любое) нужно для того , чтобы данные полей price и cena2 в него подставлять.
Исходный шаблон для поля типа "цена" не редактируй, то есть оставь его как дефолтный, а вот ниже него добавь свой например так (вывожу тобою приведенный дефолтный и новый ниже него)
<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>
<!--твой шаблон для поля цена-->
<xsl:template match="field[@name = 'cena']" mode="search">
<div class="grade">
<label class="right">
<span>
<xsl:text>&range-to;</xsl:text>
</span>
<input type="text" name="cena1" value="{value_to}" class="textinputs" />
</label>
<label>
<span>
<xsl:value-of select="@title" />
<xsl:text> &range-from;</xsl:text>
</span>
<input type="text" name="cena0" value="{value_from}" class="textinputs" />
</label>
</div>
</xsl:template>
после чего у тебя в фильтре появиться новое поле которые при использовании фильтра попадет в адресную строку в таком виде
оттуда ты их можешь подхватить вставив в файл /xsltTpls/default.xsl
повыше <xsl:param name="p">0</xsl:param> свои параметры
<xsl:param name="cena0"></xsl:param>
<xsl:param name="cena1"></xsl:param>
после этого если ты где-то будешь вызывать usel запрос ты можешь использовать данные параметры и передавать их в usel.
И если ndqj 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 будет выглядеть примерно так:
<xsl:apply-templates select="document(concat('usel://test/',$cena0,'/',$cena1))/udata" mode="usel-result" />
и конечно шаблоны для результатов usel
<xsl:template match="udata" mode="usel-result">
Результаты usel
<xsl:apply-templates select="page" mode="usel-result" />
</xsl:template>
<xsl:template match="page" mode="usel-result">
<h3><xsl:value-of select="position()"/>. <a href="{@link}"><xsl:value-of select="name" /></a></h3>
</xsl:template>
P.S. НО, опять же, проговорю что эту фильтрация по цене, которая должна попадать в диапазон 2 полей типа цена, заданных у объекта каталога, нельзя будет скомбинировать с другими полями для фильтрации.... смотри часть P.S. в моем посте выше (http://umihelp.ru/forum/index.php/topic,1185.msg4010.html#msg4010)