Интеграция поиска в компонент InstantCMS 1.10.4+

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО

Что не так делаю?

#1 17 августа 2015 в 00:21
Всем привет!

Итак, я пытаюсь сделать интеграцию поиска для своего (ну почти) компонента объявлений по этому мануалу.

В компоненте есть таблица, в которой хранится информация об объекте объявления, например, об инструменте. По этой таблице я и хочу сделать поиск.

Вот её структура:
  1. `icms_ads_units` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(80) NOT NULL,
  4. `id_owner` int(10) NOT NULL,
  5. `phone1` varchar(20) NOT NULL,
  6. `phone2` varchar(20) NOT NULL,
  7. `created_at` datetime NOT NULL,
  8. `description` text,
  9. `region_id` int(10) NOT NULL,
  10. `region_title` varchar(100) NOT NULL,
  11. `city_id` int(10) NOT NULL,
  12. `city_title` varchar(80) NOT NULL,
  13. PRIMARY KEY (`id`),
  14. FULLTEXT KEY `title` (`title`, `phone1`, `phone2`, `description`, `region_title`, `city_title`)
  15. ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
Как видно из структуры, fulltext key следующий: `title`, `phone1`, `phone2`, `description`, `region_title`, `city_title`.

В файле psearch.php я пишу следующее:
  1. <?php
  2. function search_instruments($query, $look){
  3.  
  4. $inDB = cmsDatabase::getInstance();
  5. $searchModel = cms_model_search::initModel();
  6.  
  7. // created_at НЕ fulltext index
  8. $sql = "SELECT `id`, `title`, `phone1`, `phone2`, `created_at`, `description`, `region_title`, `city_title`, `is_sell`
  9. FROM `icms_ads_units`
  10. WHERE MATCH(`title`, `phone1`, `phone2`, `description`, `region_title`, `city_title`) AGAINST ('$query' IN BOOLEAN MODE)";
  11.  
  12.  
  13. $result = $inDB->query($sql);
  14.  
  15. if ($inDB->num_rows($result)){
  16.  
  17. while($item = $inDB->fetch_assoc($result)){
  18.  
  19. $result_array = array();
  20.  
  21. $result_array['link'] = "/instruments/show/".$item['id'].".html";
  22. $result_array['place'] = "Инструменты";
  23. $result_array['placelink'] = "/instruments";
  24. $result_array['description'] = $searchModel->getProposalWithSearchWord($item['description']);
  25. $result_array['title'] = $item['title']." в г.".$item['city_title'];
  26. $result_array['pubdate'] = $item['created_at'];
  27. $result_array['session_id'] = session_id();
  28.  
  29. $searchModel->addResult($result_array);
  30. }
  31. }
  32.  
  33. return;
  34. }
  35. ?>
Запрос
SELECT `id`, `title`, `phone1`, `phone2`, `created_at`, `description`, `region_title`, `city_title`, `is_sell`
FROM `icms_instruments_units`
WHERE MATCH(`title`, `phone1`, `phone2`, `description`, `region_title`, `city_title`) AGAINST ('$query' IN BOOLEAN MODE)"
прекрасно работает сам по себе, если, например, запустить его в phpmyadmin. Вводишь вместо $query искомое слово, и если оно встречается в хотя бы одном поле из индекса, то запрос возвращает соответствующие записи.

Однако, при использовании на сайте через компонент поиска (поиск по нужному компоненту конечно активирован), результатов поиска нет. Моя ошибка явно в файле psearch.php. Но я уже все варианты перебрал, и никак не могу понять, в чём дело. Знатоки наверняка сразу увидят ошибку. Надеюсь.

Помогите, пожалуйста, разобраться, почему не работает поиск, что не так.
#2 17 августа 2015 в 04:06
Shaman, В админке то поиск по компоненту включили?
#3 17 августа 2015 в 13:35
WALTERZ, да, конечно.

поиск по нужному компоненту конечно активирован

Shaman

В компоненте поиска в админке напротив нужного мне компонента стоит галочка. Также на странице поиска sitename.ru/search галочка стоит. Результатов возвращает 0. Хотя на самом деле этот же запрос, проведённый к базе напрямую, возвращает результаты.
#4 17 августа 2015 в 13:42
Как я заметил, во всех файлах psearch.php от разработчиков инстанта используются join'ы в запросах к БД. Может быть, дело в какой-то мистике, и если запрос без join'а (так как это попросту не нужно), то система волшебно перестаёт работать? laughСмех смехом, но я уже столько времени безуспешно потратил на поиск решения, что начинаю верить в чудеса.

Очень надеюсь на помощь. Может, свежим взглядом получится найти причину.
#5 17 августа 2015 в 14:06

используются join'ы в запросах к БД. Может быть, дело в какой-то мистике, и если запрос без join'а (так как это попросту не нужно), то система волшебно перестаёт работать?

Shaman
из разряда если почесать правую ногу, то какой глаз будет дергаться при лунном свете.

Включите режим отладки в админке, скорее всего просто ошибка sql.

Если не поможет, то делайте отладку, вставляя print_r(); die; в местах кода, например перед
  1. $searchModel->addResult($result_array);
вставляйте
  1. print_r($result_array);die;
Если и в этом случае ничего не будет, то делайте в самом начале функции die($query);. В общем, стандартные процедуры отладки.
#6 17 августа 2015 в 20:56

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

Fuze
Так а я о чём? laugh

Спасибо за рекомендации!

В общем, ответ найден. Префикс таблицы в запросе нужно оставлять, как указано в мануале, даже если в базе префикс таблицы другой. Инстант сам потом всё меняет. Вот так вот. Столько времени из-за незадокументированной в мануале особенности.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.