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


Еще один фильтр. Теперь на AJAX.


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

#161 bora

    Пользователь

  • Пользователи
  • PipPip
  • 10 сообщений
Репутация: 0
Начинающий

Отправлено 29 November 2015 - 11:47 PM

в смысле не модуль , а дополнение к стандартному функционалу
  • 0

#162 bora

    Пользователь

  • Пользователи
  • PipPip
  • 10 сообщений
Репутация: 0
Начинающий

Отправлено 30 November 2015 - 08:25 PM

Слайдер с ползунками выбора min/max цены в штатном Фильтре товаров , я об этом
  • 0

#163 badisoft

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

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

Отправлено 01 December 2015 - 09:57 AM

Слайдер с ползунками выбора min/max цены в штатном Фильтре товаров , я об этом

Работает.
Не работает он, как правило, когда где-то еще раз грузится jquery.
Выглядит это так:
1. в head.tpl.html грузится jquery, затем jquery-ui, который нужен для слайдера и которому нужен jquery.
2. где-то ниже ЕЩЕ РАЗ грузится jquery, который сносит вышестоящие jquery+jquery-ui и слайдер, естественно, не работает.

PS. Учитесь пользоваться отладчиком (например, firebug-ом), он в явном виде сообщает, что не так и почему не работает. А "посмотреть исходный код" и Ctrl-F (поиск) помогут найти повторную загрузку jquery.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#164 hedhedhed

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

  • Download User
  • PipPipPip
  • 107 сообщений
Репутация: 4
Начинающий

Отправлено 10 December 2015 - 01:25 PM

Скорее всего не сюда, сам фильтр отрабатывает правильно (перенесу в другую тему, не нашел куда), но столкнулся с непонятными хвостами:

- при выдаче товара в поиске выдает вот такое (раздел "часы"): (картинка 1)

- на сайте, в самом товаре ничего подобного нет: (картинка 2)

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

- если нажать на "Настроить", там стоит галка: (картинка 4)

Как можно удалить эти непонятные галки (скорее всего, раньше под этим артикулом был другой товар, например, телевизор, с хар-ками "диагональ", и от него остались эти хвосты) ?

P.S. в файле импорта csv, к примеру, тоже нет этих галок у этих товаров. Думал, удалить их хоть так, но удалять оказалось нечего.

Прикрепленные файлы

  • Прикрепленный файл  1.jpg   48.55К   21 Количество загрузок:
  • Прикрепленный файл  2.jpg   67.75К   27 Количество загрузок:
  • Прикрепленный файл  3.jpg   66.86К   25 Количество загрузок:
  • Прикрепленный файл  4.jpg   43.14К   17 Количество загрузок:

  • 0

#165 badisoft

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

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

Отправлено 10 December 2015 - 02:07 PM

Скорее всего не сюда (перенесу в другую тему, не нашел куда)

Как раз сюда.

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

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

#166 Pioneer

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

  • Download User
  • PipPipPip
  • 36 сообщений
Репутация: 1
Начинающий

Отправлено 09 August 2016 - 11:58 PM

Прочитал тему и вдоль и поперек, но как говорится " То ли лыжи не едут..."
Из описания понятно что фильтр работает ТОЛЬКО с вариантами характеристик, прописал именно варианты :
Прикрепленный файл  Доп.Характеристики.jpg   39.46К   14 Количество загрузок:

Но при выводе фильтра их почему-то не показывает, при этом цена, сортировка, автопоказ и т.д все работает:
Прикрепленный файл  фильтр.jpg   31.79К   14 Количество загрузок:

Что это может быть ? Специально выбрал категорию где прописаны варианты характеристик у всех товаров.
Заранее благодарен за наставление на путь истинный ))
  • 0

#167 badisoft

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

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

Отправлено 10 August 2016 - 01:05 PM

Что это может быть ?

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

#168 Pioneer

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

  • Download User
  • PipPipPip
  • 36 сообщений
Репутация: 1
Начинающий

Отправлено 10 August 2016 - 09:16 PM

Убедиться, что это так (или не так) можно в админке в разделе "Статистика ошибок".


Да, какие-то ошибки пишет :
ERROR: 1052:Column 'productID' in field list is ambiguous
Sql: SELECT optionID,variantID, COUNT(productID) AS count
FROM fses_product_options_set
JOIN fses_products USING(productID)
WHERE enabled=1 AND Price>=0 AND Price<=905.76 AND categoryID>1
GROUP BY optionID,variantID
Link: /index.php?do=filter&filter=1
Date: 10.08.16 - 22:10:20
Dump:
array(2) {
["do"]=>
string(6) "filter"
["filter"]=>
string(1) "1"
}
array(4) {
["sort"]=>
string(16) "sort_order, name"
["prdPerPage"]=>
string(2) "18"
["categoryID"]=>
string(1) "1"
["cID"]=>
string(1) "6"
}

А в верхнем окне :
WARNING: in_array() [<a href='function.in-array'>function.in-array</a>]: Wrong datatype for second argument
Line: 130
File: /home/braun/public_html/core/cache/%%CB^CBF^CBF3F2B9%%product_brief.tpl.html.php
Link: /index.php?do=filter&filter=2
Date: 10.08.16 - 00:39:23
Dump:
array(2) {
["do"]=>
string(6) "filter"
["filter"]=>
string(1) "2"
}
array(7) {
["filterauto"]=>
string(1) "1"
["sort"]=>
string(16) "sort_order, name"
["prdPerPage"]=>
string(2) "18"
["categoryID"]=>
string(2) "80"
["cID"]=>
string(1) "1"
["price_from"]=>
string(2) "47"
["price_to"]=>
string(2) "77"
}
  • 0

#169 badisoft

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

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

Отправлено 11 August 2016 - 11:56 AM

Вот тут написано, что поле productID является неоднозначным (присутствует более, чем в одной таблице и хрен знает, из какой таблицы его брать). Так бы оно бы было, но эти две таблицы связаны именно по этому полю (USING (productID)), т.е. в пределах строки данных это поле одинаково в обоих таблицах и никакой неоднозначности нет.

ERROR: 1052:Column 'productID' in field list is ambiguous
Sql: SELECT optionID,variantID, COUNT(productID) AS count
FROM fses_product_options_set
JOIN fses_products USING(productID)
WHERE enabled=1 AND Price>=0 AND Price<=905.76 AND categoryID>1
GROUP BY optionID,variantID

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

mysql> SELECT optionID,variantID, COUNT(productID) AS count
-> FROM shop3_product_options_set
-> JOIN shop3_products USING(productID)
-> WHERE enabled=1 AND Price>=0 AND Price<=905.76 AND categoryID>1
-> GROUP BY optionID,variantID;
+----------+-----------+-------+
| optionID | variantID | count |
+----------+-----------+-------+
| 1 | 4 | 149 |
| 1 | 5 | 1 |
| 1 | 271 | 6 |
| 1 | 272 | 6 |
| 1 | 273 | 5 |
| 2 | 1 | 4 |
| 2 | 126 | 2 |
| 2 | 264 | 41 |
| 2 | 269 | 59 |
| 2 | 270 | 65 |
| 3 | 7 | 3 |
| 3 | 8 | 3 |
| 3 | 297 | 1 |
| 3 | 298 | 1 |
| 3 | 299 | 1 |
| 10 | 27 | 3 |
| 10 | 28 | 1 |
| 10 | 29 | 1 |
| 13 | 35 | 1 |
| 13 | 300 | 1 |
| 43 | 261 | 2 |
| 43 | 302 | 2 |
| 44 | 265 | 99 |
| 44 | 268 | 1 |
+----------+-----------+-------+
24 rows in set (0.00 sec)

Вылечить проблему просто - указать конкретную таблицу, откуда будет браться productID:

$data = db_query("SELECT optionID,variantID, COUNT(pos.productID) AS count
FROM ".PRODUCTS_OPTIONS_SET_TABLE." AS pos
...

т.е. одной из таблиц присваиваем алиас (AS pos), а полю productID указываем, из какой таблицы его брать (pos.productID)
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#170 Pioneer

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

  • Download User
  • PipPipPip
  • 36 сообщений
Репутация: 1
Начинающий

Отправлено 11 August 2016 - 01:22 PM

Вылечить проблему просто - указать конкретную таблицу, откуда будет браться productID:


$data = db_query("SELECT optionID,variantID, COUNT(pos.productID) AS count
FROM ".PRODUCTS_OPTIONS_SET_TABLE." AS pos
...

т.е. одной из таблиц присваиваем алиас (AS pos), а полю productID указываем, из какой таблицы его брать (pos.productID)


Спасибо за ответ.

Изменил строку в filter.php по Вашим рекомендациям.

Теперь выдает другую ошибку :

ERROR: 1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM fses_product_options_set
JOIN fses_products USING(product' at line 3
Sql: SELECT optionID,variantID, COUNT(pos.productID) AS count
FROM fses_product_options_set AS pos
FROM fses_product_options_set
JOIN fses_products USING(productID)
WHERE enabled=1 AND Price>=0 AND Price<=294.12 AND categoryID IN (18)
GROUP BY optionID,variantID
Link: /index.php?do=filter&filter=1
  • 0

#171 badisoft

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

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

Отправлено 11 August 2016 - 01:41 PM

Изменил строку в filter.php по Вашим рекомендациям.

Вы ее не изменили, а добавили:
FROM fses_product_options_set AS pos
FROM fses_product_options_set

Теперь выдает другую ошибку :

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

#172 Pioneer

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

  • Download User
  • PipPipPip
  • 36 сообщений
Репутация: 1
Начинающий

Отправлено 11 August 2016 - 03:22 PM

Что вполне естественно. Уберите строку "FROM fses_product_options_set".

Да, так и есть, моя ошибка. Исправил. Ура, характеристики появились. Нот теперь при нажатии на чек бокс, пропадают количества товаров в скобочках и при нажатии на "показать" или "автопоказ", что то там думает и ничего не фильтрует в итоге.
Ошибку показывает такую :
ERROR: 1052:Column 'productID' in group statement is ambiguous
Sql: SELECT COUNT(*) AS count
FROM (SELECT COUNT(DISTINCT optionID) AS count
FROM fses_product_options_set
JOIN fses_products USING(productID)
WHERE enabled=1 AND Price>=0 AND Price<=458.823529412 AND categoryID IN (5) AND variantID IN (29,25)
GROUP BY productID) AS t
WHERE t.count=2
Link: /index.php?do=filter&filter=1

Наверное нужно сделать что-то аналогичное предыдущему случаю ?

В этом коде поменять ?

$data = db_query("SELECT productID
FROM (SELECT productID, COUNT(DISTINCT optionID) AS count
FROM ".DB_PRFX."product_options_set
  • 0

#173 badisoft

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

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

Отправлено 11 August 2016 - 04:13 PM

Наверное нужно сделать что-то аналогичное предыдущему случаю ?
В этом коде поменять ?

Да.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#174 Pioneer

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

  • Download User
  • PipPipPip
  • 36 сообщений
Репутация: 1
Начинающий

Отправлено 11 August 2016 - 11:20 PM

Наверное нужно сделать что-то аналогичное предыдущему случаю ? В этом коде поменять ?

Да.


Не поможете ? Наверное все таки не в этом, а ругается на вот этот кусок :

$row = db_fetch_assoc(db_query("SELECT COUNT(*) AS count
FROM (SELECT COUNT(DISTINCT optionID) AS count
FROM ".PRODUCTS_OPTIONS_SET_TABLE." AS pos
JOIN ".DB_PRFX."products USING(productID)
WHERE enabled=1 AND Price>=$price_from AND Price<=$price_to AND $addonCat$addonStock AND variantID IN (".implode(',',$search).")
GROUP BY productID) AS t

Ошибка
ERROR: 1052:Column 'productID' in group statement is ambiguous
Sql: SELECT COUNT(*) AS count
FROM (SELECT COUNT(DISTINCT optionID) AS count
Выбирает все поля * , наверное и productID тоже , короче запутался :(
  • 0

#175 badisoft

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

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

Отправлено 12 August 2016 - 12:45 AM

Ошибка
ERROR: 1052:Column 'productID' in group statement is ambiguous

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

#176 jiykka

    Пользователь

  • Download User
  • PipPip
  • 29 сообщений
Репутация: 0
Начинающий

Отправлено 24 August 2016 - 11:31 AM

Столкнулся с проблемой. На сайте заказчика порядка 4000 товаров. При выборе одной из характеристик - фильтр очень долго думает прежде чем выскакивает картинка загрузки и следовательно сам результат.
Сайт пока стоит на php 5.2 - может ли быть из за этого затык?
Либо направьте в нужное русло где искать проблему этой задержки.
Спасибо!
  • 0

#177 makki

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

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

Отправлено 24 August 2016 - 11:33 AM

Столкнулся с проблемой. На сайте заказчика порядка 4000 товаров. При выборе одной из характеристик - фильтр очень долго думает прежде чем выскакивает картинка загрузки и следовательно сам результат.
Сайт пока стоит на php 5.2 - может ли быть из за этого затык?
Либо направьте в нужное русло где искать проблему этой задержки.
Спасибо!

Чтобы ощутимо что-то поменялось, ничего не сделаешь, кроме как поменять движок.
  • 0

#178 badisoft

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

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

Отправлено 24 August 2016 - 01:32 PM

На сайте заказчика порядка 4000 товаров. При выборе одной из характеристик - фильтр очень долго думает прежде чем выскакивает картинка загрузки и следовательно сам результат.

При установке/снятии галки (да и при первоначальной загрузке) происходит пересчет доступных для этой комбинации галок товаров.
Это довольно ресурсоемкая процедура. Зависит не столько от количества товаров, сколько от количества характеристик и вариантов. Видимо, их много.
Можно отказаться от пересчета (закомментировать в filter.php нижеследующий код) и, скорее всего, все станет очень быстро.

foreach ($params as $optionID => $option)
{
$true_count = $POSTcount + (isset($POST_param[$optionID])?0:1);
foreach ($option['variants'] as $variantID => $variant)
{
$search = array($variantID);
foreach ($POST_param as $POSToptionID => $POSTvariants)
foreach ($POSTvariants['param_new'] as $POSTvariantID)
if ($POSToptionID != $optionID) $search[] = $POSTvariantID;
$row = db_fetch_assoc(db_query("SELECT COUNT(*) AS count
FROM (SELECT COUNT(DISTINCT optionID) AS count
FROM ".PRODUCTS_OPTIONS_SET_TABLE."
JOIN ".PRODUCTS_TABLE." AS p USING(productID)
WHERE enabled=1 AND Price>=$price_from AND Price<=$price_to AND $addonCat$addonStock$addonSearch$addonCisfo AND variantID IN (".implode(',',$search).")
GROUP BY productID) AS t
WHERE t.count=$true_count"));
$params[$optionID]['variants'][$variantID]['count'] = $row['count'];
}
}

Я недавно пробовал сделать этот пересчет принципиально по другому - один SQL-запрос и дальнейшая обработка полученного массива, но получилось еще медленнее.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#179 jiykka

    Пользователь

  • Download User
  • PipPip
  • 29 сообщений
Репутация: 0
Начинающий

Отправлено 24 August 2016 - 09:45 PM

На сайте заказчика порядка 4000 товаров. При выборе одной из характеристик - фильтр очень долго думает прежде чем выскакивает картинка загрузки и следовательно сам результат.

При установке/снятии галки (да и при первоначальной загрузке) происходит пересчет доступных для этой комбинации галок товаров.
Это довольно ресурсоемкая процедура. Зависит не столько от количества товаров, сколько от количества характеристик и вариантов. Видимо, их много.
Можно отказаться от пересчета (закомментировать в filter.php нижеследующий код) и, скорее всего, все станет очень быстро.

foreach ($params as $optionID => $option)
{
$true_count = $POSTcount + (isset($POST_param[$optionID])?0:1);
foreach ($option['variants'] as $variantID => $variant)
{
$search = array($variantID);
foreach ($POST_param as $POSToptionID => $POSTvariants)
foreach ($POSTvariants['param_new'] as $POSTvariantID)
if ($POSToptionID != $optionID) $search[] = $POSTvariantID;
$row = db_fetch_assoc(db_query("SELECT COUNT(*) AS count
FROM (SELECT COUNT(DISTINCT optionID) AS count
FROM ".PRODUCTS_OPTIONS_SET_TABLE."
JOIN ".PRODUCTS_TABLE." AS p USING(productID)
WHERE enabled=1 AND Price>=$price_from AND Price<=$price_to AND $addonCat$addonStock$addonSearch$addonCisfo AND variantID IN (".implode(',',$search).")
GROUP BY productID) AS t
WHERE t.count=$true_count"));
$params[$optionID]['variants'][$variantID]['count'] = $row['count'];
}
}

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

Спасибище! Стало намного быстрее :)
  • 0

#180 Den

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

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

Отправлено 10 May 2018 - 05:06 PM

Несколько дней назад заметил, что сортировка отфильтрованных товаров работает как попало. При этом в файлы никаких изменений не вносил. Может связано с каким-то обновлением mysql?
Переменная $filtersort выглядит так:
$filtersort = in_array($_POST['sort'],array('in_stock DESC,sort_order','in_stock >= 0 DESC,Price > 0 DESC,Price,name','in_stock >= 0 DESC,Price > 0 DESC,Price DESC,name'))?$_POST['sort']:'in_stock DESC,sort_order';

Запрос при установке хотя бы одной галки (по-моему в него никаких изменений не вносил):
	$data = db_query("SELECT productID
				  FROM (SELECT productID, COUNT(DISTINCT optionID) AS count
					  FROM ".PRODUCTS_OPTIONS_SET_TABLE."
					  JOIN ".PRODUCTS_TABLE." USING(productID)
					  WHERE enabled=1 AND Price>=$price_from AND Price<=$price_to AND $addonCat$addonStock$addonSearch AND variantID IN (".implode(',',$search).")
					  GROUP BY productID
					  ORDER BY $filtersort) AS t
				  WHERE t.count=$POSTcount");

Выборка товаров по параметрам происходит правильная, а вот сортируются неправильно. Попробовал сделать этот же запрос напрямую в phpmyadmin - все такой же разброд. Причем сразу после запроса порядок строк один, а после перехода на вторую страницу результатов и возврата на первую - он уже может измениться, а может и нет. Также и при повторном запросе (это все в phpmyadmin). Запрос делал такой (чуть модифицировал, чтобы было видно что к чему):
SELECT productID, in_stock, sort_order, Price
				  FROM (SELECT productID, in_stock, sort_order, Price, COUNT(DISTINCT optionID) AS count
					  FROM pwqk_product_options_set
					  JOIN pwqk_products USING(productID)
					  WHERE enabled=1 AND Price>=0 AND Price<=2895.5882352941 AND categoryID IN (21) AND variantID IN (131)
					  GROUP BY productID
					  ORDER BY Price) AS t
				  WHERE t.count=1

А результат получается такой:
Изображение

То есть получается, что сортировка происходит правильно, но в пределах некой части строк, в данном случае частями по 14 строк.

Пробовал на двух разных хостингах:
  • Версия сервера: 5.6.39-83.1 - Percona Server (GPL), Release 83.1, Revision da5a1c2923f
  • Версия сервера: 5.7.16-10-log - Percona Server (GPL), Release 10, Revision a0c7d0d

  • 0