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


Фотография
* * * * * 2 Голосов

Доработка фильтра - AJAX подгрузка количества результатов и сортировка

ajax фильтр сортировка

Сообщений в теме: 19

#1 fiction13

fiction13

Отправлено 14 June 2016 - 09:38

*
Популярное сообщение!

Привет, читатель.

 

Сегодня мы поговорим о фильтре и немного его доработаем. Дорабатывать будем фильтр в части AJAX подгрузки количества результатов, как в лучших магазинах Лондона, а также немного доработаем сортировку (уберем чексбокс обратный порядок и добавим в селекс выбор по возрастанию и убыванию).

 

Сразу скриншот, чтобы Вы поняли, о чем идет речь.

 

1.jpg

 

В обоих случаях править будем хелпер модуля фильтра, расположенный по адресу: г. Москва /modules/mod_jbzoo_search/helper.php.

 

От слов к делу.

 

AJAX подгрузка количества результатов

 

За подгрузку количества результатов будет отвечать следующий кусок кода

  1. JFactory::getDocument()->addScriptDeclaration("
  2. jQuery(document).ready(function($){
  3. $('.jbfilter input, .jbfilter select').on('change', function (event) {
  4. var el = $(event.target);
  5. flQuickResult(el);
  6. });
  7.  
  8. $('.jbslider').on('change.JBZooSlider', function (event) {
  9. var el = $(event.target);
  10. flQuickResult(el);
  11. });
  12.  
  13. function flQuickResult (el) {
  14. $('.flQuickResult').remove();
  15. $.get(window.location.href.split('?')[0] + '?' + $('.jbfilter').serialize() + '&tmpl=component', function(data) {
  16. $('.flQuickResult').remove();
  17. var count = $(data).find('p').first().text().replace( /^\D+/g, '');
  18.  
  19. if (count) {
  20. var title = flNumToStr(count, ['товар', ' товара', 'товаров']);
  21. var text = 'Найдено ' + count + ' ' + title;
  22. var button = '<input type=\"submit\" name=\"send-form\" value=\"Показать\" class=\"jsSubmit uk-button\">';
  23. } else {
  24. var text = 'Ничего не найдено';
  25. var button = '<input type=\"reset\" name=\"reset-form\" value=\"Сбросить\" class=\"jsReset uk-button\">';
  26. }
  27.  
  28. elPosition = el.position();
  29. topPosition = elPosition.top - 49 + el.height()/2;
  30.  
  31. el.parent().append('<div class=\"flQuickResult\" style=\"top: ' + topPosition + 'px;\"><p>' + text + '</p>' + button + '</div>');
  32. });
  33. }
  34.  
  35. function flNumToStr(number, titles) {
  36. cases = [2, 0, 1, 1, 1, 2];
  37. return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
  38. }
  39. });
  40. ");

Его мы добавляем в конец функции _loadAssets(). Знающие люди смогут добавить его куда угодно, например, выцепить отсюда скрипт и добавить в свой js файл.

 

Немного CSS. Для фильтра, расположенного в левом сайдбаре

  1. .flQuickResult {
  2. position: absolute;
  3. left: 180px;
  4. width: 180px;
  5. background: #333333;
  6. text-align: center;
  7. padding: 14px 18px;
  8. z-index: 100;
  9. }
  10. .flQuickResult:before {
  11. border: 7px solid;
  12. border-color: transparent #333 transparent transparent;
  13. display: block;
  14. left: -14px;
  15. }
  16. .flQuickResult:after, .flQuickResult:before {
  17. content: ' ';
  18. position: absolute;
  19. width: 0;
  20. height: 0;
  21. top: 40px;
  22. }
  23. .flQuickResult:after {
  24. left: -13px;
  25. border: 7px solid;
  26. border-color: transparent #333 transparent transparent;
  27. }

И для фильтра, расположенного в правом сайдбаре

  1. .flQuickResult {
  2. position: absolute;
  3. left: -210px;
  4. width: 180px;
  5. background: #333333;
  6. text-align: center;
  7. padding: 14px 18px;
  8. z-index: 100;
  9. box-sizing: border-box;
  10.  
  11. }
  12. .flQuickResult:before {
  13. border: 7px solid;
  14. border-color: transparent transparent transparent #333;
  15. display: block;
  16. left: -14px;
  17. }
  18. .flQuickResult:after, .flQuickResult:before {
  19. content: ' ';
  20. position: absolute;
  21. width: 0;
  22. height: 0;
  23. top: 40px;
  24. }
  25. .flQuickResult:after {
  26. left: -13px;
  27. border: 7px solid;
  28. border-color: transparent transparent transparent #333;
  29. }

Стили можно (нужно) поправить под себя, Вы уже не маленькие ;-) Да и куда добавлять стили, объяснять не буду. Я в Вас верю!

 

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

 

