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

Igorenia

  • Захожу иногда
  • 156
  • 6 / 0
Нашел замечательную заметку о том, как прикрутить ползунок цены к стандартному модулю фильтра 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
  • 10436
  • 863 / 25
  • http://n*****n.com
суть поста ?
вопрос ?
готовое решение ?
или тупо твитер, я делал... ?
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !
*

Igorenia

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

Igorenia

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

  • Легенда
  • 13151
  • 1234 / 8
Цитировать
Единственный вопрос остался
далеко не единственный :)

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

Igorenia

  • Захожу иногда
  • 156
  • 6 / 0
далеко не единственный :)

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

dmitry_stas

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

Igorenia

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

nevigen

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

dmitry_stas

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

Igorenia

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

nevigen

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

Igorenia

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

12mv

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

olf

  • Захожу иногда
  • 360
  • 5 / 1
Решил поделиться своим решением на базе скрипта 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

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

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

x-masters

  • Захожу иногда
  • 80
  • 0 / 0
   $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

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

mills

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Нашел, извиняюсь за сообщение!
*

olf

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

Argawa

  • Захожу иногда
  • 139
  • 1 / 0
Фильтр будет высвечиваться только в конечных категориях с товарами.
Я предполагаю порядок действий такой:
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 / 0
Цитировать
Код самого слайдера:
Спойлер
[свернуть]
Посмотреть фильтр можно тут и тут.


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

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

vsv21

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

vsv21

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
С ползунком разобрался)
*

vsv21

  • Осваиваюсь на форуме
  • 11
  • 0 / 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, 13:10:29 от vsv21 »
*

Hvaekar

  • Осваиваюсь на форуме
  • 27
  • 0 / 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 ($). Как исправить не знаю.
Кто знает - поделитесь решением, пожалуйста! Спасибо.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться