Поиск по диапазону, названию товара, преобразование чекбоксов в селект в стандартном модуле фильтра

  • 26 Ответов
  • 5081 Просмотров

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

*

Оффлайн Delfi

По голосованию понял, что кому-нибудь, да интересен этот вопрос.
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_idexplode(',',$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_idexplode(',',$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 запрос добавили поиск по имени и диапазону

[вложение удалено Администратором]
« Последнее редактирование: 24.01.2013, 13:07:54 от Delfi »

*

Оффлайн Oleg24

Delfi, спасибо большое! Отличное решение!

Единственный вопрос, в селектах характеристик появились знаки вопроса, я так понимаю это добавлены характеристики все и нужно поменять кодировку? В каком файле ее поменять?

Все разобрался! default.php нужно пересохранить! Отличное решение:)

Сюда бы еще сортировку прикрутить:)
« Последнее редактирование: 04.02.2013, 16:08:26 от Oleg24 »

*

Оффлайн Oleg24

Delfi, а еще подскажите, как сделать так, чтобы при выборе одной характеристики в первом селекте, во втором оставались только те характеристики, которые присутствуют с выбранным значением первого селекта?

*

Оффлайн Delfi

Delfi, а еще подскажите, как сделать так, чтобы при выборе одной характеристики в первом селекте, во втором оставались только те характеристики, которые присутствуют с выбранным значением первого селекта?

Это уже куда более сложная система, в платных решениях наверняка есть. Заказчик был доволен тем, что сделано :)

*

Оффлайн Oleg24

Ясно! Всегда хочется чего-то большего:)

В любом случае, спасибо за Ваше решение! :)

Не работает поиск по диапазону. Точнее работает, то неправильно. Вот длина товара 175:
я задаю запрос от 0 до 999 - товар выводится, от 142 до 175 - товар выводится, а уже от 143 до 175 - товар не выводится. Если увеличивать "от", то товар не выводится. В чем может быть проблема?

UPD: вопрос решил изменением характеристики в тип текстового поля. Возник вопрос: можно ли вывести кнопку сброса фильтра?
« Последнее редактирование: 25.02.2013, 16:38:30 от code.secret »
Дорогу осилит идущий!

*

Оффлайн nevigen

  • *****
  • 8831
  • [+]771 / [-]17
  • http://n*****n.com
    • Просмотр профиля
    • Nevigen.com -разработки для Joomla
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !

*

Оффлайн RTEagle

Не могу понять с чем связана ошибка. С магазином, со стандартным модулем фильтра или с данной модификацией?

Что собственно происходит. Если товаров в категории достаточно много и они разбиваются пагинацией, то фильтр работает некорректно.
При переходе на вторую страницу в адресной строке как и положено добавляется ?start=x
Далее если воспользоваться фильтром (отфильтровать поставив галочку на характеристику) есть вероятность попасть на 404 страницу.
Видимо дело в том, что товаров после фильтрации уже не хватает по количеству на две страницы, а ?start=x не очищается.

Joomla 2.5.9
JoomShopping 3.13.2
Использую стандартный модуль mod_jshopping_filters не изменённый для поиска даже. Я сделал его только чтобы работал вывод в селект.
Но конкретно для этой страницы даже не воспользовался этой функцией. То есть по идее стандартный функционал.

Для наглядности пример: http://www.avto-hol.ru/demo/avto-oborudovanie/parktroniki.html
Если поставить галочку на 6 датчиков на первой странце - работает, если на второй - 404 ошибка.
skype: rteagle
+7 926 378 72 95

*

Оффлайн nevigen

  • *****
  • 8831
  • [+]771 / [-]17
  • http://n*****n.com
    • Просмотр профиля
    • Nevigen.com -разработки для Joomla
пагинация это ...... в Joomla..
имен потому нет AJAX обновления страницы со списком товаров в нашем фильтре...
эти грабли уже не 1-у лоб расшибли...
так что... врядли будет решение. выводите все товары на 1 странице :)
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !

*

Оффлайн orexov_m

а никто не обращал внимания, что если при поиске по диапазону ввести данные подобрать товар, затем уйти в другую категорию. И после этого вернуться в категорию где осуществлялся подбор, то увидим те же товары из подбора. То есть фильтр как бы не обнуляется при уходе из категории. Чтобы увидеть все товары категории надо в незаполненом фильтре нажать кнопку найти.
Как с этим бороться?

*

Оффлайн back

  • ****
  • 217
  • [+]7 / [-]0
  • Все просто если по очереди)
    • Просмотр профиля
Спасибо! очень помогло. немного кое-что подправил и на 3.13.2 пошло!
Я не волшебник - я только учусь

*

Оффлайн orexov_m

Спасибо! очень помогло. немного кое-что подправил и на 3.13.2 пошло!
подскажите что поправили, возможно у меня из-за этого и есть глюк с тем что данные не обнуляются при переходе в другую категорию и последующем возврате в категорию где был подбор.

*

Оффлайн Sergun42

В поиске по диапазону (характеристика) не сохраняются введенные значения после нажатия кнопки поиска, например в диапазоне цен введеные значения сохранятся.
<div class="characteristic_name"><?php echo $characteristic_fields[$ch_id]->name;?></div>
<div class="range">
от <input type="text" name="extra_fields_ft[<?php print $ch_id?>][from]" id="3" 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="3" value="<?php if(isset($extra_fields_ft_active[$ch_id]['to'])) echo $extra_fields_ft_active[$ch_id]['to'];?>" />
</div>


Как сделать, чтобы введеные значения сохранялись после нажатия кнопки поиска?

*

Оффлайн RTEagle

пагинация это ...... в Joomla..
имен потому нет AJAX обновления страницы со списком товаров в нашем фильтре...
эти грабли уже не 1-у лоб расшибли...
так что... врядли будет решение. выводите все товары на 1 странице :)

Возвращаюсь к этому вопросу спустя много времени.
Вопрос немного меняю.

Есть производители, а есть характеристики. И те и те выводятся в фильтре. Но если поставить галочку на производителя она не скидывается при переходе по старницам пагинации или при переходе в другие разделы сайта, а галочка с характеристик каждый раз сбрасывается если перейти на страницу.
В чём отличие? И как мне сделать так, чтобы у характеристик выбор пользователя также сохранялся и можно было спокойно кликать по страницам пагинации?
skype: rteagle
+7 926 378 72 95

видимо, автор позабыл
в файле modules\mod_jshopping_filters\mod_jshopping_filters.php
после
$extra_fields_active = $mainframe->getUserStateFromRequest($contextfilter.'extra_fields', 'extra_fields', array());
$extra_fields_active = filterAllowValue($extra_fields_active, "array_int_k_v+");
надо добавить
$extra_fields_ft_active = $mainframe->getUserStateFromRequest($contextfilter.'extra_fields_ft', 'extra_fields_ft', array());

Доброго времени суток.

Я новичек в Joomla (Joomla! 2.5.4) и в PHP, но не в программировании.

Пытаюсь помочь товарищам с добавлением предложенное автором решения, уперся в непреодолимую проблему.
После долгого дебага выяснил, что  изменения который я вношу в файле не отображаются в HTML отрендереной страницы. К примеру я добавляю комментарий в файл /modules/mod_jshopping_filters/tmpl/default.php вот так вот:

Код: (php) [Выделить]
<div class="jshop_filters">
    <!--Test comment-->
   <form action="<?php print $_SERVER['REQUEST_URI'];?>" method="post" name="jshop_filters">

и соответственно ожидаю увидеть HTML комментарий на странице где добавлен данный фильтр. Но его нет!
Подозреваю что у Joomla есть какой то неизвестный мне кэш. Я пробовал прогуглить проблему, но видимо из-за малого опыта так и не нашел как очистить или же отключить этот кэш.

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

*

Оффлайн dmitry_stas

Подозреваю что у Joomla есть какой то неизвестный мне кэш.
это в смысле известный кеш /administrator/index.php?option=com_cache вы уже очистили, но изменений нет?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций

Ну на сколько я понимаю, это вид кэша в моем случае отключен:



*

Оффлайн nevigen

  • *****
  • 8831
  • [+]771 / [-]17
  • http://n*****n.com
    • Просмотр профиля
    • Nevigen.com -разработки для Joomla
в HTML папке шаблона Joomla не переопределен модуль фильтра?
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !

в HTML папке шаблона Joomla не переопределен модуль фильтра?

Нет, не переопределен.

*

Оффлайн nevigen

  • *****
  • 8831
  • [+]771 / [-]17
  • http://n*****n.com
    • Просмотр профиля
    • Nevigen.com -разработки для Joomla
ну по настройкам отключено кеширование Joomla.
а могут быть браузер и плагины специальные и т.д.
попробуйте очистить кеш принудительно в браузере для начала ктрл+ф5

и лучше ссылочку давать на сайт
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !

*

Оффлайн dmitry_stas

похоже что стоит какой то дополнительный кеш, например JotCache любят.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций

ну по настройкам отключено кеширование Joomla.
а могут быть браузер и плагины специальные и т.д.
попробуйте очистить кеш принудительно в браузере для начала ктрл+ф5

и лучше ссылочку давать на сайт

Это не кэш браузера, его я очистил в первую очередь. А вот про плагины расскажите пожалуйста по подробнее. Как я понимаю вы говорите про Joomla плагины. Я  пробежался по плагинам, нашел плагин "Система - Кэш". Но он выключен.


похоже что стоит какой то дополнительный кеш, например JotCache любят.

JotCache не нашел в проекте. По постараюсь погуглить на предмет всевозможных кэшей. Спасибо. 

В итоге оказалось что дело было в nginx, точнее в том что вместо nginx конфигурационного файла был .htaccess . И nginx читал .php только один раз :( ...
Всем спасибо за помощь.

*

Оффлайн dmitry_stas

т.е. нет апача, только нгинкс? или как такое получилось не могу понять?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций

Мои товарищи, для который я прикручиваю mod_jshopping_filters, купили готовый интернет-магазин, и заплатили кому-то за размещение его у себе на ферме, где крутятся другие сайты/магазины. Ферма использует nginx а купленный интернет-магазин юзал apache на старом хостинге. При переносе .htaccess не был заменен на nginx конфигурационный файл.

*

Оффлайн dmitry_stas

Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций