Основной курс по Joomla
0 Пользователей и 1 Гость просматривают эту тему.
  • 22 Ответов
  • 1019 Просмотров
*

avantyrist

  • Давно я тут
  • ****
  • 221
  • 3
Вех с Новым Годом. ! :)

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

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

« Последнее редактирование: 19.01.2016, 20:46:35 от avantyrist »
*

avantyrist

  • Давно я тут
  • ****
  • 221
  • 3
В топике чуток изменил функцию для цен
*

Vitos

  • Осваиваюсь на форуме
  • ***
  • 161
  • 6
У меня ваше решение работает, но чекбоксы остаются отмечены, хотя после перехода выводятся все товары категории.
*

robert

  • Профи
  • ********
  • 4009
  • 371
avantyrist, я немного исправил и упростил вашу функцию
Спойлер
[свернуть]
Не тестировал, правда. Но это грубые костыли, вам нужно было написать плагин на событие afterGetBuildFilterListProduct, тогда ничего править не пришлось бы.
чекбоксы остаются отмечены, хотя после перехода выводятся все товары категории.
После перехода откуда куда? Подозреваю, что ваш фильтр работает на AJAX.
« Последнее редактирование: 12.01.2016, 17:48:44 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

Vitos

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

robert

  • Профи
  • ********
  • 4009
  • 371
После перехода на другую категорию фильтр сбрасывается и выводятся все товары, как и задумано. Но чекбоксы чекнутые.
Вы верно подозреваете, в фильтре применяется AJAX.
Так и думал. Нужно дописать скрипт, чтобы и фильтр обновил.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

Vitos

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

avantyrist

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

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

avantyrist

  • Давно я тут
  • ****
  • 221
  • 3
Блин я только сейчас заметил что идёт не соместимость с
    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']);
} ?>


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

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

avantyrist

  • Давно я тут
  • ****
  • 221
  • 3
Исправил функцию в топике, дополнил описание


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

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

robert

  • Профи
  • ********
  • 4009
  • 371
Я только модифицировал вашу функцию, но видимо, ваша функция не работает, поэтому и моя не работает.
Так вот, если дело касается только сброса всех значений в mod_jshopping_filter, то нет смысла делать такой костыль. Переопреледите tmpl/default.php и сразу после закрывающего тэга </script> добавьте
Спойлер
[свернуть]
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

avantyrist

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

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

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

*

robert

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

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

avantyrist

  • Давно я тут
  • ****
  • 221
  • 3
Я ешё не знаю как в плагины оборачивать. API ето класно наверное :) но на данный момент разобрать что откуда берётся в етой Joomla для взрыв мозга.

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

robert

  • Профи
  • ********
  • 4009
  • 371
Нет, я не разработчик JoomShopping, я всего лишь кодер-самоучка. Плагин - это врезка кода, это как будьто вы написали код, потом что-то вспомните и добавите еще кусок. Да, ресурсы нужны, но только для определения точки, куда нужно вставить этот кусок кода.
« Последнее редактирование: 20.01.2016, 02:38:48 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

Vitos

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

robert

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

Vitos

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

avantyrist

  • Давно я тут
  • ****
  • 221
  • 3
robert Спасибо за участие

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

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

P\S:  Я скорее всего не прав!! :)
« Последнее редактирование: 24.01.2016, 02:15:01 от avantyrist »
*

Vitos

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

robert

  • Профи
  • ********
  • 4009
  • 371
Раз работает, значит правильно :). Все-таки набросал свой вариант и выложил тут. Протестируйте и отпишитесь.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

Vitos

  • Осваиваюсь на форуме
  • ***
  • 161
  • 6
Отписался в вашей теме))
*

olf

  • Давно я тут
  • ****
  • 353
  • 4
А вот фото - без фото не сбрасывает. Я про этот плагин.

P.S. Я понял. Оказывается я тестировал расширенный фильтр, - а там автономный запрос фильтрации по фото к базе. Значит надо допиливать прямо в нем по принципу как в плагине от robertа.
« Последнее редактирование: 24.03.2016, 18:11:59 от olf »
PHP код по-русски: если не то {} то это {}