Jump to content

Подбор товаров к заказу в админке


Recommended Posts

В админке при редактировании заказа есть возможность добавлять в заказ новый товар.

Для выбора товара используется стандартный механизм автодополнения.

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

 

Скрипт, подбирающий товары для автодополнения, находится в simpla/ajax/add_order_product.php.

Работает он так:

1. Делает запрос к таблице товаров по поисковой фразе и находит до 100 записей товаров.

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

3. Возвращает список товаров, но НЕ ВСЕХ, найденных на шаге 1, а только тех, к которым подобраны варианты.

 

Допустим, на сайте есть 500 товаров, у которых в названии есть цифра 4, и у половины из них есть допустимые варианты. Тогда при автопоиске на фразу "4" скрипт на шаге 1 выберет 100 товаров. Затем может оказаться, что, например, у 95 из них нет допустимых вариантов. В результате автопоиск выдаст всего 5 товаров. А может случиться, что и ни одного. Хотя подходящие товары есть, и много.

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

 

Практически можно, конечно, увеличивать это магическое число 100, но это некрасивый и порочный путь...

 

Подобные скрипты автодополнения работают при поиске товаров на сайте и на странице товаров в админке. У них подобного недостатка не наблюдается.

Link to post
Share on other sites

/simpla/ajax/add_orders_products.php на строке 20 

 

	$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
	                    LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
	                    WHERE 1 '.$keyword_sql.' ORDER BY p.name LIMIT ?', $limit);

 

заменить на

 

	$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
	                    LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
	                    LEFT JOIN __variants pv ON pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0)
	                    WHERE 1 '.$keyword_sql.' AND pv.id
	                    GROUP BY p.id
	                    ORDER BY p.name LIMIT ?', $limit);

Link to post
Share on other sites

 

/simpla/ajax/add_orders_products.php на строке 20 

 

	$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
	                    LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
	                    WHERE 1 '.$keyword_sql.' ORDER BY p.name LIMIT ?', $limit);
 

заменить на

	$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
	                    LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
	                    LEFT JOIN __variants pv ON pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0)
	                    WHERE 1 '.$keyword_sql.' AND pv.id
	                    ORDER BY p.name LIMIT ?', $limit);

 

Нет слов...

Неужели это написал сам автор Simpla ?

Никак не могу сообразить - то ли новое решение еще хуже, то ли оно примерно такое же плохое? К сожалению, иных альтернатив нет.

Ужасно интересно, проверял ли автор это и если проверял, то на каких примерах...

 

Когда-то пару лет назад на форуме мелькнула фраза одного специалиста "Денис вылизывает движок под самое не улыбайся". Сейчас над самой этой фразой можно не только улыбаться, а громко и долго смеяться...

Link to post
Share on other sites

Допустим, при поиске должны находиться 20 товаров, у которых по 10 вариантов.

Тогда модифицированный запрос выдаст первые 100 строк

товар 1 - вариант1

товар 1 - вариант2

.....

товар 1 - вариант10

...

...

товар 10 - вариант1

товар 10 - вариант2

.....

товар 10 - вариант10

 

В итоговом результате из 20 товаров будут только 10...

Link to post
Share on other sites

Спасибо за оперативность!

 

А если сделать так:

 

	$simpla->db->query('SELECT p.id, p.name, i.filename as image FROM __products p
	                    LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1)
	                    INNER JOIN __variants pv ON pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0)
	                    WHERE 1 '.$keyword_sql.' 
	                    ORDER BY p.name LIMIT ?', $limit);

не легче ли будет запрос?

Edited by Kors
Link to post
Share on other sites
  • 2 months later...

Продолжаем разговор, как говаривал небезызвестный Карлсон.

 

Сначала немного теории. В файле simpla/ajax/add_order_product.php скрипт, подбирающий товары для автодополнения, делает ДВА запроса к базе данных, в то время как проще было бы обойтись одним. Но это беда небольшая, это всего лишь маленькая нерациональность. Хуже то, что это ведет к более длинному и более сложному коду, что увеличивает риск ошибок.

 

А теперь к практике. Одна ошибка описывалась в начале темы, сейчас она исправлена. Но обнаружилась другая. Во втором запросе, на варианты, есть условие price>0. В первом же запросе такого условия нет. Поэтому возможны ошибки, аналогичные описанным ранее.  В частности, риск таких ошибок растет, если имеется много товаров с нулевой ценой. И это не экзотика - встречалось несколько серьезных магазинов, которые используют это для уже не поступающих в продажу товаров.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...