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

  • 25 Ответов
  • 4849 Просмотров

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

*

Igorenia

  • ***
  • 156
  • 6
Нашел замечательную заметку о том, как прикрутить ползунок цены к стандартному модулю фильтра 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

  • *****
  • 8832
  • 754
  • http://n*****n.com
суть поста ?
вопрос ?
готовое решение ?
или тупо твитер, я делал... ?
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !

*

Igorenia

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

*

Igorenia

  • ***
  • 156
  • 6
Фильтр будет высвечиваться только в конечных категориях с товарами.
Я предполагаю порядок действий такой:
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, 23:40:05 от Igorenia »

*

dmitry_stas

  • ********
  • 9651
  • 929
Цитировать
Единственный вопрос остался
далеко не единственный :)

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

*

Igorenia

  • ***
  • 156
  • 6
далеко не единственный :)

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

*

dmitry_stas

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

*

Igorenia

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

*

nevigen

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

*

dmitry_stas

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

*

Igorenia

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

*

nevigen

  • *****
  • 8832
  • 754
  • http://n*****n.com
нууув от двигаешь его
оно перегружает
потом двигаешь дальше и полоса просто по высоте уменьшается до 0 :)
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !

*

Igorenia

  • ***
  • 156
  • 6
нууув от двигаешь его
оно перегружает
потом двигаешь дальше и полоса просто по высоте уменьшается до 0 :)
Блин, точно. А почему она уменьшается я не знаю :(

*

12mv

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

*

olf

  • ****
  • 345
  • 4
Решил поделиться своим решением на базе скрипта 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>
У меня работает...
PHP код по-русски: если не то {} то это {}

*

ksena

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

На Version 4.2.2 пробовала, не выводит вообще ползунок. Может быть кто знает как сделать, очень уж хочется ползунок.

   $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

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

*

mills

  • ***
  • 26
  • 0
Нашел, извиняюсь за сообщение!

*

olf

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

*

Argawa

  • ***
  • 78
  • 1
Фильтр будет высвечиваться только в конечных категориях с товарами.
Я предполагаю порядок действий такой:
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

  • **
  • 11
  • 0
Цитировать
Код самого слайдера:
Спойлер
[свернуть]
Посмотреть фильтр можно тут и тут.


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

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

*

vsv21

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

*

vsv21

  • **
  • 11
  • 0
С ползунком разобрался)

*

vsv21

  • **
  • 11
  • 0
Все красиво работает, только вот вопрос, каким образом убрать в конце 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, 15:10:29 от vsv21 »

*

Hvaekar

  • **
  • 24
  • 0
Хотел вывести минимальную и максимальную цену в категории. Делал по принципу, описанному форумчанином 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 ($). Как исправить не знаю.
Кто знает - поделитесь решением, пожалуйста! Спасибо.