Kors Опубликовано 16 апреля, 2015 Жалоба Поделиться Опубликовано 16 апреля, 2015 В админке при редактировании заказа есть возможность добавлять в заказ новый товар. Для выбора товара используется стандартный механизм автодополнения. Обнаружилась ситуация, когда автодополнение не находит многих товаров. Скрипт, подбирающий товары для автодополнения, находится в simpla/ajax/add_order_product.php. Работает он так: 1. Делает запрос к таблице товаров по поисковой фразе и находит до 100 записей товаров. 2. Затем подбирает варианты к товарам. Варианты выбираются не все, а лишь с наличием и ненулевой ценой. В силу этого может оказаться, что у некоторых товаров не выбрано ни одного варианта. 3. Возвращает список товаров, но НЕ ВСЕХ, найденных на шаге 1, а только тех, к которым подобраны варианты. Допустим, на сайте есть 500 товаров, у которых в названии есть цифра 4, и у половины из них есть допустимые варианты. Тогда при автопоиске на фразу "4" скрипт на шаге 1 выберет 100 товаров. Затем может оказаться, что, например, у 95 из них нет допустимых вариантов. В результате автопоиск выдаст всего 5 товаров. А может случиться, что и ни одного. Хотя подходящие товары есть, и много. Ситуация совсем не экзотическая, а довольно типовая для активно работающих магазинов, у которых часто меняется ассортимент и снятые с производства и продажи товары хранятся в базе с нулевым количеством. Практически можно, конечно, увеличивать это магическое число 100, но это некрасивый и порочный путь... Подобные скрипты автодополнения работают при поиске товаров на сайте и на странице товаров в админке. У них подобного недостатка не наблюдается. Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 16 апреля, 2015 Жалоба Поделиться Опубликовано 16 апреля, 2015 /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); Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 17 апреля, 2015 Автор Жалоба Поделиться Опубликовано 17 апреля, 2015 /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 ?Никак не могу сообразить - то ли новое решение еще хуже, то ли оно примерно такое же плохое? К сожалению, иных альтернатив нет.Ужасно интересно, проверял ли автор это и если проверял, то на каких примерах... Когда-то пару лет назад на форуме мелькнула фраза одного специалиста "Денис вылизывает движок под самое не улыбайся". Сейчас над самой этой фразой можно не только улыбаться, а громко и долго смеяться... Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 17 апреля, 2015 Жалоба Поделиться Опубликовано 17 апреля, 2015 А по сути? Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 17 апреля, 2015 Автор Жалоба Поделиться Опубликовано 17 апреля, 2015 Допустим, при поиске должны находиться 20 товаров, у которых по 10 вариантов.Тогда модифицированный запрос выдаст первые 100 строктовар 1 - вариант1товар 1 - вариант2.....товар 1 - вариант10......товар 10 - вариант1товар 10 - вариант2.....товар 10 - вариант10 В итоговом результате из 20 товаров будут только 10... Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 17 апреля, 2015 Жалоба Поделиться Опубликовано 17 апреля, 2015 Спасибо, действительно, забыл group by. Поправил выше Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 17 апреля, 2015 Автор Жалоба Поделиться Опубликовано 17 апреля, 2015 (изменено) Спасибо за оперативность! А если сделать так: $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); не легче ли будет запрос? Изменено 17 апреля, 2015 пользователем Kors Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 15 июля, 2015 Автор Жалоба Поделиться Опубликовано 15 июля, 2015 Продолжаем разговор, как говаривал небезызвестный Карлсон. Сначала немного теории. В файле simpla/ajax/add_order_product.php скрипт, подбирающий товары для автодополнения, делает ДВА запроса к базе данных, в то время как проще было бы обойтись одним. Но это беда небольшая, это всего лишь маленькая нерациональность. Хуже то, что это ведет к более длинному и более сложному коду, что увеличивает риск ошибок. А теперь к практике. Одна ошибка описывалась в начале темы, сейчас она исправлена. Но обнаружилась другая. Во втором запросе, на варианты, есть условие price>0. В первом же запросе такого условия нет. Поэтому возможны ошибки, аналогичные описанным ранее. В частности, риск таких ошибок растет, если имеется много товаров с нулевой ценой. И это не экзотика - встречалось несколько серьезных магазинов, которые используют это для уже не поступающих в продажу товаров. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.