Форум русской поддержки Joomla!® CMS
10.12.2016, 22:30:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 4696 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Delfi
Осваиваюсь на форуме
***

Репутация: +13/-0
Offline Offline

Сообщений: 53


« : 24.01.2013, 08:26:40 »

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

[вложение удалено Администратором]
« Последнее редактирование: 24.01.2013, 11:07:54 от Delfi » Записан
 
Oleg24
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 45



« Ответ #1 : 04.02.2013, 13:31:09 »

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

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

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

Сюда бы еще сортировку прикрутитьAzn
« Последнее редактирование: 04.02.2013, 14:08:26 от Oleg24 » Записан
Oleg24
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 45



« Ответ #2 : 10.02.2013, 21:21:24 »

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

Репутация: +13/-0
Offline Offline

Сообщений: 53


« Ответ #3 : 11.02.2013, 12:29:51 »

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

Это уже куда более сложная система, в платных решениях наверняка есть. Заказчик был доволен тем, что сделано Azn
Записан
Oleg24
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 45



« Ответ #4 : 11.02.2013, 17:15:34 »

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

В любом случае, спасибо за Ваше решение! Azn
Записан
code.secret
Осваиваюсь на форуме
***

Репутация: +3/-0
Offline Offline

Пол: Мужской
Сообщений: 59



« Ответ #5 : 25.02.2013, 13:58:44 »

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

UPD: вопрос решил изменением характеристики в тип текстового поля. Возник вопрос: можно ли вывести кнопку сброса фильтра?
« Последнее редактирование: 25.02.2013, 14:38:30 от code.secret » Записан
nevigen
Moderator
*****

Репутация: +734/-16
Offline Offline

Пол: Мужской
Сообщений: 8810


http://n*****n.com


« Ответ #6 : 26.02.2013, 09:32:27 »

Ответ: Можно, разрешаю.
Записан
RTEagle
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 95



« Ответ #7 : 28.02.2013, 15:02:58 »

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

Что собственно происходит. Если товаров в категории достаточно много и они разбиваются пагинацией, то фильтр работает некорректно.
При переходе на вторую страницу в адресной строке как и положено добавляется ?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 ошибка.
Записан
nevigen
Moderator
*****

Репутация: +734/-16
Offline Offline

Пол: Мужской
Сообщений: 8810


http://n*****n.com


« Ответ #8 : 28.02.2013, 15:13:46 »

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

Репутация: +23/-0
Offline Offline

Пол: Мужской
Сообщений: 270


« Ответ #9 : 01.03.2013, 13:06:35 »

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

Репутация: +7/-0
Offline Offline

Пол: Мужской
Сообщений: 217


Все просто если по очереди)


« Ответ #10 : 05.03.2013, 16:47:32 »

Спасибо! очень помогло. немного кое-что подправил и на 3.13.2 пошло!
Записан
orexov_m
Давно я тут
****

Репутация: +23/-0
Offline Offline

Пол: Мужской
Сообщений: 270


« Ответ #11 : 05.03.2013, 17:08:10 »

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

Репутация: +0/-0
Offline Offline

Сообщений: 37


« Ответ #12 : 17.11.2013, 21:05:27 »

В поиске по диапазону (характеристика) не сохраняются введенные значения после нажатия кнопки поиска, например в диапазоне цен введеные значения сохранятся.
Код:
<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
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 95



« Ответ #13 : 06.02.2014, 16:51:57 »

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

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

Есть производители, а есть характеристики. И те и те выводятся в фильтре. Но если поставить галочку на производителя она не скидывается при переходе по старницам пагинации или при переходе в другие разделы сайта, а галочка с характеристик каждый раз сбрасывается если перейти на страницу.
В чём отличие? И как мне сделать так, чтобы у характеристик выбор пользователя также сохранялся и можно было спокойно кликать по страницам пагинации?
Записан
volenarg
Новичок
*

Репутация: +1/-0
Offline Offline

Сообщений: 1


« Ответ #14 : 04.04.2014, 00:27:14 »

видимо, автор позабыл
в файле 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());
Записан
capauih
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 6


« Ответ #15 : 25.01.2016, 00:12:32 »

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

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

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

Код
<div class="jshop_filters">
   <!--Test comment-->
  <form action="<?php print $_SERVER['REQUEST_URI'];?>" method="post" name="jshop_filters">
 

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

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

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #16 : 25.01.2016, 01:17:32 »

Подозреваю что у Joomla есть какой то неизвестный мне кэш.
это в смысле известный кеш /administrator/index.php?option=com_cache вы уже очистили, но изменений нет?
Записан
capauih
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 6


« Ответ #17 : 25.01.2016, 16:06:39 »

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


Записан
nevigen
Moderator
*****

Репутация: +734/-16
Offline Offline

Пол: Мужской
Сообщений: 8810


http://n*****n.com


« Ответ #18 : 25.01.2016, 16:09:29 »

в HTML папке шаблона Joomla не переопределен модуль фильтра?
Записан
capauih
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 6


« Ответ #19 : 25.01.2016, 17:05:35 »

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

Нет, не переопределен.
Записан
nevigen
Moderator
*****

Репутация: +734/-16
Offline Offline

Пол: Мужской
Сообщений: 8810


http://n*****n.com


« Ответ #20 : 25.01.2016, 17:19:20 »

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

и лучше ссылочку давать на сайт
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #21 : 25.01.2016, 17:23:24 »

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

Репутация: +0/-0
Offline Offline

Сообщений: 6


« Ответ #22 : 25.01.2016, 18:29:27 »

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

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

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


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

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

Репутация: +0/-0
Offline Offline

Сообщений: 6


« Ответ #23 : 27.01.2016, 12:46:16 »

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

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #24 : 27.01.2016, 13:20:13 »

т.е. нет апача, только нгинкс? или как такое получилось не могу понять?
Записан
capauih
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 6


« Ответ #25 : 27.01.2016, 18:10:56 »

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

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #26 : 27.01.2016, 19:13:07 »

аа, все ясно теперь
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet