Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Улучшение поиска в OpenCart 1.5: поиск по описанию, подкатегориям, по модели и SKU

Просмотров: 32248 RSS 83
Howto » E-commerce » OpenCart
, , , ,

По умолчанию поиск в OpenCart производится только по названиям продуктов. Что довольно неудобно для покупателя и не оправдано, если продуктов на сайте не так уж и много (думаю, на нескольких сотнях наименований никакой разницы не будет заметно).

Поиск по описаниям и подкатегориям

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

Для того, чтобы исправить поведение поиска по умолчанию в версиях OpenCart от v1.5.0.5 до 1.5.2 (а может и в более поздних, но на данный момент я знаю только про эти), надо отредактировать файл catalog/view/javascript/common.js:

строки #9 и #22 изменить с

url += '&filter_name=' + encodeURIComponent(filter_name);

на

url += '&filter_name=' + encodeURIComponent(filter_name) +
'&filter_sub_category=true&filter_description=true';

Поиск по модели и SKU (артикулу) - вариант для версий 1.5.0.5 - 1.5.1.2 и может более ранних 1.5.x

Чтобы добавить поиск по модели и SKU (артикулу), надо модифицировать ещё один файл:

commit 56a765ccb474075b7073f11474100e2251e0d762
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Sep 5 11:55:51 2011 +0300
    [+] catalog: search: добавлен поиск по модели и SKU
diff --git a/public_html/catalog/model/catalog/product.php b/public_html/catalog/model/catalog/product.php
index 520bc34..e9a3d73 100644
--- a/public_html/catalog/model/catalog/product.php
+++ b/public_html/catalog/model/catalog/product.php
@@ -106,10 +106,12 @@ class ModelCatalogProduct extends Model {
 			. (int)$this->config->get('config_store_id') . "'";
 
 			if (isset($data['filter_name']) && $data['filter_name']) {
+				$sFilterName = $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8'));
+				$sql_search_model_sku = 'LCASE(p.model) LIKE "%' . $sFilterName . '%" OR LCASE(p.sku) LIKE "%' . $sFilterName . '%"';
 				if (isset($data['filter_description']) && $data['filter_description']) {
-					$sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%') OR LCASE(pd.description) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%')";
+					$sql .= " AND (".$sql_search_model_sku." OR LCASE(pd.name) LIKE '%" . $sFilterName . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $sFilterName . "%') OR LCASE(pd.description) LIKE '%" . $sFilterName . "%')";
 				} else {
-					$sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $this->db->escape(mb_strtolower($data['filter_name'], 'UTF-8')) . "%'))";
+					$sql .= " AND (".$sql_search_model_sku." OR LCASE(pd.name) LIKE '%" . $sFilterName . "%' OR p.product_id IN (SELECT pt.product_id FROM " . DB_PREFIX . "product_tag pt WHERE pt.language_id = '" . (int)$this->config->get('config_language_id') . "' AND LCASE(pt.tag) LIKE '%" . $sFilterName . "%'))";
 				}
 			}

Поиск по модели и SKU (артикулу) - вариант для версии 1.5.1.3 (и наверное выше)

commit 77611b6dcad3fb21484c889bb7726688cb68de34
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Oct 10 11:58:24 2011 +0300
    [+] catalog: search by model and SKU
