Перейти к содержимому


Слайдер с ползунками выбора min/max цены в штатном Фильтре товаров


  • Вы не можете ответить в тему
Сообщений в теме: 60

#1 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 February 2012 - 02:12 PM

Выбор диапазона цен в "фильтре товаров" слайдером с двумя ползунками.
Изначальные min/max-цены берутся по выбранной категории,
включая вложенные любого уровня и дополнительные категории.

1. В head.tpl.html вписываем линки на jquery-ui и css от него.
Ну и на сам jquery, если он еще не вписан:







2. в filter.tpl.html

2.1. после





вставляем:





2.2. вместо строк



{$smarty.const.STRING_PRICE_TO}
{$priceUnit}


вставляем




{$smarty.const.STRING_PRICE_TO}
{$priceUnit}



3. в advanced_search_in_category.php

вместо строк:


if ( isset($_GET["search_price_from"]) ) $smarty->assign( "search_price_from", $_GET["search_price_from"]);
if ( isset($_GET["search_price_to"]) ) $smarty->assign( "search_price_to", $_GET["search_price_to"]);


вставляем:


if (!isset($_GET["search_price_from"]) && !isset($_GET["search_price_to"]))
{
function recursiveCat($catID,$arrayID=array())
{
$data = db_query("select categoryID from ".CATEGORIES_TABLE." where PARENT=".$catID);
while ($row = db_fetch_assoc($data))
$arrayID = recursiveCat($row['categoryID'],$arrayID);
$arrayID[]=$catID;
return $arrayID;
}

$catIDs = implode(",",recursiveCat($categoryID));
$data = db_query("select min(t1.price) as min, max(t1.price) as max from ".PRODUCTS_TABLE." t1, ".CATEGORIY_PRODUCT_TABLE." t2
where t1.enabled=1 and (t2.categoryID in (".$catIDs.") and t1.productID=t2.productID
or t1.categoryID in (".$catIDs."))");
if ($row = db_fetch_assoc($data)) {
$max_price = $row['max'];
$min_price = $row['min'];}
else {
$min_price = 0;
$max_price = 0;}

$price_from = round($min_price*$selected_currency_details["currency_value"], $selected_currency_details["roundval"]);
$price_to = round($max_price*$selected_currency_details["currency_value"], $selected_currency_details["roundval"]);
$smarty->assign( "search_price_from", $price_from);
$smarty->assign( "old_search_price_from", $price_from);
$smarty->assign( "search_price_to", $price_to);
$smarty->assign( "old_search_price_to", $price_to);
}
else
{
if ( isset($_GET["search_price_from"]) ) $smarty->assign( "search_price_from", $_GET["search_price_from"]);
if ( isset($_GET["search_price_to"]) ) $smarty->assign( "search_price_to", $_GET["search_price_to"]);
if ( isset($_GET["old_search_price_from"]) ) $smarty->assign( "old_search_price_from", $_GET["old_search_price_from"]);
if ( isset($_GET["old_search_price_from"]) ) $smarty->assign( "old_search_price_to", $_GET["old_search_price_to"]);
}



4. в category.php

после строк:


if ( isset($_GET["search_price_from"]) )
$url .= "&search_price_from=".$_GET["search_price_from"];
if ( isset($_GET["search_price_to"]) )
$url .= "&search_price_to=".$_GET["search_price_to"];


вставляем:


if ( isset($_GET["old_search_price_from"]) )
$url .= "&old_search_price_from=".$_GET["old_search_price_from"];
if ( isset($_GET["old_search_price_to"]) )
$url .= "&old_search_price_to=".$_GET["old_search_price_to"];


таких мест там два, вот в обоих местах и вставляем

PS. Работающий пример можно посмотреть тут
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 Matit

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 104 сообщений
Репутация: 2
Начинающий

Отправлено 07 February 2012 - 03:52 PM

badisoft, сделал все по инструкции, но ползунок не появлялся...

вставил этот код все заработало (нужно прописать путь к jquery до jquery-ui):






  • 0
Все "спасибо" в репутацию :)

#3 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 07 February 2012 - 04:40 PM

badisoft, сделал все по инструкции, но ползунок не появлялся...

вставил этот код все заработало (нужно прописать путь к jquery до jquery-ui):


а в первом пункте о чем написано?
  • 0

#4 Matit

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 104 сообщений
Репутация: 2
Начинающий

Отправлено 07 February 2012 - 04:52 PM

а в первом пункте о чем написано?

там все правильно, но не в том порядке. Вторая строка должна идти после третьей.
  • 0
Все "спасибо" в репутацию :)

#5 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 February 2012 - 05:00 PM

вставил этот код все заработало (нужно прописать путь к jquery до jquery-ui)

Хм... Мне казалось, что оно без разницы. Но в реальности у меня, действительно, jquery прописан в другом месте, выше.
Поправлю. Спасибо!

