Автор Тема: Фильтр товаров  (Прочитано 5155 раз)

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

Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Фильтр товаров
« : 09 ноября 2017, 10:55:35 »
Лазил по форуму, но не нашел конкретной информации - как поэтапно организовать поиск по товарам используя фильтр - или сделать выборку товаров используя фильтр - кто как называет?

А так же интересуют ответы на вопросы:
- В чем отличия между внешним фильтром и внутренним?
- Я выводил внешний фильтр - но почему-то на странице не выводится вообще ничего - думал что отобразиться хотя бы дефолтная форма поиска которая есть в шаблоне outer_filter.html, но она не показалась?

Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 469
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #1 : 09 ноября 2017, 12:02:14 »
Внешний фильтр получает параметры для фильтрации от полей ввода формы. Т.е. посетитель вбивает туда значение и по этому значению фильтруется.
Внутренний фильтр не получает никаких данных извне. В качестве примера - "вывести распродажные позиции в этой категории". Т.е. Он просто отберет N товаров, соответствующих условию "rasprodaza=1"
Формы ввода данных для внешнего фильтра вы верстаете сами в тех местах (карточка товара или список товара) где они нужны: http://wiki.santafox.ru/doku.php?id=constructor:catalog#внешние_фильтры



Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #2 : 09 ноября 2017, 12:43:30 »
Как правильно настроить внешний фильтр?
И почему когда я вывожу внешний фильтр - то ничего не выводится - как я писал выше.

Внешний фильтр получает параметры для фильтрации от полей ввода формы. Т.е. посетитель вбивает туда значение и по этому значению фильтруется.
Внутренний фильтр не получает никаких данных извне. В качестве примера - "вывести распродажные позиции в этой категории". Т.е. Он просто отберет N товаров, соответствующих условию "rasprodaza=1"
Формы ввода данных для внешнего фильтра вы верстаете сами в тех местах (карточка товара или список товара) где они нужны: http://wiki.santafox.ru/doku.php?id=constructor:catalog#внешние_фильтры

Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 469
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #3 : 09 ноября 2017, 13:19:55 »
Вот пример страницы, где у меня есть внешний фильтр: http://www.techelement.ru/catalog.html?cid=6

Вот текст фильтра:
true
REMOVE_NOT_SET[ AND manufacturer='param[manufacturer]']
REMOVE_NOT_SET[ AND price<param[price]]

REMOVE_NOT_SET[ AND base_voltage IN ('220', '220\\380', '24\\110\\230', '220\\12', '220\\120', '220\\380\\12') /*param[base_voltage_220]*/]
REMOVE_NOT_SET[ AND base_voltage IN ('380', '220\\380', '220\\380\\12') /*param[base_voltage_380]*/]
REMOVE_NOT_SET[ AND base_voltage IN ('12','220\\380\\12','220\\12') /*param[base_voltage_12]*/]

REMOVE_NOT_SET[ AND welding_migmag_i_max>=0.95*param[welding_migmag_i_max] AND welding_migmag_i_max<=1.05*param[welding_migmag_i_max]]

REMOVE_NOT_SET[ AND manuf_country='param[manuf_country]']
REMOVE_NOT_SET[ AND manuf_country IS NULL /*param[manuf_country_china]*/]

REMOVE_NOT_SET[ AND welding_migmag_rollnumber='4' /*param[welding_migmag_rollnumber]*/]
REMOVE_NOT_SET[ AND welding_aluminum='Да' /*param[welding_aluminum]'*/]
REMOVE_NOT_SET[ AND welding_pulse='Есть' /*param[welding_pulse]*/]
REMOVE_NOT_SET[ AND welding_mma_i_max>0 /*param[welding_mma_i_max]*/]
REMOVE_NOT_SET[ AND welding_migmag_fx_d IS NOT NULL /*param[welding_migmag_fx_d]*/]
REMOVE_NOT_SET[ AND welding_migmag_wire_inout IN ('Снаружи','Снаружи/Внутри') /*param[welding_mm_wire_inout_out]*/]
REMOVE_NOT_SET[ AND welding_migmag_wire_inout IN ('Внутри','Снаружи/Внутри') /*param[welding_mm_wire_inout_in]*/]
REMOVE_NOT_SET[ AND welding_naks IS NOT NULL/*param[welding_naks]*/]
REMOVE_NOT_SET[ AND welding_saw_tractor='Есть' /*param[welding_saw_tractor]*/]

ORDER BY price IS NOT NULL DESC, articulus IS NOT NULL DESC, popsort DESC

param[manufacturer] - это как раз то, что приходит с внешней формы.

