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


Фото
- - - - -

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


  • Чтобы отвечать, сперва войдите на форум
7 ответов в теме

#1 Kors

Kors
  • Фрилансер
  • 2 909 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 16.04.2015 - 20:44

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

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

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

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

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

#2 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 930 сообщений

Опубликовано 16.04.2015 - 21:25

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



#3 Kors

Kors
  • Фрилансер
  • 2 909 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 17.04.2015 - 07:23

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

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

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

 

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



#4 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 930 сообщений

Опубликовано 17.04.2015 - 07:30

А по сути?



#5 Kors

Kors
  • Фрилансер
  • 2 909 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 17.04.2015 - 07:59

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

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

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

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

.....

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

...

...

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

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

.....

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

 

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



#6 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 930 сообщений

Опубликовано 17.04.2015 - 08:43

Спасибо, действительно, забыл group by. Поправил выше



#7 Kors

Kors
  • Фрилансер
  • 2 909 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 17.04.2015 - 09:22

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

 

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

 

	$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, 17.04.2015 - 09:40


#8 Kors

Kors
  • Фрилансер
  • 2 909 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 15.07.2015 - 18:20

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

 

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

 

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






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых