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


Выбор нескольких вариантов характеристики в фильтре

фильтр

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

#1 micehide

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

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

Отправлено 15 June 2013 - 03:08 AM

Приветствую всех!

Не могу понять: работает ли такая возможность (см. сабж) изначально в ShopCMS? У меня на тестовом вроде бы чистом магазине выдается "Нет товаров", если выбрать, допустим, два варианта одной доп. характеристики одновременно. При этом URL выглядит так:

http://shopcms/index.php?categoryID=259&search=1&search_name=&search_price_from=&search_price_to=&param_154_p6=6&param_154_p7=7&param_147=&param_150=&param_144=&search_in_subcategory=1&advanced_search_in_category=1

- там видно, что параметр (доп. характеристика) param_154 имеет 2 варианта - опции 6 и 7.

Естесственно, если выбрать только один из вариантов (любой), то товары отображаются, т.к. характеристики соответствующие присутствуют у них. Не отображаются, только если выбрать оба варианта одновременно.

Посмотрел у badisoft-а на сайте, у него в URL-е по-другому, так: "param_154_1=6&param_154_2=7" вместо стандартного "param_154_p6=6&param_154_p7=7". Попробывал - тоже не работает, чего это за фигня? Оно вообще работать должно или у меня где-то конфликт?
  • 0

#2 badisoft

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

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

Отправлено 15 June 2013 - 10:53 AM

Оно вообще работать должно или у меня где-то конфликт?

Нет, не должно. Насколько помню, свой вариант функции _testExtraParametrsTemplate я именно потому и писал, что штатная функция работает только если param_XXX имеет всего один вариант. Там оно по AND объединяется, чтоли. В общем, когда задано два варианта одного параметра, то по любому получается false.

Тогда я эту функцию просто заменил, а сейчас добавляю в строку &extrafilter=1, а в функции делаю

if (isset($_GET["extrafilter"])){
новый код функции
}else{
старый код функции
}

это позволяет делать разные фильтры и для каждого делать свой вариант функции _testExtraParametrsTemplate при сохранении общего ядра и работоспособности родного и других фильтров.

"param_154_1=6¶m_154_2=7" вместо стандартного "param_154_p6=6¶m_154_p7=7"

А это совершенно безразлично, лишь бы после второго подчерка было нечто уникальное.
Список характеристик-вариантов создается в функции ScanGetVariableWithId, которая возвращает массив, где ключом будет "хвост" от param_, (т.е., например 154_1), а значением - значение $_GET (например, 6). Затем ключ передается в функцию schOptionIsSetToSearch, где к нему применяется (int), т.е. все, что после подчерка на результат не влияет.

PS. Там общая идея такова, что сначала в advanced_search_in_category.php собирается массив $extraParametrsTemplate, где и содержатся данные для поиска по характристикам и вариантам (полученный из строки запроса). Затем в category.php идет присвоение $callBackParam["extraParametrsTemplate"] = $extraParametrsTemplate, а в массиве $callBackParam кроме данных о характеристиках и вариантах есть и куча другой инофрмации для поиска - сортировка, направление, категория, etc.
Ну а дальше в функцию GetNavigatorHtml передается этот массив со всеми данными для получения нужной выборки и имя функции обратного вызова (в данном случае prdSearchProductByTemplate), которая и использует затем функцию _testExtraParametrsTemplate, которая для каждого товара возвращает true или false, т.е. подходит он или нет под наши данные. Ну а полученная выборка возвращается в массиве $products.
Немного через задницу, но, в принципе, если понять, то очень удобно. Можно делать любые свои выборки лишь меняя callback-функцию.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#3 badisoft

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

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

Отправлено 15 June 2013 - 01:27 PM

PPS. Я давно хочу перевести свой фильтр с GET на POST, чего и тебе советую :). А то уж больно развесистая строка запроса получается.
А если уж смотреть в корень, то в shopCMS, как мне кажется, хорошо бы заменить кучу старинных выражений времен PHP 4.0
if ($_GET['bla-bla'] OR $_POST['bla-bla']) на if ($_REQUEST['bla-bla']).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 micehide

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

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

Отправлено 15 June 2013 - 04:42 PM

Спасибо за раскрытое описание!

Я как раз зарылся в функцию _testExtraParametrsTemplate, поняв что облом происходит именно в ней. Как обычно, сама функциональность выбора двух и более опций предполагалась, т.к. присутствуют постфиксы, но она реально не заботает, а код настолько запутан и грязен, что его читать очень нудно. К тому же там какие-то ужасающие массивы вылезают, в которых по нескольку копий одной и той же информации передается, да еще и куча лишних неиспользующихся параметров.

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

Не уверен, что нужно менять GET на POST, какая от этого реальная выгода?
  • 0

#5 badisoft

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

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

Отправлено 16 June 2013 - 11:36 AM

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

Я, вроде, когда писал фильтр тоже об этом спрашивал - "нахрена там в этой функции все так наворочено". Т.к. у меня даже полный аналог этой функции получился заметно короче и проще.

Не уверен, что нужно менять GET на POST, какая от этого реальная выгода?

Да никакой окромя осутствия длинной-длинной строки ссылки. Чисто для красоты. Писатели ShopCMS, похоже, тоже к этому шли, т.к. очень во многих местах встречается if ($_GET['bla-bla'] OR $_POST['bla-bla']), хотя $_POST['bla-bla'] никогда не бывает.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)