В принципе, линк на полный jquery-ui приведен для простоты. Полный он даже в min.js варианте весит 200кб и правильнее заменить его линками на четыре раздельные библиотеки, которых достаточно и которые даже не в min-варианте занимают 36килобайт суммарно.
Я брал их тут:
http://sfquery.ru/js/ui/jquery.ui.core
http://sfquery.ru/js/ui/jquery.ui.widget
http://sfquery.ru/js/ui/jquery.ui.mouse.js
http://sfquery.ru/js/ui/jquery.ui.slider.js
PS. да-да, у первых двух расширения js нет :). Не знаю, зачем, так-что у себя я их переименовал.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 Matit

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 104 сообщений
Репутация: 2
Начинающий

Отправлено 07 February 2012 - 05:10 PM

badisoft, Вам спасибо)
Было бы хорошо добавить еще и кнопку сброса, т.к. после применения фильтра диапазон уменьшается...
Чтобы повторно задать нужные пределы приходится снова переходить в нужную категорию.

Есть какая нибудь функция по сбросу фильтра для цены?
  • 0
Все "спасибо" в репутацию :)

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 February 2012 - 07:47 PM

Было бы хорошо добавить еще и кнопку сброса, т.к. после применения фильтра диапазон уменьшается...
Чтобы повторно задать нужные пределы приходится снова переходить в нужную категорию.

Я думал о том, чтобы при "Применить" оставить диапазон цен изначальным, стартовым. Видимо, так будет правильнее. Наверное, сделаю в ближайшее время. Или сами сделайте, это не сложно.

А вот по части кнопки сброса - я не очень понимаю, зачем она нужна. Она ПОЛНОСТЬЮ эквивалентна "переходу в нужную категорию". И там, и там один клик. И там, и там на экране есть объект, по которому надо кликнуть. Зачем еще одна такая же кнопка? Если у нас нет на экране блока с деревом категорий, тогда смысл кнопки понятен, но ведь этот блок обычно завсегда есть в этой CMS, не?

---------- Сообщение объединено ----------

Кстати, ежели кто, как и я, пописывает (кто "пишет", у того и так есть:)) - рекомендую примененную в этом дополнении функцию получения списка вложенных категорий вне зависимости от уровней вложенности. Почему-то у многих рекурсия вызывает панический страх и непонимание, а она частенько зело полезна.
    function recursiveCat($catID,$arrayID=array()) 
        { 
        $data = db_query("select categoryID from ".CATEGORIES_TABLE." where PARENT=".$catID); 
        while ($row = db_fetch_assoc($data)) 
            $arrayID = recursiveCat($row['categoryID'],$arrayID); 
        $arrayID[]=$catID; 
        return $arrayID; 
        } 

$arrayID = recursiveCat($categoryID); 
в $arrayID будет массив из стартовой categoryID и categoryID всех вложенных категорий всех уровней, если они есть.

PS. Описанные аналогичным образом две функции из category_functions.php -
// Remarks get current category's subcategories IDs (of all levels!)
// Remarks get current category's subcategories IDs (of all levels!)
- увы, выдают только список вложенных категорий одним уровнем ниже.
Что мы, собственно, и видим, если показываем где-нибудь блок "Обзор категорий".
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 Matit

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 104 сообщений
Репутация: 2
Начинающий

Отправлено 07 February 2012 - 07:53 PM

badisoft, я имею ввиду кнопку, которая сбросит макс и мин значения без перезагрузки. Но, видимо реализовать ее будет сложно))

У меня появилась вот такая идея:
Допустим мин = 1000, макс = 5000. Пользователь указывает диапазон от 2000 до 3000 и нажимает подобрать.
После перехода на отфильтрованную страницу в фильтре левый ползунок находится на значении 2000, а правый 3000, но при этом эти ползунки можно передвинуть левее (т.е. >=1000) и правее (т.е. <=5000) соответственно...
Так, наверно, будет лучше всего)
Увы, реализовать этого я не смогу.
  • 0
Все "спасибо" в репутацию :)

#9 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 February 2012 - 08:01 PM

badisoft, я имею ввиду кнопку, которая сбросит макс и мин значения без перезагрузки. Но, видимо реализовать ее будет сложно)).

"Не, знаю, не пробовал". Может сложно, может нет. Надо просто изучить вопрос возможности изменения части содержимого экрана (скажем, блока) без перезагрузки всего экрана целиком, как происходит сейчас. В силу быстрого интернета я перестал обращать на это внимание, но, ИМХО, такие фишки на сайтах вполне имеют место быть, т.е. в принципе оно реализуемо.

У меня появилась вот такая идея:
Допустим мин = 1000, макс = 5000. Пользователь указывает диапазон от 2000 до 3000 и нажимает подобрать.
После перехода на отфильтрованную страницу в фильтре левый ползунок находится на значении 2000, а правый 3000, но при этом эти ползунки можно передвинуть левее (т.е. >=1000) и правее (т.е. <=5000) соответственно...
Так, наверно, будет лучше всего)
Увы, реализовать этого я не смогу.

Я уже писал об этом выше. И предлагал изменить самому. Будет время и желание - я это сделаю, оно (как мне кажется!) не сложно. Но вообще-то (секрет Полишенеля) это дополнение всего лишь этап на пути написания глобального фильтра "с блэк-джеком и шлюхами", т.е. с точками и крестиками, как у больших :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#10 Matit

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 104 сообщений
Репутация: 2
Начинающий

Отправлено 07 February 2012 - 08:09 PM

"с блэк-джеком и шлюхами"

именно этого я жду :) помогу чем смогу!)
  • 0
Все "спасибо" в репутацию :)

#11 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 February 2012 - 08:21 PM

именно этого я жду :) помогу чем смогу!)

(ехидно) деньгами? :)

PS. (повторяюсь?) Не надо от меня ничего ЖДАТЬ. Для меня это интересная РАЗВЛЕКУХА, а не работа. Надоест - заброшу. Напишу я к этому моменту нормальный фильтр или нет - неизвестно. Пишите сами, в чем проблема-то? Я скоро список своих модулей в подписи публиковать буду в свете идеи "это просто, пишите сами". Первая программа на PHP - декодер "пошифрованных" модулей парсера_6.2. Вторая - простой модуль ЧПУ. Третья - вот этот довесок к фильтру. Мной написано три хренулины, а до того я про PHP/JS/Smarty знать не знал, еще месяца три назад. Ну реально ж простой очень язык, в чем проблема? И информации нынче в интернете хоть ложкой ешь по любому вопросу, и в логи все пишется, если чо не так. С указанием строки, позиции в строке и даже конкретной ошибки. Двадцать лет назад бы так :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#12 Babibos

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений
Репутация: 0
Начинающий

Отправлено 07 February 2012 - 08:27 PM

классное дополнение, такое как на розетке. спасибо
  • 0

#13 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 07 February 2012 - 08:33 PM

классное дополнение, такое как на розетке. спасибо

А! Да! Чота я совсем забыл!
Спасибо (а также букеты, ящики пива, бочки варенья и корзины печенья) слать сюда - R244741725479.
Черт, все время об этом забываю :).

PS. Естественно, все это актуально если Вы не умеете нажимать кнопочку "Спасибо" под сообщением.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#14 panv

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 33 сообщений
Репутация: 0
Начинающий

Отправлено 08 February 2012 - 08:57 PM

Отменя тоже плюсик лови, ну и вопрос заодно, при раскладе ctrl+c и ctrl+v у меня поле search_price_from всегда равно нулю, с чем это может быть связано?

---------- Сообщение объединено ----------

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

---------- Сообщение объединено ----------

Кстати лучше в хэде сделать так, чем тянуть. Три файла положить в папку /data/наименование_Вашего_шаблона/




  • 0

#15 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 February 2012 - 09:22 PM

Кстати лучше в хэде сделать так, чем тянуть. Три файла положить в папку /data/наименование_Вашего_шаблона/

Это достаточно спорно, т.к. врядли ваш хостер будет круче гугля по быстроте отклика и скорости отдачи файлов :).
Тянуть-то клиенту эти файлики все равно придется и какая разница, с Вашего хостера или с гугля?
Ну а как уменьшить объем качаемого я уже написал - тянуть не всю jquery-ui, а только нужные четыре модуля. Думаю, если поискать, то они и в min.js варианте найдутся (или самому сконвертить), а там совсем копеечные объемы должны быть.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#16 panv

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 33 сообщений
Репутация: 0
Начинающий

Отправлено 08 February 2012 - 09:39 PM

У меня все это дело кешируется и отдается клиенту один раз, а при таком раскладе каждый раз тянется.
  • 0

#17 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 08 February 2012 - 09:54 PM

У меня все это дело кешируется и отдается клиенту один раз, а при таком раскладе каждый раз тянется.

1. Почему оно (хоть с гугля, хоть c хостера) тянется каждый раз, если у клиента в браузере включено кэширование?
2. Если кэширование у клиента отключено, каким образом оно отдается клиенту "один раз"? Хоть с гугля, хоть с хостера.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#18 Matit

    Продвинутый пользователь

  • Download User
  • PipPipPip
  • 104 сообщений
Репутация: 2
Начинающий

Отправлено 12 February 2012 - 04:25 PM

Вчера наткнулся на модуль фильтра с флажками для openstore. Интересно можно его как-то переделать под shopcms?))

[HIDE="1"][ATTACH]336.vB[/ATTACH][/HIDE]
  • 0
Все "спасибо" в репутацию :)

#19 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 12 February 2012 - 10:13 PM

Вчера наткнулся на модуль фильтра с флажками для openstore. Интересно можно его как-то переделать под shopcms?))

Врядли. Даже если шаблонизатор там тоже Смарти, то и переменные другие, и ядро другое. Ну, только если общую логику модуля изучить, так она и без этого модуля достаточно понятна.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#20 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 17 February 2012 - 03:28 AM

Вернемся к фильтру :).
Переделал так, чтобы диапазон выбора цен после нажатия "Показать" оставался изначальным, а не уменьшался до выбранных min/max.
Также доделал недоделку, из-за которой возникала ошибка при попытке сортировки или перехода на какую-либо страницу, если страниц в результате нажатия "Показать" получалось несколько.
В шапке новая версия.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)