Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

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

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

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

 

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

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

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

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

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

 

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

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

/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);

Ссылка на сообщение
Поделиться на другие сайты

 

/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 ?

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

.....

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

...

...

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

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

.....

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

	$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);

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

Изменено пользователем Kors
Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...