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


Делаем развесистый фильтр товаров (обкатка, написание, дополнения)


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

#21 micehide

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

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

Отправлено 29 February 2012 - 12:37 AM

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

Чего-то как-то у меня при фильтрации планшетов (указал PocketBook и нажал "Подобрать") по прежнему вылезают все характеристики (типа 25000 уд/мин) это, наверное, гарантийная фича производителя планшетов - типа даем гарантию только на 25000 уд/мин поланшетом об пол ))))

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

ааааа.... все, въехал )))) это я уже носом клюю..
  • 0

#22 badisoft

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

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

Отправлено 29 February 2012 - 01:00 AM

А можно будет, при необходимости (если ОЧЕНЬ много значений), установить для характеристики параметр "Задается произвольно"?

При автоматическом создании списка характеристик не очень понятно, как это делать.
Поясню. Штатно характеристики задаются только как варианты выбора. Применяя их к товару можно либо оставить некоторые варианты, либо задать эту характеристику произвольной строкой. Получается неоднозначность для фильтра, но она решается настройкой характеристик в категории, где жестко задается вариант показа в фильтре - список выбора или произвольная строка.
Но по какому критерию делать этот выбор в случае автоматической генерации списка характеристик? :)
Если для этой характеристики у всех товаров сделано одинаково, то не вопрос. А если по разному? Скажем, характеристика "вес" у одного товара имеет четкие три варианта, а у другого (в той же категории) - произвольная строка? Сейчас жестко сделано "повариантно", но отработку варианта "произвольная строка" я из filter.tpl.html убирать не стал, оставил код на всякий случай.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#23 badisoft

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

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

Отправлено 29 February 2012 - 11:53 AM

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

#24 badisoft

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

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

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

Что-то я в тупичке... Не могу понять, где же в конце концов происходит разбор массива $_GET, полученного после нажатия кнопки "Показать" и перелопачивание содержимого $_GET в SQL-запросы. Понятно, что дублирующиеся ¶m_X=Y надо на что-то заменить, иначе в дело пойдет только один param_X, как и было в штатном фильтре. Заменил на ¶m_X_[0-9]=Y, теперь надо соответственно поменять на "приемной стороне", но не могу найти где :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#25 badisoft

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

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

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

Хотелось бы, чтобы в каждой характеристике (или возможность настройки для каждой х-ки) вместо "не важно" был чек-бокс "Все". Если его выбрать - то все варианты для хар-ки выбираются, снимаем галочку - получается тоже самое "не важно"

Сделал просто еще один радиобаттон "Все". Он рядом с "не важно", а не ниже, т.е. ни на йоту не увеличил занимаемое фильтром пространство. Выложу вместе с решением вышеописанной проблемы, когда решу.

Если не терпится (а смысл? все равно фильтр еще не рабочий), то это просто еще один радиобаттон, такой же, как и "не важно", только по onclick checkbox-ы делаются не false, а true. Ну и еще по мелочи несколько логично вытекающих изменений.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#26 micehide

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

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

Отправлено 29 February 2012 - 11:56 PM

Что-то я в тупичке... Не могу понять, где же в конце концов происходит разбор массива $_GET, полученного после нажатия кнопки "Показать" и перелопачивание содержимого $_GET в SQL-запросы.

Похоже, что используются эти функции из файла search_functions.php:
schOptionIsSetToSearch
schOptionsAreSetToSearch

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

#27 yura

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

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

Отправлено 03 March 2012 - 05:23 PM

При автоматическом создании списка характеристик не очень понятно, как это делать.
Поясню. Штатно характеристики задаются только как варианты выбора. Применяя их к товару можно либо оставить некоторые варианты, либо задать эту характеристику произвольной строкой. Получается неоднозначность для фильтра, но она решается настройкой характеристик в категории, где жестко задается вариант показа в фильтре - список выбора или произвольная строка.
Но по какому критерию делать этот выбор в случае автоматической генерации списка характеристик? :)
Если для этой характеристики у всех товаров сделано одинаково, то не вопрос. А если по разному? Скажем, характеристика "вес" у одного товара имеет четкие три варианта, а у другого (в той же категории) - произвольная строка? Сейчас жестко сделано "повариантно", но отработку варианта "произвольная строка" я из filter.tpl.html убирать не стал, оставил код на всякий случай.


Не бейте меня, если глупость ляпну. А нельзя автоматически из параметров расширенного поиска для категории взять значение? Если там "Выбор из значений" - то чекбоксы, если "Задается произвольно" - произвольная строка. А если вообще характеристика не выбрана - то и в фильтр ее не добавлять.
  • 0

#28 badisoft

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

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

Отправлено 03 March 2012 - 10:48 PM

Не бейте меня, если глупость ляпну

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

#29 yura

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

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

Отправлено 03 March 2012 - 11:05 PM

У каждого товара есть свой набор характеристик и вполне можно получать набор тех самых условий вообще минуя настройки категории, выборкой по товарам, в чем основной цимес и есть.

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

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

А ты предлагаешь смотреть в свойтва категории, отказаться от которых - основная задача проектика .

А я то думал - задача сделать нормальный фильтр, с возможностью выбора нескольких значений чек-боксами, с сохранением возможностей настройки для категорий. ::(
  • 0

#30 badisoft

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

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

Отправлено 03 March 2012 - 11:31 PM

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

Если у характеристики несколько сотен значений, то в рамках этой CMS оно по любому будет выглядеть страшно.

А я то думал - задача сделать нормальный фильтр, с возможностью выбора нескольких значений чек-боксами, с сохранением возможностей настройки для категорий.

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

#31 badisoft

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

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

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

Похоже, что используются эти функции из файла search_functions.php:
schOptionIsSetToSearch
schOptionsAreSetToSearch

Неа. В конечном итоге (надеюсь :)) там играет функция _testExtraParametrsTemplate.
Но вообще это ужасъ и кошмаръ :(.
Использование пучка универсальных и "почти подходящих" функций приводит к тому, что сначала запрашивается ВЕСЬ select по товарам этой категории, затем из этой выборки отбираются только удовлеворяющие условиям (фильтру), на что тратится еще по несколько селектов на каждый товар. Вместо того, чтобы сразу сгенерить один полный select со всеми условиями и не грузить мозги sql-серверу.
Осталось собраться с силами и распотрошить (понять) эту функцию :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#32 micehide

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

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

Отправлено 05 March 2012 - 09:30 PM

Но вообще это ужасъ и кошмаръ .

Ты лучше скажи где там не кошмар ))) ИМХО, переписать полностью или написать новую функцию проще, чем в этой байде разбираться, тем более если ты идешь от начала до конца по всем запросам. С другой стороны, если все-таки разбираться, изучишь заодно весь PHP и оптимизируешь функциональную часть ShopCMS ))

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

#33 badisoft

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

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

Отправлено 06 March 2012 - 01:43 AM

Ты лучше скажи где там не кошмар

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

#34 badisoft

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

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

Отправлено 06 March 2012 - 06:15 PM

хе-хе... Я так понимаю, этот модуль себе почти никто и не ставил, т.к. в шапке jquery.min.js расположено ниже, чем jquery-ui.min.js, т.е. работать не должно :).

Заменил развесистую функцию _testExtraParametrsTemplate на краткое:

function _testExtraParametrsTemplate( $productID, &$template ){

foreach( $template as $key => $item )
if((string)$key <> "categoryID" && isset($item["optionID"]) && db_fetch_row(db_query(
"SELECT productID FROM ".PRODUCTS_OPTIONS_SET_TABLE.
" WHERE productID=".$productID." AND optionID=".(int)$item['optionID']." AND variantID=".$item['value']."")))
return true;
return false;
}

пока никаких отличий не вижу. Т.е. все старое, вроде, работает, а в "новом" стали отфильтровываться товары более, чем по одной галке. Это требует еще и мелкого изменения в filter.tpl.html:
<input type="checkbox" name='param_{$params[i].optionID}[B]_{$smarty.section.j.index}'....

Позже выложу в шапку причесанную версию. В принципе, это промежуточная затычка, т.к. сам алгоритм остался штатным и кривым - select по всему товару в группе, затем для каждой строки селекта вызываем эту функцию и выясняем, попадает товар под фильтр или нет.

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

Всегда есть какие-то исключения, должна быть возможность настройки какая-то

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

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

Позже выложу в шапку причесанную версию.

Выложил.

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

Упс... Не обрабатывается "не важно". Недоработочка... :( Надо доработать.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#35 panv

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

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

Отправлено 06 March 2012 - 10:26 PM

Фильтрую по цене, товара нет, а он есть. Правый ползунок чутка сдвигаем и видим результат.
  • 0

#36 badisoft

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

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

Отправлено 07 March 2012 - 12:40 AM

Упс-2. В общем случае нифига не верная логика в SQL-запросе в вышеописанной функции. Завтра буду поправлять. Алгоритм понятен, надо реализовать в буквах :).

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

Чутка читаем тему про эти ползунки и видим - почему.
Или просто сразу меняем step:10 на step:1 в ява-функции.

PS. В случае дробных цен типа 10.59 - на 0.01 :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#37 badisoft

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

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

Отправлено 07 March 2012 - 06:43 PM

Упс-2. В общем случае нифига не верная логика в SQL-запросе в вышеописанной функции. Завтра буду поправлять. Алгоритм понятен, надо реализовать в буквах.

Реализовал:

function _testExtraParametrsTemplate( $productID, &$template ){

$variants = array();
foreach( $template as $key => $item )
if((string)$key <> "categoryID" && isset($item["optionID"]) && isset($item["optionID"]))
$variants[(int)$item["optionID"]][] = $item['value'];

if (!$count = count($variants)) return true;

$filter = array();
foreach( $variants as $key => $item )
$filter[] = "optionID=".$key." AND variantID IN (".implode(",",$item).")";

$row=db_fetch_row(db_query("SELECT count(*) AS count FROM ".PRODUCTS_OPTIONS_SET_TABLE.
" WHERE productID=".$productID. " AND (".implode(" OR ",$filter).")"));
if($row['count'] == $count) return true;
return false;
}


Надеюсь, это окончательный вариант этой функции :).

Галочки в пределах одной характеристики объединяются по OR, т.е. товар должен иметь хотя бы один из вариантов, отмеченных галочкой. Галочках в разных хар-ках объединяются по AND, т.е. товар должен иметь хотя бы один из помеченных вариантов в КАЖДОЙ из характеристик. Если не отмечена ни одна из галочек (везде стоит "не важно), то выводятся все товары.

Теперь пора сделать "сохранение галочек" :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#38 badisoft

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

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

Отправлено 08 March 2012 - 12:31 AM

Сделал вывод количества товаров, имеющих этот вариант характеристики напротив каждого варианта характеристики. Оказалось на удивление легко и нересурсоемко - по запросу на вариант. В шапке уже есть, на тестовом сайте тоже. По сравнению с предыдущим вариантом изменилась одна строка в filter.tpl.html и две строки (PHP-строки!) в advanced_search_in_category.php

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

Теперь пора сделать "сохранение галочек"

Сделано. В шапке уже последняя версия, на тестовом сайте тоже.
По сравнению с предыдущим вариантом изменились filter.tpl.html и advanced_search_in_category.php
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#39 gsm-group

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

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

Отправлено 09 March 2012 - 02:45 AM

На демо сайте не работает кнопочка ВСЕ (все характеристики выделяются, а сама кнопка не активна)
  • 0

#40 badisoft

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

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

Отправлено 09 March 2012 - 03:19 AM

На демо сайте не работает кнопочка ВСЕ (все характеристики выделяются, а сама кнопка не активна)

Т.е. ВСЕ характеристики выделяются, но кнопочка ВСЕ не работает? :)
Она так и должна работать, именно так и написано.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)