diff --git a/upload/catalog/model/catalog/product.php b/upload/catalog/model/catalog/product.php
index 25a7861..a9ed128 100644
--- a/upload/catalog/model/catalog/product.php
+++ b/upload/catalog/model/catalog/product.php
@@ -54,13 +54,19 @@ class ModelCatalogProduct extends Model {
 					$implode = array();
 					
 					$words = explode(' ', $data['filter_name']);
 					foreach ($words as $word) {
-						if (!empty($data['filter_description'])) {
-							$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
-						} else {
-							$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
-						}				
+						if( !empty($word) )
+						{
+							$lword = $this->db->escape(utf8_strtolower(trim($word)));
+							// Add search by model and SKU
+							$implode[] = 'LCASE(p.model) LIKE "%' . $lword . '%" OR LCASE(p.sku) LIKE "%' . $lword . '%"';
+							if (!empty($data['filter_description'])) {
+								$implode[] = "LCASE(pd.name) LIKE '%" . $lword . "%' OR LCASE(pd.description) LIKE '%" . $lword . "%'";
+							} else {
+								$implode[] = "LCASE(pd.name) LIKE '%" . $lword . "%'";
+							}
+						}
 					}
 					
 					if ($implode) {

А как же админка? Там тоже SKU не хватает!

Можете также добавить возможность поиска по SKU в админ-зоне магазина.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Комментариев: 83
  1. 2011-09-06 в 08:34:02 | Владимир

    Поиск по модели и SKU (артикулу)

    все хорошо, но какой файл модифицировать то? модифицировать - ? изменить или заменить?

  2. 2011-09-06 в 18:35:45 | Ruslan Brest

    Файл - catalog/model/catalog/product.php

    @@ -106,10 +106,12 @@ -- строки, т.е. примерно на 106 строке вы должны найти похожий кусок кода, перед и после блока изменений обычно выводится пара строк текста. "Примерно 106" - потому что я множество правок вношу в свой магазин и содержимое файлов может не совпадать с оригинальным OpenCart 1.5.1.1.

    Правки индицируются значками "-" и "+" в самом начале строки: те, что с минусом, были убраны (они должны совпадать с тем, что вы у себя видите перед внесением изменений), а те, что с плюсом -- добавлены в это место. Поэтому можно руками внести и проконтролировать все изменения.

  3. Спасибо огромное

  4. Как вот еще отдельный столбец по SKU в админке получить можно.

    А то поле есть,а по нему работать в списке - нельзя 8(

  5. 2011-10-06 в 18:33:36 | Ruslan Brest

    Марат, это не проблема - сам об этом думал, собирался добавлять. У нас в магазине основное поле -- уникальный SKU. Колонка модели лично нам вообще не нужна (разве что если захочется сортировать по ней), поскольку номер модели включается в название товара и поиск по нему после моих модификаций производится без проблем и в колонке названия.

    Поэтому вопрос лишь в реализации. Добавлять ли ещё колонку (с поиском и сортировкой) или просто вывести SKU где-то для информации (под названием например). Или поле модель убрать. Этого делать не хочется, но ещё меньше хочется возиться с появляющейся горизонтальной прокруткой при расширении таблицы. Ну или подправить вёрстку в админке, сделав её более "резиновой" и без DIV-а со скроллом. Если и скролл, то пусть лучше у броузера - им хоть пользоваться удобней на невысоких экранах (нетбуки например).

  6. Да пусть будет скролл. Это не так страшно.

  7. В 1.5.1.3 уже не работает.

    Там теперь код другой. Что делать?

  8. 2011-10-07 в 17:38:21 | Ruslan Brest

    Спасибо, посмотрю на выходных 1.5.1.3

  9. Руслан, может денежку надо?

  10. 2011-10-10 в 04:14:34 | Ruslan Brest

    Я, конечно, люблю денежку, но тормозит не это. Сейчас у меня очень сложно со временем. Вдобавок к этому 1.5.1.3 значительно менялась, и мне надо аккуратно сравнить её и влить в мою копию с изменениями. Это не очень просто.

    Можно поставить рядом чистый 1.5.1.3 и разносить правки... Не очень хотелось на это идти (потом ещё и с третьей копией синхронизировать, если парни успеют следующую стабильную версию опубликовать). Но видимо так всё же быстрей получится.

  11. Да там они форму запроса изменили.

    if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {

    $sql .= " AND (";

    ... и т.д.

    Вот почему они сразу не могут сделать нормальный поиск? Я диву даюсь.

    Без поиска по SKU я совсем пропадаю. Обновился на свое горе до 1.5.1.3

    Кстати, Color Options в 1.5.1.3 не идеальный. Есть что поковырять для опенкарт маркета. )))

  12. 2011-10-10 в 11:01:44 | Ruslan Brest

    Обновил пост, вроде работает. Не делают наверное потому, что поиск по SKU покупателями - довольно редкая идея. А вот в админке да, странно что нет.

    В админке тоже ничего сложного нет, но у меня уже глаза слипаются. Отвлекали по делам, поэтому только в каталоге сделал.

  13. Мне для фронтенда достаточно.

    Сколько куда перевести?

  14. 2011-10-11 в 00:12:38 | Ruslan Brest

    Спасибо :) Изменение мелкое, так что это совсем необязательно.

    Если очень хочется - любой из указанных способов мне удобен (PayPal, Webmoney). Про пайпэл немного описано на странице "Обо мне". А сколько - личное дело каждого.

    Добавил сегодня SKU ещё в админку - см. http://rb.labtodo.com/page/opencart-admin-sku-column

    Если 1.5.1.3 свежая и не успела обрасти изменениями, можно файлы из "admin" поверх скопировать, чтобы вручную не править.

  15. Без поиска по SKU ищет 1 сек.

    Добавил поиск по sku начинает тормозить поиск ищет 4 сек.

    Даже если делаешь только по SKU поиск (т.е. убираешь поиск по полю name) также ищет 4 сек.

    Посоветовали добавить индекс ALTER TABLE `opencart_product` ADD INDEX ( `sku` )

    Вместо "opencart_" свой префикс поставьте

    Помогите пожалуйста.

    Заранее спасибо.

  16. 2011-11-19 в 00:05:35 | Ruslan Brest

    Это я и советовал. Не видя реальную базу, очень сложно гадать, в чём причина и действительно ли с индексом и без него скорость одинакова. В то, что наличие индекса никак не влияет на скорость - не верится.

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

  17. Подскажите пожалуйста. Я нашёл решение для себя. Но как реализовать?

    У меня есть номер 0443812300 (так он забит в базу) как сделать если человек ввёл в поиск 04438-12300 или так 04438-123-00 он игнорировал пробелы и тире и находил нужный номер?

  18. 2011-11-19 в 02:35:35 | Ruslan Brest

    Если запрос будет только в указанном виде, то в файле catalog/controller/product/search.php в самом начале найдите

    if (isset($this->request->get['filter_name'])) {

    $filter_name = $this->request->get['filter_name'];

    } else {

    $filter_name = '';

    }

    и после $filter_name = $this->request->get['filter_name']; добавьте пару строк:

    $ubiraem = array('-', ' ');

    $filter_name = str_replace($ubiraem, '', $filter_name);

  19. Спасибо вам большое. Я опять к вам за советом.

    Проблема такая.

    Когда я захожу в админке в список категорий то:

    Ужасно тормозит, чем больше товаров тем сильнее тормозит.

    И вот, доавил ещё товаров вылезла ошибка

    SELECT * FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) WHERE pd.language_id = '1' GROUP BY p.product_id ORDER BY pd.name ASC LIMIT 0,1000 in /home/a/avtodubai/oae-avto.ru/public_html/system/database/mysql.php on line 49

    если постаить отображение 10 товаров в админке, то ошибка исчезает, но тормозит всё равно ужасно\

    Вот что ответила служба поддержки хостинга.

    Мы проверили выполнение приведенного SQL-запроса и обнаружили что данные, которые скрипт пытается выгрузить в /tmp превышает размер серверного раздела /tmp (4G). Поэтому выполнение запроса завершается с ошибкой.

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

    Подскажите что нужно сделать прямо таки не к кому больше обратиться.

    Заранее спасибо.

  20. 2011-12-07 в 04:17:16 | Ruslan Brest

    Как раз только что в форуме ответил. Лучше там продолжим - у меня сейчас слишком плохо со временем, а там может ещё кто-то присоединится и подскажет.

  21. Добрый вечер, а возможно расширенный поиск разместить на главной, и как это сделать если возможно?

  22. 2012-01-10 в 01:05:39 | Ruslan Brest

    Олег, наверное проще всего будет оформитьстраницу поиска так же, как главную (обвесить её боковыми панелями и т.п.) и настроить редирект на неё.

  23. 2012-02-12 в 22:39:06 | Максим

    Что нужно сделать, чтоб оставить поиск только по артикулу? То есть исключить поиск по модели?

  24. 2012-02-12 в 22:51:34 | Ruslan Brest

    Укоротить соответствующую строчку:

    v1.5.1.3:

    $implode[] = 'LCASE(p.sku) LIKE "%' . $lword . '%"';

    v1.5.1.2 / ocStore 1.0.1:

    $sql_search_model_sku = 'LCASE(p.sku) LIKE "%' . $sFilterName . '%"';

  25. Добрый день, Руслан. Спасибо, за очень полезный пост! Только вот возникла проблема с поиском товара, если искать по артикулу - находит нужную позицию и "все четко", но если вводить название товара полностью (как указано в админке), то находит кучу позиций и нужная не всегда располагается на первой странице поиска. Не знаете в чем может быть дело?

  26. Присоединяюсь к Deus

    Точно такая же проблема. Помогите с решением.

  27. Еще у меня есть такая проблема.

    Сначала сделал так,

    $ubiraem = array('-', ' ');

    $filter_name = str_replace($ubiraem, '', $filter_name); (как было описано ранее)

    Когда я в ПОИСКЕ ввожу например "adventure 3", то пишет "Нет товаров, которые соответствуют критериям поиска.". Но если Я сразу нажимаю опять поиск (в раширеном), то все находит, (потому что уже пробел удалился).

    Как сделать чтобы он сразу учитывался. Чтобы клиенты по два раза не нажимали поиск.?

  28. Спасибо за статью,подскажите, а как реализовать поиск по названию каталогов (категорий), в которых находится товар?

  29. 2012-02-27 в 21:18:53 | Алексей

    Сделал то что указано тут: Улучшение поиска в OpenCart 1.5: поиск по описанию, подкатегориям, по модели и SKU

    Но что-то не работает, т.е. ввожу запрос, строчку из описания товара в главный поиск, ничего не находит, появляется форма расширенного поиска с тем же запросом, ставлю 2 галочки (искать в описании и подкатегориях) делаю опять поиск и находит нужный товар. Что не так, почему после указанной правки при основном поиске не находятся эти результаты? как сделать что поиск работал по умолчанию по описанию товаров и в подкатегориях?

  30. 2012-02-27 в 21:53:25 | Ruslan Brest

    @Алексей: Сайт покажите. Как я могу угадать, что там не так?

    @mx: позже постараюсь ответить про поиск по категориям, времени нет.

  31. Спасибо! Жду с нетерпением!:)

  32. 2012-02-28 в 09:14:13 | Алексей

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

    http://test.life-happy.org.ua/

    ---- rb: ----

    Открываем http://test.life-happy.org.ua/catalog/view/javascript/common.js

    Не вижу, чтобы указанные изменения были внесены. Потому и не работает.

  33. 2012-02-28 в 22:02:47 | Алексей

    Спасибо за подсказку. Действительно программист, почему то решил сделать последнюю правку с Вашей страницы, так как она указана что подходит под 1.5.1.3 а косательно поиска по содержанию в описании, так не указано что работает в 1.5.1.3 не стал делать :))))ох уж эти программисты :) Но странно почему не локалке не работало, хотя та же причина была, файл не заменился, хотя я правил его... сегодня еще раз сделал, работает и там и там. Большое Вам спасибо.

  34. 2012-03-22 в 08:09:53 | Сергей

    Руслан, подскажите, пож-та, как можно сделать, чтобы при поиске строки с пробелом в конце, пробел не учитывался (например, "сладкие ватрушки ")? Из-за этого пробела, в поиск попадают все товары

  35. 2012-03-22 в 09:45:30 | Ruslan Brest

    Действительно. Исправил код для версии 1.5.1.3

  36. 2012-03-22 в 10:17:43 | Сергей

    Руслан, спасибо за фикс...Очень быстро и оперативно отреагировали...

  37. 2012-03-22 в 10:52:36 | Сергей

    Чуть ещё потестировал. При введении в поиск одного или нескольких пробелов выпадает ошибка и выводится полный текст SQL-запроса.

    С ув.

  38. 2012-03-22 в 11:39:12 | Ruslan Brest

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

    Проверьте, может неправильно перенесли исправления?

  39. 2012-03-22 в 21:41:50 | Сергей

    Вроде всё правильно перенёс.

    Вот такая ошибка:

    Notice: Error: 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 'OR LCASE(pt.tag) LIKE '% %' AND pt.language_id = '1' OR LCASE(pt.tag) LIKE '% ' at line 1

    Error No: 1064

    SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_tag pt ON (p.product_id = pt.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available

  40. 2012-03-22 в 22:32:53 | Ruslan Brest

    Ну вот, в ошибке я вижу проблемы с pt.tag - а этого нет и в помине в версии для 1.5.1.3. Я же писал, что только её исправлял - в ней реализован поиск по отдельным словам, я думал речь о ней.

    На более реаннюю версию не смотрел - но там и поиска по отдельным словам нет. Так что определитесь сначала, какая точно у вас версия движка и те ли изменения вы вносили. Потому что приведенная ошибка соответствует коду для 1.5.1 - там как раз и поиск по тегу виднеется.

    Если ничего с версиями не напутали - внесите ещё и там проверку после $sFilterName = ... на пустую строку. Чтобы если пустая - к SQL запросу ничего не дописывалось. Что-то вроде

    if( !empty(trim($sFilterName)) ) и дальше скобочки по смыслу.

    Но поиска по отдельным словам это не добавит. До версии 1513 поиск велся полностью по введенной фразе, и я это не менял.

  41. 2012-03-22 в 23:01:17 | Сергей

    У меня версия ocSrore 1.5.1.3 с последними изменениями из SVN (r357). Может быть, команда ocSrore этот файл оставила от более ранних версий?

    Изменения для поиска делал следующие:

    1) В файле catalog/view/javascript/common.js , как написано в начале Вашей статьи

    2) В файде catalog/model/catalog/product.php как написано в конце Вашей статьи

    Сейчас у меня, в СВН ocStore, в оригинальном OpenCart 1.5.1.3 в файле catalog/model/catalog/product.php нет переменной $sFilterName.

    Создал тему на форуме ocStore (http://opencartforum.ru/topic/8011-поиск-в-ocstore-1513/), предлагаю перенести обсуждения туда.

  42. 2012-03-22 в 23:57:38 | Ruslan Brest

    В ocStore код поиска такой же, как в Opencart 1513. Просмотрите мои правки для этой версии - там нет поиска по тегам. Только SKU, model, name и description. Если взглянете на своё сообщение об ошибке, то увидите там спотыкание рядом с pt.tag. То есть скорей всего всё же напутано что-то с кодом и версиями.

    $sFilterName и не должно быть -- про неё я писал, думая, что вы используете более раннюю версию движка. Она там была мной добавлена. В общем, забудьте про эту переменную. Просто возьмите оригинальный файл из SVN и исправьте его заново правками для этой версии (самый низ статьи).

    Если опять возникнет проблема - я внесу сейчас это в dev branch ocStore на гитхабе, см. https://github.com/rb2/ocstoreru/blob/dev/trunk/catalog/model/catalog/product.php#L56

    Возьмёте тогда оттуда этот файл.

  43. 2012-03-23 в 04:27:35 | Виталий

    Руслан,

    не подскажите, как с таблицу результатов поиска добавить отображение производителя (в виде ссылки) для каждого из найденных товаров?

    Спасибо,

    Виталий.

  44. 2012-03-23 в 05:14:19 | Ruslan Brest

    Спросите на форуме, пожалуйста - вопрос простой, там минимум десяток человек легко на него ответят. Я работать не успеваю.

  45. 2012-05-27 в 17:41:40 | Сергей

    Доброго времени суток!

    Уважаемый Руслан, помогите пожалуйста разобраться.

    Всё сделал, как написано, поиск по SKU работает прекрасно

    Версия движка 1.5.2.1

    Единственный баг, когда отображается страница результата поиска по SKU, то над шапкой в самом верху отображается следующее:

    Notice: Undefined variable: rstock in /***/public_html/vqmod/vqcache/vq2-catalog_controller_product_search.php on line 270Notice: Undefined variable: rstock in /***/public_html/vqmod/vqcache/vq2-catalog_controller_product_search.php on line 270

    Помогите пожалуйста решить проблему, буду век благодарен Вам.

  46. 2012-05-27 в 20:17:17 | Ruslan Brest

    Это конфликт с каким-то из модулей vQmod (или несколькими): исходный код изменился и vQmod не может внести все модификации. В результате появляются ошибки.

    Чтобы найти источник ошибок, попробуйте отключать vqmod-расширения по одному. Или отключить все и включать по одному, чтобы найти, на каком начинает появляться ошибка. Чтобы исправить - Вам надо либо это vQmod расширение переписывать для соответствия изменённому коду, либо внести изменения из xml непосредственно в код Опенкарт.

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

  47. 2012-05-27 в 21:50:57 | Сергей

    К сожалению не владею php на столько хорошо, что бы разобраться и поправить данный глюк, печально (

  48. 2012-05-27 в 22:57:09 | Ruslan Brest

    Значит остается хотя бы найти и отключить тот модуль (или несколько), который приводит к ошибке. Локализовать источник проблемы.

  49. Версия движка 1.5.3 сделал необходимые изменения как написано в начале статьи. Не работает.

  50. Версия движка 1.5.1.3 сделал необходимые изменения как написано в начале статьи. Не работает.

  51. 2012-05-28 в 19:57:31 | Ruslan Brest

    Не верю.

  52. smartoffice-online.ru файл catalog/view/javascript/common.js поправлен

  53. 2012-05-30 в 06:39:05 | Ruslan Brest

    Так и тема-то у Вас не default. И в Шоппике указанный файл вообще не используется, как оказывается.

    Вам надо открыть файл catalog/view/theme/shoppica/js/shoppica.js

    найти в нём функцию moduleSearch()

    парой строк ниже есть строка

    url = 'index.php?route=product/search&filter;_name=' + encodeURIComponent(filter_name);

    и в конце там допишите такую же дописку, как в статье указано. Желательно в одну строку. В общем, должно получиться

    url = 'index.php?route=product/search&filter;_name=' + encodeURIComponent(filter_name) + '&filter_sub_category=true&filter_description=true';

  54. Здравствуйте! Никак не получается сделать "Поиск по модели и SKU (артикулу) - вариант для версии 1.5.1.3 (и наверное выше)"

    Я правильно понял, что необходимо поправить лишь один раз?

    Я в файле catalog/model/catalog/product.php нашёл две строки которые, которые соответствуют под удаление. Вместо них вставил новые, но поиск не находит товар :(

  55. 2012-06-03 в 01:40:02 | Ruslan Brest

    Я менял в одном месте. Номер строки указан (54 - первая строка кода, значит изменения где-то с 57-58 строки идут).

    Хотя не факт, что я не ошибся: судя по всему, второе место - в функции getTotalProducts? Думаю, там тоже надо синхронно менять, чтобы условия запроса были одинаковы. Иначе будет неправильно работать постраничная разбивка при большом кол-ве результатов.

  56. if (!empty($data['filter_description'])) {
          $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
         } else {
          $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'"; }

    Вот таких кода в файле два. Заменил два - не пашет всё равно. Что делать, очень нужная данная штука...

  57. здравствуйте!

    1. как можно сделать поиск по артикулу по точному соответствию поискового запроса (пример: вводим "7", в результате отображается только товар с артикулом "7", а не с артикулом "77", "176", "71" и т.п.?

    2. как прикрутить выбор при поиске (по артикулу, по названию, причем если выбрано "по артикулу", то чекается автоматом "точное соответствие")?

    если писать долго, то направьте, плиз.

    заранее спс. с ув.

    версия maxystore 1.5.3.1

  58. 2012-07-04 в 18:01:11 | Ruslan Brest

    1. В SQL-запросах убирайте "wildcards" (символ "%") из мест со сравнением SKU.

    2. Это смотрите, как реализованы имеющиеся галочки и полностью копируйте эту реализацию для артикула. Изменения затронут все файлы, участвующие в цепочке поиска.

  59. тёзка, сори, не понял куда мне идти)) 2 вопрос в тумане, но попробую, а про первый совсем не соображу. с ув.

  60. 2012-07-05 в 00:41:50 | Ruslan Brest

    1 - изучайте изменения, внесенные в SQL запросы. Они же все в этой статье описаны, и их немного, следовательно, локализовать их несложно. Надо найти места, где SKU анализируется и ищется, и там в "LIKE '%...%'" убрать эти проценты, если нужно искать по точному соответствию, а не "всё, что включает введенную строку"

  61. руслан, спасибо. поиск оказался слишком точным))))) как бы пробелы оставить между символами? буду искать, по-моему у вас где-то видел. еще раз спасибо.)

  62. 2012-07-07 в 10:22:31 | Алексей

    у меня OpenCart 1.5.1.3 сделал правку для поиска по SKU и модели (я так понимаю это для поиска на фронтпейдже?) но что-то не ищет не по SKU ни по Model

    Можете выслать на почту исправленный файл с этой правкой, можете также еще туда сделать несколько правок:

    Очень прошу помочь, так как с поиском замучался, или ничего не находит или вываливает весь магазин...

    мне нужно чтобы был поиск по точной фразе в Имени товара и точной фразе в описании товара (а не по любому вхождению как стоит по дефолту) и чтобы при запросе не учитывались русские слова короче или равные 3-м символам?

    у меня сейчас сделан запрос по точной фразе, есть товар например: Аккумулятор для Palm M500 И если ввести запрос просто Аккумулятор Palm M500 - то уже ничего не находит Если сделать по вхождению слова, то слишком много выводит...всю категорию...

    не могу придумать алгоритм поиска, как лучше, так как или ничего не находит или вываливает всю категорию или почти весь магазин.

    Хочу проэксперементировать, если Вас не затруднит сделать еще одну версию файла с правками для поиска, чтобы он искал по полной фразе в имени товара и описании товара и чтобы также искал по SKU и Model, но чтобы во всех этих случаях, если в поисковом запросе есть и русский и английский текст, то все русское опускается и ищется только по англоязычному вхождению (цифры тоже не трогаются и учитыватся в запосе), а если весь запрос русский то ничего не удаляется а ищется по полной русской фразе, например:

    Запрос: Аккумулятор для Palm m500 "аккумулятор для" должно вырезаться и сработать точный поиск по "Palm m500"

    А если будет просто запрос: Аккумулятор - то ничего не вырезается и ищется по полной указанной русской фразе.

    Если это слишком сложно и у вас нет на это времени, то пожалуйста пришлите файл\ы с первыми правками. Но если сделаете второй вариант тоже и он будет хорошо работать, то готов отблагодарить, так как с поиском вообще беда...

    Очень прошу, помогите пожалуйста.

    моя почта siniy25@yahoo.com

    ася 203-410-102

    ----

    rb: разобрались в переписке

  63. 2012-09-02 в 10:54:22 | Евгений

    Что-то не получается сделать Поиск по описаниям и подкатегориям. Нужно всего лишь в common.js поменять две строчки? Или еще где-то? После замены поиск работает по-прежнему((

  64. 2012-09-02 в 20:44:50 | Ruslan Brest

    Да, только в common.js. Эти изменения просто ставят по умолчанию имеющиеся галочки поиска по описаниям.

    Возможно, этот файл просто закешировался в броузере и работает его старая версия. Попробуйте другим броузером (это проще всего) или полностью очистите кэш своего основного.

    И посмотрите по адресу http://ВАШ.САЙТ/catalog/view/javascript/common.js - убедитесь, что видны внесенные изменения.

  65. 2012-09-02 в 21:29:14 | Евгений

    Да, похоже, это из-за кэширования было. Сейчас все работат. Спасибо!

  66. 2012-09-18 в 06:08:30 | Константин

    Здравствуйте.

    Подскажите, пожалуйста, как решить такую проблему.

    После установки расширенного поиска перестал работать поиск по товарам в создании или редактировании заказа в админке. В модулях, использующих такой же алгоритм поиска он тоже не работает.

    Никак не найду решение этой проблемы. Сможете помочь?

    Заранее благодарю.

  67. 2012-11-04 в 06:06:10 | Алексей

    у меня поиск с Вашей доработкой (сразу ищет по названию, описанию, модели и артикулу) пока товаров было мало, все было хорошо, но сейчас загрузил 40 000 товаров и поиск стал жутко тормозить, запрос обрабатывается минуту иногда больше... в общем совсем не годится.. Есть какие-то варианты или идеи как это можно решить?

  68. 2012-11-05 в 06:21:24 | Ruslan Brest

    Работа Опенкарт с большими количествами товаров -- вообще отдельная и большая тема. Он в своём исходном состоянии для этой задачи плохо подготовлен.

    Первое, что надо сделать - добавить индексы на поля, используемые в поисковых запросах. Если их не было, то это существенно ускорит работу без оптимизации запросов.

    Я над проблемой работы с большими массивами при поиске не задумывался - здесь просто модификация и исправление стандартного механизма поиска в OC (Opencart). Так что может и там есть поле для улучшений. Но этим надо заниматься.

  69. Добрый день.

    Поиск как-то странно работает.

    Сделал все изменения и в common.js и product.php

    1. Ищет только по одному слову (шампунь, воск, бальзам) но никак не "шампунь для волос" или "бальзам для губ"...Подскажите плиз, почему так? Ибо когда пишешь полную фразу ("шампунь для волос") то выводит почти весь ассортимент, и явно результат поиска никого не обрадует...

    2. Периодически "залипает" сам поиск, тоесть пишешь другое слово для поиска, и ничего не происходит...

    Буду весьма благодарен :)

    Сайт: manufaktura-ukraine.com.ua/market/

  70. 2012-12-22 в 02:37:53 | Ruslan Brest

    1. Это стандартное поведение Опенкарт. Он ищет только точное совпадение подстроки. Если терминов несколько - результаты объединяются. Решение проблемы поиска - довольно трудоемкая задача, я советую обратить внимание на модули русскоязычных авторов. Там, где учитывается и семантика, и близость запроса, и строится своя логика выдачи результатов. Та, что в Опенкарт изначально - очень простая и топорная.

    2. Понятия не имею, о чём речь. Это воспроизводится на стандартном демо? Если нет, то ищите проблемы в теме оформления, измененных скриптах. Может ещё где. Не могу ничего конкретного сказать.

  71. Спасибо большое!

  72. Руслан, добрый день

    Вы тут выше давали решение, как игнорировать пробелы и тире при поиске, а можно ли как-то сделать, чтобы поиск игнорировал пробелы и тире в названии товара, т.е. искал только буквы и цифры?

    Например, есть товар с числом в названии. У разных товаров это может быть С101, С1-01 или С1 01. Как научить поиск находить все три варианта вопреки пробелам и тире?

  73. 2013-05-02 в 03:59:51 | Ruslan Brest

    Ося, проще всего включать такое кононизированное написание в описание товара. Или в теги, если они не используются по назначению.

    Существует, конечно, вариант попробовать переложить эту работу на сервер БД и включить кучу логики в и без того большой запрос. Но запрос там и так не подарок, и как это скажется на производительности и на больших количествах товаров... Точнее, что тут гадать? Плохо скажется. Насколько заметно - не знаю.

    Я бы первый вариант выбрал. То ли скриптом раз пройти и дописать эти варианты в конец описания товара ("Варианты названия: C101") и потом вручную это регулировать и править, если потребуется. То ли какую-то кнопку придумать в админке, чтобы вручную эту дописку делать. Тут уже варианты реализации - по обстоятельствам. Кому что удобней в разных ситуациях.

  74. Подскажите пожалуйста,как сделать поиск внутри данной категории.Чтобы я зашел в какую-либо категорию.Там список товаров.Над товарами поле поиска,и чтобы поиск происходил только для данной категории(поле для поиска сам смогу туда вывести,но вот чтобы он искал только в данной категории не знаю как).

  75. 2013-06-01 в 22:34:50 | Ruslan Brest

    Не знаю, разбираться надо. В стандартном поиске этот функционал есть. То есть либо вызывать стандартный поиск, указав ID категории, либо делать динамический AJAX поиск.

  76. подскажите как сделать поиск по ID на сайте и в админке

  77. Спасибо огромное на ОК 1.5.3.1 работает, главное не забыть удалить "+" )))

    спасибо огромное!

  78. Хотелось бы посоветоваться с опытным человеком работающим с opencart (точнее ocstore) версия 1.5.5.1.1, та же самая проблема не работает поиск на главной странице по интеру не срабатывает, а по кнопке поиск не выводит результата переходит на страницу поиска, зато там поиск работает как положено. Устал искать причину перерыл всё.

    ссылка на сайт compik-shop.ru

  79. 2013-12-08 в 18:29:07 | Ruslan Brest
    не работает поиск на главной странице по интеру не срабатывает, а по кнопке поиск не выводит результата переходит на страницу поиска

    Обратитесь к автору шаблона. То, что в яваскриптах, не соответствует вёрстке. Потому и не работает.

  80. 2014-01-14 в 22:18:05 | Виталий

    Подскажите какой вариант использовать для 1.5.4?

  81. Проблем решается очень просто !

    В файле www\catalog\model\catalog\product.php

    заменить

    $words = explode(' ', $data['filter_name']);

    на

    $words[0] = $data['filter_name'];

    И все !!!

  82. 2014-04-22 в 21:29:09 | Ruslan Brest

    1. Какая проблема?

    2. Предложенная замена делает совершенно не то же самое, что задумывалось. Возможно, Вы "программируете методом тыка", не вникая, ЧТО должно происходить в соответствии с алгоритмом.

  83. Вкратце: я создал интернет-магазин на движке Opencart 1.5.4.1 . Он создан на локальном сервере, т.к. идет процесс тестирования ( насколько он подходит …). Одной из категории товара является автомобильные фильтра . Их можно установить как и любой товар, но , к сожалению, найти тот или иной товар для покупателя будет трудно. Чтобы облегчить задачу – нужно сделать многоуровневый поиск на примере интернет-магазина http://www.motoroil.com.ua/filters/ . В ней задача поиска оформлена правильно : если вы знаете марку, модель и тип автомобиля, то вы найдете мгновенно один необходимый фильтр и все предложения по цене от всех производителей ( например, Bosch, Fram, SCT, Sacura и т.д.). Покупателю остается только выбрать бренд и тип фильтра ( воздушный, масляной и т.д.)

    Теперь о базе данных. Его я еще не приобрел, т.к. не знаю ответа - могу ли я его внедрить в Opencart. База для подбора фильтров представляет собой дамп mysql таблиц, в которой находятся параметры для подбора фильтров легковых автомобилей по производителю и марке авто, ознакомится с базой можно здесь http://basecontent.info/stats/podbor_filter/podbor.php

    ознакомительный дамп: http://basecontent.info/stats/podbor_filter/podbor_filters_demo.sql

    В данной базе содержатся размеры и изображения масляных, воздушных и топливных фильтров которые устанавливаются в легковые автомобили, а так же перечень конкретных наименований фильтров подходящих под данные параметры. Перед покупкой необходимо скачать архив с изображениями фильтров: http://basecontent.info/stats/podbor_filter/images_filters.tgz

    Задача заключается в следующем:

    Чтобы внедрить базу в Opencart придётся внедрить код скрипта вывода базы в соответствующие места магазина, т.е. без дополнительных доработок база проста так не заработает т.к. здесь потребуется помощь знающего человека. Посоветуйте, что делать? Спасибо заранее. С уважением, Ердос

Оставьте комментарий!

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

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)