Поиск по диапазону, названию товара, преобразование чекбоксов в селект в стандартном модуле фильтра mod_jshopping_filters
Делал все для Joomla 2.5.7 + JS 3.12.2
Итак, по порядку. Преобразование в селект делается модификацией модуля, остальные правки требуют изменений в ядре магазина, т.к. в модуле идет обращение к функциям самого магазина. И для фильтра по диапазону делаем текстовое поле, куда вводим только цифры. Товары с текстом в этом поле будут игнорироваться.
Для того, чтобы гарантировать, что при обновлении часть изменений не перезапишется обновленными файлами, вынесем файл шаблона фильтра в свой основной шаблон Joomla.
Будем считать, что модуль фильтра установлен.
Для этого копируем файл /modules/mod_jshopping_filters/tmpl/default.php в /templates/{имя вашего шаблона}/html/mod_jshopping_filters/default.php.
Т.е. теперь модуль будет брать свой layout с из нашего шаблона, а не из самого модуля.
Более подробно можно почитать в официальной документации
Так же подготовим настройки модуля, чтобы сделать более универсальный способ включения/выключения преобразования поиска. После изменений получим такую картину в настройках:
Открываем /modules/mod_jshopping_filters/mod_jshopping_filters.xml и после вот этого кода
1 2 3 4 5 | <field name="moduleclass_sfx" type="text" label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL" description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC" /> |
добавляем следующее
1 2 3 4 5 6 7 8 9 10 11 | <field name="show_name_search" type="radio" default="0" label="Поиск по названию"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="show_search_button" type="radio" default="0" label="Кнопка поиска"> <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="select" type="text" label="id характеристик в select через запятую" description="" /> <field name="range" type="text" label="id характеристик в диапазон через запятую" description="" /> <field name="btn_text" type="text" label="текст на кнопке" default="Поиск" description="" /> |
Путем этих изменений мы добавили 5 настроек. Теперь добавим функционал Для начала будем редактировать файл /templates/{имя вашего шаблона}/html/mod_jshopping_filters/default.php Находим строчку
1 2 3 4 5 6 7 8 9 | <?php if ($show_prices){?> <span><?php print JText::_('PRICE')?>:<br/> <span><?php print JText::_('FROM')?> <input type = "text" class = "inputbox" name = "fprice_from" id="fprice_from" size="7" value="<?php if ($fprice_from>0) print $fprice_from?>" /></span> <span><?php print JText::_('TO')?> <input type = "text" class = "inputbox" name = "fprice_to" id="fprice_to" size="7" value="<?php if ($fprice_to>0) print $fprice_to?>" /></span> <?php print $jshopConfig->currency_code?> </span> <input type="submit" value="<?php print JText::_('GO')?>"> <span><a href="#" onclick="modFilterclearPriceFilter();return false;"><?php print JText::_('RESET FILTER')?></a></span> <?php }?> |
и до тега </form> заменяем весь код на
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <?php /* Считываем параметры */ $selectsparam = $params->get('select', 999); $range = $params->get('range', 999); ?> <?php if($params->get('show_name_search', 0)){ //Поиск по имени ?> <div> <div>Название</div> <input type="text" name="name_search" id="" value="<?php echo htmlspecialchars($_POST['name_search']); ?>" /> </div> <?php } ?> <?php if(is_array($characteristic_displayfields) && count($characteristic_displayfields)){ ?> <div> <?php foreach($characteristic_displayfields as $ch_id){ if(is_array($characteristic_fieldvalues[$ch_id])){ ?> <div><?php echo $characteristic_fields[$ch_id]->name;?></div> <?php /*Первое условие, где преобразуем в select. Все просто - преобразуем строку из параметров в массив, разбив ее по знаку запятой и затем смотрим, есть ли в этом списке текущий выводимый элемент */ if(in_array($ch_id, explode(',', $selectsparam))){ ?> <select name="extra_fields[<?php print $ch_id?>][]" id="genre" onchange="document.jshop_filters.submit();"> <!-- Первая опция, чтобы пользователь мог сбросить этот фильтр --> <option value="0">выбирите из списка</option> <?php foreach($characteristic_fieldvalues[$ch_id] as $val_id=> $val_name){ ?> <option value="<?php print $val_id;?>" <?php if(is_array($extra_fields_active[$ch_id]) && in_array($val_id, $extra_fields_active[$ch_id])) print "selected";?> /> <?php print $val_name;?></option> <?php }?> </select> <?php /* Тут мы делаем ту же операцию, только с параметром поиска по диапазону. Работать пока не будет без изменений в ядре компонента */ } elseif(in_array($ch_id, explode(',', $range))) { ?> <div> от <input type="text" name="extra_fields_ft[<?php print $ch_id?>][from]" id="" value="<?php if(isset($extra_fields_ft_active[$ch_id]['from'])) echo $extra_fields_ft_active[$ch_id]['from'];?>" /> до <input type="text" name="extra_fields_ft[<?php print $ch_id?>][to]" id="" value="<?php if(isset($extra_fields_ft_active[$ch_id]['to'])) echo $extra_fields_ft_active[$ch_id]['to'];?>" /> </div> <?php /* В противном случае выводим обычные чекбоксы */ } else { ?> <input type="hidden" name="extra_fields[<?php print $ch_id?>][]" value="0" /> <?php foreach($characteristic_fieldvalues[$ch_id] as $val_id=> $val_name){ ?> <input type="checkbox" name="extra_fields[<?php print $ch_id?>][]" value="<?php print $val_id;?>" <?php if(is_array($extra_fields_active[$ch_id]) && in_array($val_id, $extra_fields_active[$ch_id])) print "checked";?> onclick="document.jshop_filters.submit();" /> <?php print $val_name; ?><br /> <?php } ?> <?php } }?> <?php }?> </div> <?php } /*Тут смотрим - надо ли выводить кнопку поиска и какой текст на ней будет. Если текст не указали - просто пишет на кнопке слово "Поиск" */ if($params->get('show_search_button')){ ?><br /> <button onclick="document.jshop_filters.submit();"><?php echo $params->get("btn_text", "Поиск"); ?></button> <?php } ?> |
После
1 2 3 | if ($type!="vendor" && is_array($filters['vendors']) && count($filters['vendors'])){ $adv_query .= " AND prod.vendor_id in (".implode(",",$filters['vendors']).")"; } |
Добавляем
1 2 3 | if(isset($filters['name_search']) && !empty($filters['name_search'])) { $adv_query .= " AND prod.`name_ru-RU` like \"%".trim($filters['name_search'])."%\""; } |
Этим мы добавили в SQL запрос поиск по названию. Учтите, если язык отличен от русского, то нужно модифицировать запрос. Это я оставлю на ваши плечи.
И сразу же после предыдущего кода добавим
1 2 3 4 5 6 7 8 9 10 11 12 | if(is_array($filters['extra_fields_ft'])){ foreach($filters['extra_fields_ft'] as $id=> $v){ if(isset($v["from"]) && $v['from'] > 0){ $from = (int) $db->escape($v['from']); $adv_query .= " AND prod.`extra_field_" . $id . "` >= " . $from; } if(isset($v["to"]) && $v['to'] > 0){ $to = (int) $db->escape($v['to']); $adv_query .= " AND prod.`extra_field_" . $id . "` <= " . $to; } } } |
Здесь мы производим обработку диапазонных значений. Обрабатываться будет даже если мы введем только минимальное или максимальное значение.
Как видно по условиям — в расчет берем только положительные числа. Можете поправить под себя.
Так как мы добавили новый параметр extra_fields_ft и name_search, нам надо добавить его в функции.
Открываем components/com_jshopping/lib/functions.php. Ищем функцию getBuildFilterListProduct.
После
1 2 | $fprice_from = $mainframe->getUserStateFromRequest( $contextfilter.'fprice_from', 'fprice_from'); $fprice_from = saveAsPrice($fprice_from); |
Добавляем
1 2 | $extra_fields_ft = $mainframe->getUserStateFromRequest( $contextfilter.'extra_fields_ft', 'extra_fields_ft', array()); $name_search = JRequest::getString('name_search'); |
После
1 | $filters['vendors'] = $vendors; |
Добавляем
1 2 | $filters['name_search'] = $name_search; $filters['extra_fields_ft'] = $extra_fields_ft; |
Вроде ничего не забыл. Если что-то не заработает — пишите
Вкратце, что сделали:
1. В шаблоне фильтра добавили условия, по которым у нас выводятся селекты, форма поиска по имени, вывод двух полей для поиска по диапазону (кстати, можно подключить плагин слайдера)
2. В функциях добавили считывание новых переменных, которые передаются из фильтра
3. В sql запрос добавили поиск по имени и диапазону
Результат можете увидеть:
Комментарии к Поиск по диапазону, названию товара, преобразование чекбоксов в селект в стандартном модуле фильтра mod_jshopping_filters (2)
Ksenia
Подскажите как сделать наоборот: селект в чекбоксы в списке производителей?
Delfi Post author
Ксения, увы, уже давно не использую JoomShopping и под рукой нет тестового сайта, чтобы посмотреть по коду. Можете попробовать спросить на форуме http://joomlaforum.ru/index.php?topic=247124.0 , я там размещал такую же статью и там достаточно людей, которые смогут подсказать.