А вот как выглядит шаблон формы этой:
<form class="filter-product" action="/catalog.html" method="get">
    <input type='hidden' id="cid" name='cid' value="[@function-v_request(cid ||| 0)]">
    <input type="hidden" name="filterid" value="f_mig-mag">
    <div class="filter-product-wrap">
        <table>
            <tr>
                <td style="width: 200px">
                    <div class="field">
                        <label>Производитель:</label>
                        <select name="manufacturer">
                            <option value="">Все</option>
                            [@function-v_get_brandList()]
                        </select>
                    </div>
                </td>
                <td style="width: 200px">
                    <div class="field">
                        <label>Напряжение, В:</label>
                        <input type="hidden" name="base_voltage_[@function-v_request(base_voltage)]" value="1">
                        <select name="base_voltage" onchange="if($(this).val()!='') $(this).prev().attr('name','base_voltage_'+$(this).val()).val(1); else $(this).prev().val('');">
                            <option value="">Все</option>
                            <option value="220"[@function-v_selected_print(base_voltage ;;||;; 220)]>220</option>
                            <option value="380"[@function-v_selected_print(base_voltage ;;||;; 380)]>380</option>
                        </select>
                    </div>
                </td>
                <td style="width: 155px">
                    <div class="field">
                        <label>Свар. ток, А:</label>
                        <input type="text" name="welding_migmag_i_max" value="[@function-v_request(welding_migmag_i_max)]">
                    </div>
                </td>
                <td>
                    <div class="field">
                        <label>Цена, р:</label>
                        <span>до</span>
                        <input type="text" name="price" value="[@function-v_request(price)]">
                    </div>
                </td>
                <td rowspan="3" class="filter_float_button"><input type="submit" class="sbm-filter" value="Искать"></td>
            </tr>
            <tr>
                <td>
                    <div class="field">
                        <label>Страна:</label>
                        <input type="hidden" name="manuf_country_china" value="">
                        <select name="manuf_country" onchange="if($(this).find('option:selected').text()=='Китай') $(this).prev().val(1); else $(this).prev().val('');">
                            <option value="">Все</option>
                            [@function-v_catalog_get_country()]
                        </select>
                    </div>
                </td>
                <td>
                    <div class="field">
                        <label>Подающее устр-во:</label>
                        <input type="hidden" name="welding_mm_wire_inout_[@function-v_request(welding_mm_wire_inout)]" value="1">
                        <select name="welding_migmag_wire_inout" onchange="if($(this).val()!='') $(this).prev().attr('name','welding_mm_wire_inout_'+$(this).val()).val(1); else $(this).prev().val('');">
                            <option value="">Все</option>
                            <option value="out"[@function-v_selected_print(welding_migmag_wire_inout ;;||;; out)]>выносное</option>
                            <option value="in"[@function-v_selected_print(welding_migmag_wire_inout ;;||;; in)]>встроенное</option>
                        </select>
                    </div>
                </td>
                <td colspan="2" rowspan="2">
                    <div class="field" style="min-width: 258px;">
                        <input value="1" name="welding_migmag_rollnumber" type="checkbox"[@function-v_checked_print(welding_migmag_rollnumber)]>
                        <label>4х-роликовый механизм:</label>
                        <input value="Да" name="welding_pulse" type="checkbox"[@function-v_checked_print(welding_pulse)]>
                        <label>Режим Pulse:</label>
                        <input value="Да" name="welding_aluminum" type="checkbox"[@function-v_checked_print(welding_aluminum)]>
                        <label>Варит алюминий:</label>
                        <input value="1" name="welding_mma_i_max" type="checkbox"[@function-v_checked_print(welding_mma_i_max)]>
                        <label>Сварка электродами:</label>
                    </div>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <div class="field" style="min-width: 270px; margin-right: 25px;">
                        <input value="1" name="welding_migmag_fx_d" type="checkbox"[@function-v_checked_print(welding_migmag_fx_d)]>
                        <label>Сварка порошк. проволокой:</label>
                    </div>
                </td>
            </tr>
        </table>
    </div>
</form>

Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 469
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #4 : 09 ноября 2017, 13:49:11 »
Пользовательская функция "v_selected_print" - это просто костыль, который проггер написал, чтобы сохранялись значения выбранные.

/**
 * Функция v_selected_print($a) предназначена для сохранения состояний выпадающих списков.
 * Пример вызова [@function-v_selected_print(name_select ;;||;; value)]
 * Данную функцию необходимо писать в каждом из <option> - <option value="55" [@function-v_selected_print(name_select ;;||;; 55)]>
 * Выводит ' selected="selected"' если $_REQUEST[$name]==$value
 * @param $name
 * @param $value
 * @return string
 */
