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

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

Ползунок цены для модуля фильтра JoomShopping

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

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

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


« : 05.09.2013, 17:13:51 »

Нашел замечательную заметку о том, как прикрутить ползунок цены к стандартному модулю фильтра JoomShopping.
Единственный недостаток - левая и правая границы диапазонов задаются статически из переменных:
Код:
min: 0,
max: 20000,
Решил немного переделать, чтобы левая граница диапазона равнялась минимальной цене товара в данной категории, а правая - максимальной. Прописал переменные вот так:
Код:
min: <?php echo $min ?>,
max: <?php echo $max ?>,
Теперь пытаюсь вычислить минимальную и максимальную цены, но знания PHP не позволяют допилить до работоспособности:
Код:
<?php
$min = 20000;
$max = 1;
if (count($this->products)){
foreach($this->products as $prod){
if ($price_product > $max) {$max = $price_product;}
if ($price_product < $min) {$min = $price_product;}
}
}
?>
Записан
nevigen
Moderator
*****

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

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


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


« Ответ #1 : 05.09.2013, 21:40:11 »

суть поста ?
вопрос ?
готовое решение ?
или тупо твитер, я делал... ?
Записан
Igorenia
Осваиваюсь на форуме
***

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

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


« Ответ #2 : 05.09.2013, 23:52:25 »

Вопрос. Как получить в модуле фильтрации цены товаров, находящихся в данной категории? И как реализовать цикл с перебором этих товаров?
« Последнее редактирование: 06.09.2013, 19:30:06 от Igorenia » Записан
Igorenia
Осваиваюсь на форуме
***

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

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


« Ответ #3 : 06.09.2013, 19:29:53 »

Фильтр будет высвечиваться только в конечных категориях с товарами.
Я предполагаю порядок действий такой:
1. Получить ID данной категории.
2. Получить из таблицы "_jshopping_products_to_categories" в БД ID товаров из данной категории.
2. Взять из таблицы "_jshopping_products" БД цены опубликованных товаров с нужными ID.
3. Записать цены в массив.
4. Перебрать массив и найти min и max.
Но как это все сделать? Подскажите пожалуйста.

UP: все, вымучал, работает, вот решение:
Код:
$min = 20000;
$max = 1;
$id = $category->category_id;
mysql_connect("localhost", "user", "pass") or die("Could not connect: " . mysql_error());
mysql_select_db("zakazhi");
$result = mysql_query("SELECT product_id FROM i5z4k_jshopping_products_to_categories WHERE category_id=" . $id);
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {        
$result1 = mysql_query("SELECT product_price FROM i5z4k_jshopping_products WHERE product_id=" . $row[0] . " AND product_publish=1");
while ($row1 = mysql_fetch_array($result1, MYSQL_NUM)) {
if ($row1[0] > $max) {$max = $row1[0];}
if ($row1[0] < $min) {$min = $row1[0];}  
}
}
mysql_free_result($result);
Единственный вопрос остался - MySQL соединение закрывать нужно или и так пойдет?
« Последнее редактирование: 06.09.2013, 21:40:05 от Igorenia » Записан
dmitry_stas
Профи
********

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

Сообщений: 7743



« Ответ #4 : 06.09.2013, 22:23:24 »

Цитировать
Единственный вопрос остался
далеко не единственный Azn

начнем с того, что у Joomla есть свой класс для работы с базой данных. Использование mysql_connect и прочего идеологически неверно. Почитайте например  это
во вторых, минимальную и максимальную цену можно выбрать одним запросом. погуглите MySQL JOIN, а также MIN и MAX.
Записан
Igorenia
Осваиваюсь на форуме
***

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

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


« Ответ #5 : 06.09.2013, 22:49:49 »

далеко не единственный Azn

начнем с того, что у Joomla есть свой класс для работы с базой данных. Использование mysql_connect и прочего идеологически неверно. Почитайте например  это
во вторых, минимальную и максимальную цену можно выбрать одним запросом. погуглите MySQL JOIN, а также MIN и MAX.
Меня на это не хватит Azn А при данной реализации все таки нужно закрывать соединение?
Записан
dmitry_stas
Профи
********

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

Сообщений: 7743



« Ответ #6 : 06.09.2013, 23:05:54 »

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

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

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


« Ответ #7 : 07.09.2013, 17:13:19 »

Еще вопрос появился. Min и max цены появляются только когда двигаешь ползунки или нажимаешь кнопку "Сбросить". Как сделать, чтобы при загрузке страницы в полях "цена" - "от" и "до" уже стояли цены?
Я пробовал сделать запуск функции сброса при загрузке страницы, вот так:
Код:
window.onload = function() {modFilterclearPriceFilter()}
Но тогда страница непрерывно перезагружается, так как происходит загрузка -> вызывается функция сброса -> значения устанавливаются в min и max -> страница перезагружается -> опять вызывается функция сброса -> опять значения устанавливаются в min и max -> страница снова перезагружается, и т.д.
Функция сброса:
Показать текстовый блок
Код самого слайдера:
Показать текстовый блок
Посмотреть фильтр можно тут и тут.
Записан
nevigen
Moderator
*****

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

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


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


« Ответ #8 : 07.09.2013, 21:53:09 »

ток он почему-то пропадает.... Azn
Записан
dmitry_stas
Профи
********

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

Сообщений: 7743



« Ответ #9 : 08.09.2013, 01:47:40 »

Цитировать
Но тогда страница непрерывно перезагружается
ничего удивительного, как написали, так и работает. при загрузке страницы вызывается функция, из которой происходит отправка формы. естественно с перезагрузкой страницы. и дальше все заново.
Записан
Igorenia
Осваиваюсь на форуме
***

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

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


« Ответ #10 : 08.09.2013, 13:11:12 »

ток он почему-то пропадает.... Azn
Пропадает? А при каких действиях? У меня все работает.
ничего удивительного, как написали, так и работает. при загрузке страницы вызывается функция, из которой происходит отправка формы. естественно с перезагрузкой страницы. и дальше все заново.
А как написать, чтобы работало как нужно не подскажите?
Записан
nevigen
Moderator
*****

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

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


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


« Ответ #11 : 08.09.2013, 15:18:13 »

нууув от двигаешь его
оно перегружает
потом двигаешь дальше и полоса просто по высоте уменьшается до 0 Azn
Записан
Igorenia
Осваиваюсь на форуме
***

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

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


« Ответ #12 : 08.09.2013, 16:38:03 »

нууув от двигаешь его
оно перегружает
потом двигаешь дальше и полоса просто по высоте уменьшается до 0 Azn
Блин, точно. А почему она уменьшается я не знаю Sad
Записан
12mv
Завсегдатай
*****

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

Пол: Женский
Сообщений: 580


Гульсина


« Ответ #13 : 21.09.2013, 17:00:57 »

Я установила стандартный фильтр, но он почему то не отображается, отображается только пустой модуль с заголовком.
И ползунок не получилось прикрутить((
Записан
olf
Давно я тут
****

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

Сообщений: 333



« Ответ #14 : 15.01.2014, 11:58:37 »

Решил поделиться своим решением на базе скрипта http://egorkhmelev.github.io/jslider/. Версия компонента 3.16.1, модуля - 3.4.1:
1. Создаем папку modules/mod_jshopping_filters/javascript/. Размещаем там javascript файлы плагина.
2. Создаем папку modules/mod_jshopping_filters/css/. Размещаем там файл jslider.css плагина.
3. Создаем папку modules/mod_jshopping_filters/images/. Размещаем там спрайт-изображение плагина.
4. Подключаем скрипты и CSS в файле modules/mod_jshopping_filters/mod_jshopping_filters.php:
Код:
$doc =& JFactory::getDocument();
$doc->addScript( "../modules/mod_jshopping_filters/javascript/jshashtable.js" );
$doc->addScript( "../modules/mod_jshopping_filters/javascript/numberformatter.js" );
$doc->addScript( "../modules/mod_jshopping_filters/javascript/tmpl.js" );
$doc->addScript( "../modules/mod_jshopping_filters/javascript/dependClass.js" );
$doc->addScript( "../modules/mod_jshopping_filters/javascript/draggable.js" );
$doc->addScript( "../modules/mod_jshopping_filters/javascript/slider.js" );
$doc->addStyleSheet( "../modules/mod_jshopping_filters/css/jslider.css" );
5. Для получения минимального и максимального значения цены открываем файл components/com_jshopping/lib/functions.php и добавляем функцию:
Код:
function getCatMinMaxProductPrice($cat){
$db = &JFactory::getDBO();
$query = "SELECT max(product_price) as max_product_price, min(product_price) as min_product_price FROM `#__jshopping_products` WHERE product_id=any(SELECT product_id FROM `#__jshopping_products_to_categories` WHERE category_id = ".$cat.") and product_price>0";
$db->setQuery($query);
$max_min_Price = $db->loadAssoc();
return $max_min_Price;
}
6.В файле шаблона вывода modules/mod_jshopping_filters/tmpl/default.php добавляем:
- в начале файла:
Код:
<?php
//MinMaxProductPrice
$min_product_price = (int)$MinMaxProductPrice[min_product_price];
$max_product_price = (int)$MinMaxProductPrice[max_product_price];
?>
- меняем код:
Код:
<?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 }?>
на:
Код:
<?php if ($show_prices){?>
    <?php if ($max_product_price != 0){?>
    <div class="layout-slider">
      <input style="display: none;" id="slider" type="slider" name="price" value="<?php if ($fprice_from > 0) echo $fprice_from; elseif ($fprice_from=="") echo $min_product_price; ?>;<?php if ($fprice_to > 0) echo $fprice_to; elseif ($fprice_to=="") echo $max_product_price; ?>" />
</div>
    
    <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) echo $fprice_from; elseif ($fprice_from=="") echo $min_product_price; ?>" />
        </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) echo $fprice_to; elseif ($fprice_to=="") echo $max_product_price; ?>" />
</span>
        <?php print $jshopConfig->currency_code?>
    </span>  
    <input id = "jshop_filters" type="submit" class="button" value="<?php print JText::_('GO')?>">  
    <span class="clear_filter"><!--<a href="#" onclick="modFilterclearPriceFilter();return false;">--><a href="#" onclick="ClearFilter();"><?php print JText::_('RESET FILTER')?></a></span>
    <?php }?>
<?php }?>
В конце файла добавляем javascript:
Код:
<script type="text/javascript" charset="utf-8">

var min_product_price = <?php echo $min_product_price; ?>;
var max_product_price = <?php echo $max_product_price; ?>;

jQuery("#slider").slider({
from: <?php echo $min_product_price; ?>,
to: <?php echo $max_product_price; ?>,
step: 100,
smooth: true,
round: 0,
skin: "plastic",
onstatechange: function(value){
var values = value.split(';',2);
if (values[0] > min_product_price) {
jQuery("input#fprice_from").val(values[0]);
} else {
jQuery("input#fprice_from").val(<?php echo $min_product_price; ?>);
}
if (values[1] < max_product_price) {
jQuery("input#fprice_to").val(values[1]);
} else {
jQuery("input#fprice_to").val(<?php echo $max_product_price; ?>);
}
},
callback: function(){
jQuery("input#fprice_from").change();
}
});

function ClearFilter(){
    jQuery("#fprice_from").val("");
    jQuery("#fprice_to").val("");
    document.jshop_filters.submit();
}
</script>
У меня работает...
Записан
ksena
Осваиваюсь на форуме
***

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

Пол: Женский
Сообщений: 62



« Ответ #15 : 31.01.2014, 13:26:30 »

Решил поделиться своим решением на базе скрипта http://egorkhmelev.github.io/jslider/. Версия компонента 3.16.1, модуля - 3.4.1:

На Version 4.2.2 пробовала, не выводит вообще ползунок. Может быть кто знает как сделать, очень уж хочется ползунок.
Записан
x-masters
Осваиваюсь на форуме
***

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

Сообщений: 76


« Ответ #16 : 03.03.2014, 15:35:34 »

   $doc->addScript( "../modules/mod_jshopping_filters/javascript/jshashtable.js" );
   $doc->addScript( "../modules/mod_jshopping_filters/javascript/numberformatter.js" );
   $doc->addScript( "../modules/mod_jshopping_filters/javascript/tmpl.js" );
   $doc->addScript( "../modules/mod_jshopping_filters/javascript/dependClass.js" );
   $doc->addScript( "../modules/mod_jshopping_filters/javascript/draggable.js" );
   $doc->addScript( "../modules/mod_jshopping_filters/javascript/slider.js" );
Отталкивает количество скриптов, не хочется нагружать сайт из-за одной-то фичи... можно ли как-то сократить их количество? Мне удалось сделать ползунок на slider.js (не считая jquery и jquery-UI), но минимум и максимум выставить автоматом не удается. Можете описать их? Возможно нужны не все.
Записан
mills
Осваиваюсь на форуме
***

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

Сообщений: 26


« Ответ #17 : 24.06.2014, 08:20:28 »

Всем привет!
Возможно не туда я пишу данный вопрос.
Подскажите, пожалуйста, вот у меня в магазине,  в фильтре стандартном, даже не модуль а просто  в магазине, пишет цену ДО 1000 и больше не дает а если ползунком, то все ок. Где это исправить можно? Что бы можно было написать более 1000 а не ползунком?
спасибо!
Записан
mills
Осваиваюсь на форуме
***

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

Сообщений: 26


« Ответ #18 : 24.06.2014, 08:22:31 »

Нашел, извиняюсь за сообщение!
Записан
olf
Давно я тут
****

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

Сообщений: 333



« Ответ #19 : 24.06.2014, 10:09:52 »

Отталкивает количество скриптов, не хочется нагружать сайт из-за одной-то фичи... можно ли как-то сократить их количество? Мне удалось сделать ползунок на slider.js (не считая jquery и jquery-UI), но минимум и максимум выставить автоматом не удается. Можете описать их? Возможно нужны не все.
Я в javascript не разбираюсь. Задавал себе такой же вопрос. Но методом тыка при отключении какого-либо из этих скриптов сам js-плагин отказывался работать.
Записан
Argawa
Осваиваюсь на форуме
***

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

Сообщений: 71


« Ответ #20 : 04.12.2014, 15:23:52 »

Фильтр будет высвечиваться только в конечных категориях с товарами.
Я предполагаю порядок действий такой:
1. Получить ID данной категории.
2. Получить из таблицы "_jshopping_products_to_categories" в БД ID товаров из данной категории.
2. Взять из таблицы "_jshopping_products" БД цены опубликованных товаров с нужными ID.
3. Записать цены в массив.
4. Перебрать массив и найти min и max.
Но как это все сделать? Подскажите пожалуйста.

UP: все, вымучал, работает, вот решение:
Код:
$min = 20000;
$max = 1;
$id = $category->category_id;
mysql_connect("localhost", "user", "pass") or die("Could not connect: " . mysql_error());
mysql_select_db("zakazhi");
$result = mysql_query("SELECT product_id FROM i5z4k_jshopping_products_to_categories WHERE category_id=" . $id);
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {       
$result1 = mysql_query("SELECT product_price FROM i5z4k_jshopping_products WHERE product_id=" . $row[0] . " AND product_publish=1");
while ($row1 = mysql_fetch_array($result1, MYSQL_NUM)) {
if ($row1[0] > $max) {$max = $row1[0];}
if ($row1[0] < $min) {$min = $row1[0];} 
}
}
mysql_free_result($result);
Единственный вопрос остался - MySQL соединение закрывать нужно или и так пойдет?

Все красиво работает, только вот вопрос, каким образом убрать в конце 4 лишних нуля после запятой в ценовых диапазонах?
Записан
vsv21
Захожу иногда
**

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

Сообщений: 13


« Ответ #21 : 29.04.2015, 12:02:20 »

Цитировать
Код самого слайдера:
Показать текстовый блок
Посмотреть фильтр можно тут и тут.


Доброго времени суток, добавил данный ползунок, но он не работает.. Выдает ошибку "Uncaught TypeError: Cannot read property 'addClass' of undefined", но если в коде слайдера поставить статическое значение min и max, тогда все норм, но хочется чтобы эти значения определялись.
посмотреть можно тут
Извините за внешний вид сайта, стили еще не приводил в порядок.

Мне понравился Ваш фильтр, и хотел спросить, могли бы Вы поделиться его кодом? Буду очень признателен.
Жду Вашего ответа. Спасибо за внимание.
Записан
vsv21
Захожу иногда
**

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

Сообщений: 13


« Ответ #22 : 29.04.2015, 12:51:07 »

Нашел в чем проблема, не определяется "$id = $category->category_id;". Я не силен в php, подскажите пожалуйста как получить этот параметр?
Записан
vsv21
Захожу иногда
**

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

Сообщений: 13


« Ответ #23 : 29.04.2015, 13:50:42 »

С ползунком разобрался)
Записан
vsv21
Захожу иногда
**

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

Сообщений: 13


« Ответ #24 : 29.04.2015, 14:01:48 »

Все красиво работает, только вот вопрос, каким образом убрать в конце 4 лишних нуля после запятой в ценовых диапазонах?

Допишите в коде php:
Код:
$min = round ($min, precision, mode);
$max = round ($max, precision, mode);
после их определения.

precision - Количество десятичных знаков, до которых округлять

mode - Используйте одну из этих констант для задания способа округления:
PHP_ROUND_HALF_UP - Округляет в большую сторону от нуля до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 2 и -1.5 в -2.
PHP_ROUND_HALF_DOWN - Округляет в меньшую сторону к нулю до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 1 и -1.5 в -1.
PHP_ROUND_HALF_EVEN - Округляет до precision десятичных знаков в сторону ближайшего четного знака.
PHP_ROUND_HALF_ODD - Округляет до precision десятичных знаков в сторону ближайшего нечетного знака.
« Последнее редактирование: 29.04.2015, 14:10:29 от vsv21 » Записан
Hvaekar
Захожу иногда
**

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

Сообщений: 24


« Ответ #25 : 17.07.2015, 23:19:07 »

Хотел вывести минимальную и максимальную цену в категории. Делал по принципу, описанному форумчанином olf

Вставлял код в шаблон категории (файл category_default.php)
Код:
$cat = $cat = $this->category->category_id;
$max_min_Price = getCatMinMaxProductPrice($cat);
$min_product_price = (int)$max_min_Price[min_product_price];
$max_product_price = (int)$max_min_Price[max_product_price];
А также добавил функцию
Код:
function getCatMinMaxProductPrice($cat){
$db = &JFactory::getDBO();
$query = "SELECT max(product_price) as max_product_price, min(product_price) as min_product_price FROM `#__jshopping_products` WHERE product_id=any(SELECT product_id FROM `#__jshopping_products_to_categories` WHERE category_id = ".$cat.") and product_price>0";
$db->setQuery($query);
$max_min_Price = $db->loadAssoc();
return $max_min_Price;
}
Но здесь есть проблемка, которую я не знаю как решить, а именно: Если при добавлении товара в админке была введена сумма в $, а на сайте стоит отображение по умолчанию в грн. или руб., то $min_product_price и $max_product_price выводит число, которое было введено в админке, то есть не 16 400 (грн.), а 750 ($). Как исправить не знаю.
Кто знает - поделитесь решением, пожалуйста! Спасибо.
Записан
Страниц: [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