По голосованию понял, что кому-нибудь, да интересен этот вопрос.
http://joomlaforum.ru/index.php?topic=242603.new;topicseen.
Делал все для Joomla 2.5.7 + JS 3.12.2
Итак, по порядку. Преобразование в селект делается модификацией модуля, остальные правки требуют изменений в ядре магазина, т.к. в модуле идет обращение к функциям самого магазина. И для фильтра по диапазону делаем текстовое поле, куда вводим только цифры. Товары с текстом в этом поле будут игнорироваться.
Будем считать, что модуль фильтра установлен. Для того, чтобы гарантировать, что при обновлении часть изменений не перезапишется обновленными файлами, вынесем файл шаблона фильтра в свой основной шаблон Joomla.
Для этого копируем файл
/modules/mod_jshopping_filters/tmpl/default.php в
/templates/{имя вашего шаблона}/html/mod_jshopping_filters/default.php. Т.е. теперь модуль будет брать свой layout с из нашего шаблона, а не из самого модуля. Советую, кстати, делать со всеми layout, которые изменяете. Меньше проблем будет с обновлением.
Так же подготовим настройки модуля, чтобы сделать более универсальный способ включения/выключения преобразования поиска. Результат можно увидеть на приложенной картинке.
Открываем
/modules/mod_jshopping_filters/mod_jshopping_filters.xml и после вот этого кода
<field
name="moduleclass_sfx"
type="text"
label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC" />
добавляем следующее
<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Находим строчку
<?php if ($show_prices){?>
<span class="filter_price"><?php print JText::_('PRICE')?>:<br/>
<span class="box_price_from"><?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 class="box_price_to"><?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" class="button" value="<?php print JText::_('GO')?>">
<span class="clear_filter"><a href="#" onclick="modFilterclearPriceFilter();return false;"><?php print JText::_('RESET FILTER')?></a></span>
<?php }?>
и до тега </form> заменяем весь код на
<?php
//Считываем параметры
$selectsparam = $params->get('select', 999);
$range = $params->get('range', 999);
?>
<?php if($params->get('show_name_search', 0)) {
//Поиск по имени
?>
<div class="item_name">
<div class="characteristic_name">Название</div>
<input type="text" class="fw" name="name_search" id="" value="<?php echo htmlspecialchars($_POST['name_search']); ?>" />
</div>
<?php } ?>
<?php if (is_array($characteristic_displayfields) && count($characteristic_displayfields)){?>
<div class="filter_characteristic">
<?php foreach($characteristic_displayfields as $ch_id){
if (is_array($characteristic_fieldvalues[$ch_id])){ ?>
<div class="characteristic_name"><?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 class="range">
от <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 } ?>
Теперь открываем
/components/com_jshopping/lib/jtableauto.phpПосле
if ($type!="vendor" && is_array($filters['vendors']) && count($filters['vendors'])){
$adv_query .= " AND prod.vendor_id in (".implode(",",$filters['vendors']).")";
}
Добавляем
if(isset($filters['name_search']) && !empty($filters['name_search'])) {
$adv_query .= " AND prod.`name_ru-RU` like \"%".trim($filters['name_search'])."%\"";
}
Эти мы добавили в SQL запрос поиск по названию. Учтите, если язык отличен от русского, то нужно модифицировать запрос. Это я оставлю на ваши плечи.
И сразу же после предыдущего кода добавим
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.
После
$fprice_from = $mainframe->getUserStateFromRequest( $contextfilter.'fprice_from', 'fprice_from');
$fprice_from = saveAsPrice($fprice_from);
Добавляем
$extra_fields_ft = $mainframe->getUserStateFromRequest( $contextfilter.'extra_fields_ft', 'extra_fields_ft', array());
$name_search = JRequest::getString('name_search');
После
$filters['vendors'] = $vendors;
Добавляем
$filters['name_search'] = $name_search;
$filters['extra_fields_ft'] = $extra_fields_ft;
Вроде ничего не забыл. Если что-то не заработает - пишите
Вкратце, что сделали:
1. В шаблоне фильтра добавили условия, по которым у нас выводятся селекты, форма поиска по имени, вывод двух полей для поиска по диапазону (кстати, можно подключить плагин слайдера)
2. В функциях добавили считывание новых переменных, которые передаются из фильтра
3. В sql запрос добавили поиск по имени и диапазону
[вложение удалено Администратором]