function v_selected_print($a){
    $a = explode(" ;;||;; ",$a);
    $name = $a[0];
    if(isset($a[1])) $value = $a[1]; else  return '';
    if(isset($_REQUEST[$name]) && $_REQUEST[$name]==$value) return ' selected="selected"'; else return '';
}

Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #5 : 09 ноября 2017, 15:12:25 »
буду разбираться.

Пользовательская функция "v_selected_print" - это просто костыль, который проггер написал, чтобы сохранялись значения выбранные.

/**
 * Функция v_selected_print($a) предназначена для сохранения состояний выпадающих списков.
 * Пример вызова [@function-v_selected_print(name_select ;;||;; value)]
 * Данную функцию необходимо писать в каждом из <option> - <option value="55" [@function-v_selected_print(name_select ;;||;; 55)]>
 * Выводит ' selected="selected"' если $_REQUEST[$name]==$value
 * @param $name
 * @param $value
 * @return string
 */
function v_selected_print($a){
    $a = explode(" ;;||;; ",$a);
    $name = $a[0];
    if(isset($a[1])) $value = $a[1]; else  return '';
    if(isset($_REQUEST[$name]) && $_REQUEST[$name]==$value) return ' selected="selected"'; else return '';
}

Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #6 : 09 ноября 2017, 15:35:20 »
А текст фильтра мы где пишем?

Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 469
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #7 : 09 ноября 2017, 15:44:57 »

Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #8 : 09 ноября 2017, 16:00:11 »
А шаблон формы куда вписываем? в отдельный файл или в файл шаблона вывода товаров?

Метка - "Вывести внешний фильтр" так и не работает - просто пустой блок - никаких тегов от шаблона не выводит.

И судя по коду вставки самой формы - таких эксплойдов не мало - как программист их размещал?
« Последнее редактирование: 09 ноября 2017, 17:54:17 от rsr-internet »

Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #9 : 10 ноября 2017, 09:24:36 »
В итоге нет готового модуля - вывод фильтра товаров?
Что-то нужно доделывать в коде модуля каталог.

Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 469
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #10 : 10 ноября 2017, 09:47:30 »
Ничего не надо доделывать :)

Шаблон формы фильтра вписываем в список товаров. Прямо в код. Напрямую.
В каталоге есть метод "Вывести фильтр" - это для внутреннего фильтра. Если к примеру вам надо отобразить те же распродажные товары. Потому что он в метку выводит сразу результат работы фильтра (в шаблоне вывода, определяемый самим фильтром).

Оффлайн rsr-internet

  • RodSteR\RSR\R2S\@=
  • Местный лис
  • ***
  • Сообщений: 206
  • Авторитет: 5
  • Пол: Мужской
  • RodSteR\RSR\R2S\@=
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #11 : 16 ноября 2017, 16:04:43 »
Ничего не надо доделывать :)

Шаблон формы фильтра вписываем в список товаров. Прямо в код. Напрямую.
В каталоге есть метод "Вывести фильтр" - это для внутреннего фильтра. Если к примеру вам надо отобразить те же распродажные товары. Потому что он в метку выводит сразу результат работы фильтра (в шаблоне вывода, определяемый самим фильтром).

Я не знаю - может уже обсуждалось когда-то - но к чему относятся эти метки из примера кода выше: [@function-v_request(cid ||| 0)], [@function-v_get_brandList()], [@function-v_selected_print(base_voltage ;;||;; 220)]?


Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 469
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #12 : 20 ноября 2017, 11:34:04 »
Это т.н. пользовательские функции. Нужны для того, чтобы вызвать из шаблона пхп-код (не из метки, а прямо из шаблона) и вернуть результат прямо в шаблон.

Оффлайн DET

  • Местный лис
  • ***
  • Сообщений: 167
  • Авторитет: 4
  • Пол: Мужской
  • DET
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #13 : 08 мая 2018, 13:30:33 »
Подскажите как сделать . Стоит у меня фильтр
true
REMOVE_NOT_SET[ AND `items`.`Filial_rajonov`='param[Filial_rajonov]'] - ( фильтрует по филиалам ) . Но проблема в том что не могу сделать Порядок сортировки   1 потом 2 потом 3 и т.д.

Оффлайн Nikodim

  • Опытный лис
  • ****
  • Сообщений: 310
  • Авторитет: 35
  • Пол: Мужской
    • Просмотр профиля
Re: Фильтр товаров
« Ответ #14 : 08 мая 2018, 16:21:42 »
следом строчку
order by Filial_rajonov asc или desc

но если это не цифровое значение, может бардак быть )