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

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

РЕШЕНО! Сброс фильтра при переходе в другую категорию

 (Прочитано 667 раз)
0 Пользователей и 1 Гость смотрят эту тему.
avantyrist
Давно я тут
****

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

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



« : 02.01.2016, 14:11:24 »

Вех с Новым Годом. ! Azn

Пока писал свой модуль  по фильтру товаров, Решил проблемку со сбросом фильтров при переходе в Другую категорию! Azn
Фильтр сбрасывается если Вы переходите в другую категорию, но сохраняется если Вы зашли в товар и потом вернулись в ету категррию

файл:  \components\com_jshopping\lib\functions.php

перед функцией getBuildFilterListProduct()   вставляем мою функцию:

Показать текстовый блок


Теперь в функции  getBuildFilterListProduct($contextfilter, $no_filter = array()){
1) В самом начале определяем корень массива:
     $path = 'ActiveFiltr';
2) Заменяем всё что было связано с getUserStateFromRequest и  filterAllowValue  на новую функцию
    Пример:
       Ето:
    $manufacturers = $mainframe->getUserStateFromRequest( $contextfilter.'manufacturers', 'manufacturers', array());
    $manufacturers = filterAllowValue($manufacturers, "int+");
       Меняем на ето!
    $manufacturers = GetRequestSession($path, 'manufacturers');

3) Если Вы используете стандартный модуль фильтров, ДЕЛАЕМ точно такие же замены !
        Плюс если модуль отправляет данные POST запросом, После всех вызовов етой функции прописываем:
Код
if (isset($_POST['redirect'])){
header('Location:'.'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
}
 
       В файле шаблона В ФОРМУ добавляем инпут:
<input type="hidden" name="redirect" value="1">
 
И  Вас перестанет мучать "ПОВТОРНАЯ ОТПРАВКА ФОРМЫ"

« Последнее редактирование: 19.01.2016, 19:46:35 от avantyrist » Записан
avantyrist
Давно я тут
****

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

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



« Ответ #1 : 04.01.2016, 19:43:04 »

В топике чуток изменил функцию для цен
Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #2 : 12.01.2016, 13:21:12 »

У меня ваше решение работает, но чекбоксы остаются отмечены, хотя после перехода выводятся все товары категории.
Записан
robert
Профи
********

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

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


« Ответ #3 : 12.01.2016, 16:32:09 »

avantyrist, я немного исправил и упростил вашу функцию
Показать текстовый блок
Не тестировал, правда. Но это грубые костыли, вам нужно было написать плагин на событие afterGetBuildFilterListProduct, тогда ничего править не пришлось бы.
чекбоксы остаются отмечены, хотя после перехода выводятся все товары категории.
После перехода откуда куда? Подозреваю, что ваш фильтр работает на AJAX.
« Последнее редактирование: 12.01.2016, 16:48:44 от robert » Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #4 : 12.01.2016, 23:20:25 »

После перехода откуда куда? Подозреваю, что ваш фильтр работает на AJAX.
После перехода на другую категорию фильтр сбрасывается и выводятся все товары, как и задумано. Но чекбоксы чекнутые.
Вы верно подозреваете, в фильтре применяется AJAX.
Записан
robert
Профи
********

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

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


« Ответ #5 : 13.01.2016, 00:33:43 »

После перехода на другую категорию фильтр сбрасывается и выводятся все товары, как и задумано. Но чекбоксы чекнутые.
Вы верно подозреваете, в фильтре применяется AJAX.
Так и думал. Нужно дописать скрипт, чтобы и фильтр обновил.
Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #6 : 13.01.2016, 12:22:37 »

Так и думал. Нужно дописать скрипт, чтобы и фильтр обновил.
Плохо(
Как я понимаю, для сброса фильтра, дописывать нужно на javascript?
Записан
avantyrist
Давно я тут
****

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

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



« Ответ #7 : 19.01.2016, 01:01:54 »

Смотря как Фильтр принимает данные.
Смотрите в модуле есть ли функции getUserStateFromRequest
Если есть попробуйте поменять их на мою....

robert я "учуся - мучаюся" !  Azn а вам спасибо
К етим костылям сессии я пришёл, во время написания модуля фильтра товаров (который, наполовину, работает с помощью сесий, чтобы меньше делать запросов в БД)
Записан
avantyrist
Давно я тут
****

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

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



« Ответ #8 : 19.01.2016, 02:43:41 »

Блин я только сейчас заметил что идёт не соместимость с
    header('Location:'.'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);

Принцип:
1) Форму отпраляю POST запросом, в форме есть пустышка: <input type="hidden" name="session_id" value="1">
2) В основном файле модуля обрабатыаю POST запросы, своей функцией, да даже не соей а просто записываю в сессию.
3) В Конце делаю проверку и переадресацию:

Код:
<?php
if (isset($_POST['session_id'])){
header('Location:'.'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
} ?>


Так оно ничего не записывает в сессию Sad,  Какая логика должна быть при таких манипуляциях Sad  я не могу понять никак
Стандартная функция getUserStateFromRequest делает запись в Сессию

--------------------------------------
P/S   А нет всё таки глюк в функции, по ночам надо спать и пиво не пить когда чтото ковыряю Azn
        НАДО переписать весь бред  Grin
--------------------------------------
Vitos я сомневаюсь что JavaScript
сделайте:
echo'<pre>'; print_r($_SESSION); echo'</pre>';
И изучите содержимое етого масиива
« Последнее редактирование: 19.01.2016, 03:46:32 от avantyrist » Записан
avantyrist
Давно я тут
****

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

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



« Ответ #9 : 19.01.2016, 20:19:37 »

Исправил функцию в топике, дополнил описание


robert
Хоть убейте не пойму Ваш Вариант Azn
Как оно будет определять из той ли я категории сделал запросы. Запустить не получилось, ошибки с preg_match лезут,  наверное из-за етого :
$val=$jinput->get($key,array(),'ARRAY');

Цены приходят не массивом... И откуда етот метод берёт концы я не понял Azn)
Записан
robert
Профи
********

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

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


« Ответ #10 : 19.01.2016, 22:38:32 »

Я только модифицировал вашу функцию, но видимо, ваша функция не работает, поэтому и моя не работает.
Так вот, если дело касается только сброса всех значений в mod_jshopping_filter, то нет смысла делать такой костыль. Переопреледите tmpl/default.php и сразу после закрывающего тэга </script> добавьте
Показать текстовый блок
Записан
avantyrist
Давно я тут
****

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

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



« Ответ #11 : 20.01.2016, 01:00:02 »

robert
 Последняя моя правка работает.  Ну, у меня по крайней мере не получилось заставить её не работать Azn Мне бы понять что там не работает Azn
весь Сурбор как раз заключался в том чтобы сбрасывался результат фильтра(Категории товаров, произодители.....) и сбрасыался модуль фильтров.

Обьясню:
1) захожу в категорию, начинаю в ней делать фильтрацию товаров, с помощью модуля.
2) из отфильтрованного списка захожу в товар.
3) из товара возвращаюсь обратно в туже категорию, РЕЗУЛЬТАТЫ ФИЛЬТРАЦИИ НЕ СБРОСИЛИСЬ
4) Тут мне захотелось перейти в другую категорию.
5) а потом взял и вернулся в первую категорию, РЕЗУЛЬТАТ ФИЛЬТРАЦИИ ОБНУЛЕНЫ.

также работает перенаправление:
header('Location:'.'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);

Записан
robert
Профи
********

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

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


« Ответ #12 : 20.01.2016, 01:07:50 »

Последняя моя правка работает.
Возможно, я не проверял.
Но хак, тем более хак ядра - это моветон. Напишите плагин с тем же кодом на событие afterGetBuildFilterListProduct или тестируйте мое последнее предложение.

P.S. Давайте я немного объясню. Обычно задача заключается в обратном: чтобы параметры фильтра не обнулялись, а вам же нужно их сбросить. Тогда будет лишним их сохранить: они и так уже сохранены в State. Вам нужно только сохранить ID категории (производителя) для сравнения.
И раз вы пишете под Joomla, то пора использовать ее API.
« Последнее редактирование: 20.01.2016, 01:19:36 от robert » Записан
avantyrist
Давно я тут
****

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

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



« Ответ #13 : 20.01.2016, 01:17:52 »

Я ешё не знаю как в плагины оборачивать. API ето класно наверное Azn но на данный момент разобрать что откуда берётся в етой Joomla для взрыв мозга.

robert если я не ошибаюсь Вы один из разработчиков JoomShoping ?  Можете пожалуйста сказать, с точки зрения производительности, в данной ситуации плагин ето правильное решение ? В том плане что плагин как я понимаю ето дополнительные ресурсы: Вызов етого плагина, поиск нужной точки входа, замена чегото на чтото.  
Хак ето понятно не гуд, Обноивился, забыл, всё слетело.... Я допустим "блокнот" веду что к чему Azn
-------------------------------
Я не в одном магазине не видел чтобы сохранялись параметры фильтрации при переходах по разным категориям. Меня чуток в ступор поставило то что в исходном варианте получается Sad,  Сначала подумал что я гдето чтото напортачил (ето было очень давно Azn )
« Последнее редактирование: 20.01.2016, 01:23:39 от avantyrist » Записан
robert
Профи
********

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

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


« Ответ #14 : 20.01.2016, 01:23:31 »

Нет, я не разработчик JoomShopping, я всего лишь кодер-самоучка. Плагин - это врезка кода, это как будьто вы написали код, потом что-то вспомните и добавите еще кусок. Да, ресурсы нужны, но только для определения точки, куда нужно вставить этот кусок кода.
« Последнее редактирование: 20.01.2016, 01:38:48 от robert » Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #15 : 23.01.2016, 15:33:25 »

robert, подскажите пожалуйста чайнику, чтобы впихнуть это все в плагин, на событие afterGetBuildFilterListProduct нужно писать всю измененную функцию getBuildFilterListProduct ? Хочется понять...
Ведь грубо говоря в файле functions.php, мы сейчас имеем одну новую функцию и одно измененную.
Записан
robert
Профи
********

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

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


« Ответ #16 : 23.01.2016, 16:18:56 »

Если ваша цель - сбросить все параметры фильтра при перехода из категории в категорию, при этом сохранить их при переходе из товара в категорию, то возьмите решение, которое я привел 6 постов выше.
Решение от avantyrist не слишком рационалное: он пытается сохранить то, что и так уже сохранено. Если вы все же хотите написать плагин, то в нем должна быть функция afterGetBuildFilterListProduct(&$filters). Подробно о том, как создавать плагин, читайте здесь.
« Последнее редактирование: 25.01.2016, 03:33:08 от robert » Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #17 : 23.01.2016, 22:46:17 »

Спасибо, ваше решение проверю и отпишусь. Интерес у меня фифти-фифти. С одной стороны раздражает такая работа фильтра а с другой, хочу разобраться в создании плагинов, ведь полезных хаков для магазина много.
Записан
avantyrist
Давно я тут
****

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

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



« Ответ #18 : 24.01.2016, 00:00:02 »

robert Спасибо за участие

VITOS если получится выложите пожалуйста плагин.
У меня времени не хватает на разбор API Joomla. Щас Ковыряюсь в основами PHP, Javascript и jQuery.

Решение которое я выкладывал было связано с тем что я сразу не понял как получать доступ к исходной сесии(удалять от туда). Ету функцию нарисовал в ходе написания модуля фильтров
Но как по мне в итоге получается м.б. и лучше, так дёргается только моя функция + JRequest, а не тянется за собой куча функций из API.

P\S:  Я скорее всего не прав!! Azn
« Последнее редактирование: 24.01.2016, 01:15:01 от avantyrist » Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #19 : 24.01.2016, 21:59:47 »

robert, проверил ваше решение (переопределил tmpl/default.php и дописал ваш код), результат удивил.
Все в точности до наоборот, чекбоксы все снимаются при переходах, но товары так и остаются отфильтроваными. Azn
Я конечно не исключаю, что это проблема моего ajax-недофильтра, я еще позже проверю на стандартном.
avantyrist, для вас собрал "протоплагин" для экспериментов Wink
Правильно собрал или нет, я и сам не знаю)) может гуру robert подскажет, но работает он у меня точно также как и ваш хак. В принципе верно, только чекбоксы не сбрасываются, на стандартном еще не проверял.

* plg_jsfilter_reseter.zip (1.82 Кб - загружено 12 раз.)
Записан
robert
Профи
********

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

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


« Ответ #20 : 25.01.2016, 03:32:09 »

Раз работает, значит правильно Azn. Все-таки набросал свой вариант и выложил тут. Протестируйте и отпишитесь.
Записан
Vitos
Осваиваюсь на форуме
***

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

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



« Ответ #21 : 25.01.2016, 11:35:22 »

Отписался в вашей теме))
Записан
olf
Давно я тут
****

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

Сообщений: 333



« Ответ #22 : 21.03.2016, 13:17:13 »

А вот фото - без фото не сбрасывает. Я про этот плагин.

P.S. Я понял. Оказывается я тестировал расширенный фильтр, - а там автономный запрос фильтрации по фото к базе. Значит надо допиливать прямо в нем по принципу как в плагине от robertа.
« Последнее редактирование: 24.03.2016, 17:11:59 от olf » Записан
Страниц: [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