Очень простая магия.

 

Сортировка

 

За доработку сортировки отвечает другой код, вот такой

  1. $optionsSorting = array();
  2. foreach ($options as $key => $value) {
  3. $optionsSorting[$key.'____asc'] = $value.' по возр.';
  4. $optionsSorting[$key.'____desc'] = $value.' по убыв.';
  5. }
  6.  
  7. JFactory::getDocument()->addScriptDeclaration("
  8. jQuery(document).ready(function($){
  9. $('#jbfilter-id-order').hide();
  10. $('input[name=\"order[reverse]\"]').parent().hide();
  11.  
  12. $('#flFilterSortingSelect').on('change', function () {
  13. var select = $(this);
  14. var selectValue = select.val();
  15. var orderOptions = selectValue.split('____');
  16. var ordering = orderOptions[0];
  17. var reverse = orderOptions[1];
  18.  
  19. console.info(ordering);
  20. console.info(reverse);
  21.  
  22. $('#jbfilter-id-order').val(ordering);
  23. if (reverse == 'desc') {
  24. $('input[name=\"order[reverse]\"]').attr('checked', true);
  25. } else {
  26. $('input[name=\"order[reverse]\"]').attr('checked', false);
  27. }
  28.  
  29. return false;
  30. });
  31. });
  32. ");
  33.  
  34. $html[] = $this->_jbhtml->select($optionsSorting, 'order[flSorting]', array(), $values->get('flSorting'), 'flFilterSortingSelect', true);

Его вставляем в функции getOrderings() перед

  1. html[] = $this->_jbhtml->select($options, 'order[field]', array(), $values->get('field'), 'jbfilter-id-order', true);

После этого селект со списком сортировок и чекбоксом превращается в селект с выбором сортировок по возрастанию и убыванию, а сами сортировки по прежнему добавляются из админки модуля фильтра.

 

Прикрепляю измененный файл хелпера, на всякий случай.

 

Прикрепленный файл  helper.zip   2.6К   398 Количество загрузок:

 

 

*************************************

 

Все это дело тестировалось на

Joomla 3+

JBZoo 2.2.7

 

Демо


  • 16

#2 13LTD

13LTD

Отправлено 14 June 2016 - 13:26

сюда бы еще и вывод самого результата ajax)

но и так очень здорово!


  • 3

#3 CB9TOIIIA

CB9TOIIIA

Отправлено 14 June 2016 - 17:47

Супер! Порой думаешь - вот бы совместить все рецепты :) там сортировку по цене - этот фильтр и т.п. :)


  • 2

#4 shiftDELET

shiftDELET

Отправлено 14 June 2016 - 18:10

хорошая штука! обязательно пригодится))


  • 1

#5 isay777

isay777

Отправлено 15 June 2016 - 07:22

CB9TOIIIA сказал(а) 14 Июн 2016 - 16:47:

Супер! Порой думаешь - вот бы совместить все рецепты :) там сортировку по цене - этот фильтр и т.п. :)

 

И В КОРОБКУ!!! 

Рецептов уже конечно много и очень клевых. 


  • 2
ХОСТИНГ для сайтов jbzoo (все попугаи)

#6 nikolia

nikolia

Отправлено 15 June 2016 - 10:16

Круть спасибо за работу!


  • 1

#7 nikolia

nikolia

Отправлено 15 June 2016 - 14:25

У меня почему-то не работает для группы Public результаты выводятся только когда на сайт заходишь как Super Users 

Если в настройках модуля разрешить Редактирование на сайте, то все работает!

Что это может быть? http://chita-rio.ru/flat


  • 0

#8 fiction13

fiction13

Отправлено 15 June 2016 - 15:41

nikolia сказал(а) 15 Июн 2016 - 13:25:

У меня почему-то не работает

Работает, просто результатов не видно. А если добавить, например, к лэйблу position:relative, то результаты будут видны. 


  • 0

#9 nikolia

nikolia

Отправлено 15 June 2016 - 22:55

Чего-то я понять не могу, это получается не подхватывает стили?

Вот зашёл как админ на сайт

2016-06-16_065135.jpg

вот вышел

2016-06-16_065226.jpg

position:relative меняю, но отображается пустое место, прямо в самом фильтре!


  • 0

#10 nikolia

nikolia

Отправлено 16 June 2016 - 14:04

Всё стили поправил, нормально теперь! Спасибо Дмитрий!


  • 1





Темы с аналогичным тегами ajax, фильтр, сортировка

Click to return to top of page in style!