[FAQ] AjaxSeach — проблемы и решения
Пару дней боролся с AjaxSeach и решил выложить результаты в отдельной теме, хотя ранее уже кое-чего писал в теме http://modxcms.com/forums/index.php/topic,18528.msg116076.html#msg116076
Сразу отмечу, что советы в теме http://modxcms.com/forums/index.php/topic,6778.msg47528.html#msg47528 не помогают, так как описанные проблемы отсутствуют в версии AjaxSearch 1.6, входящей в состав MODx 0.9.6. Зато есть другие проблемы, которые я и собираюсь описать.
Все описанное ниже выполнялось на MODx 0.9.6 с AjaxSearch 1.6, кодировка сайта и базы MySQL UTF-8, сравнение utf8_unicode_ci, PHP 5 и MySQL 5.
Вначале после установки системы без каких-либо усилий заработал поиск без использования Ajax, но при использовании Ajax не искались русские фрагменты. Кроме того, для русского языка не работал регистронезависимый поиск. С решения этих проблем я и начал. Сразу скажу, что использую такой вариант вызова сниппета:
1. Проблема – не работает поиск с использованием Ajax для русских слов. Только для слов из латинских букв.
Решение – в файле AjaxSearch.inc.php в начало функции connectForAjax() добавить строку:
После этого поиск Ajax заработал.
2. Проблема — иногда поисковые запросы не подсвечиваются и не выводится фрагмент, в котором найдено слово (если не совпадает регистр).
Решение (для utf8) – в сниппете AjaxSearch ищется строка
и в ней выполняется такая же операция, то есть добавляется u после i.
Далее точно такие же две строки следует отредактировать в файле AjaxSearch.php. После этого подсветка работает и все выводится как надо.
Для остальных проблем найдены не слишком универсальные решения, так что подробно решения я описывать не буду.
3. Проблема – если на какой-то странице есть комментарий вида
и при вырезании фрагмента с найденной фразой вырезалась часть комментария, вся структура HTML рушится. Решение – добавил удаление комментариев в обработке найденного.
4. Проблема – если в найденной странице имеется символ процента – %, весь Ajax-поиск рушится. То есть выдает ошибку распознавания URL (это, как мне кажется, проблема реализации Ajax в mootools, хотя могу и ошибаться).
Решение (не слишком удачное) – % меняю на «проц.». При этом если перейти на страницу поиска или на найденную страницу, там будут знаки %, слово «проц.» только в Ajax-результатах.
5. Проблема – функция urlencode правильно кодирует строки, когда не используется Ajax, и не кодирует, когда он используется (получаются адреса с русскими буквами).
Решение: использовать urlencode(urlencode($searchString)).
6. Проблема – по умолчанию при использовании Ajax-поиска выдается код, не проходящий валидацию CSS.
Решение: исправить кое-чего в файле templates.inc.php. Вообще-то я в нем и с самого начала что-то правил, сейчас уже не помню что.
7. Проблема – если из результатов поиска перейти на страницу при включенной подсветке, подсвечены будут все найденные слова на этой странице. Но если регистр слов не совпадает с тем, что был в поисковом запросе, подсветка не работает. То есть, после выполненного Ajax-поиска, например, слова «СтИль», перейдя по ссылке «Щелкните здесь, чтобы увидеть все результаты поиска.» можно увидеть подсвеченные фрагменты, но если перейти по ссылке на один из найденных документов, подсветка исчезнет. Если же искать «стиль», подсветка не исчезает.
Решение – не найдено. Подозреваю, что где-то надо в preg_replace добавить u после I, но где – не знаю.
Исправлено — найденное решение описано ниже, на следующей странице.
Подозреваю, что проблем намного больше, чем я описал. Если про обычном поиске нештатные ситуации обрабатываются системой MODx, при Ajax-поиске все должно обрабатываться в самом сниппете, а этого не делается. Да и выводимые результаты плохо обрабатываются перед выдачей – наверняка могут возникнуть проблемы, аналогичные комментариям и знакам процента.
Пример работающего поиска, в котором исправлены найденные недочеты, можно посмотреть на сайте e-kao.ru, правда, бывают некоторые проблемы с хостингом, сайт периодически недоступен.
Здравствуйте.
Попробовал добавить :
mysql_query(«SET CHARACTER SET ’».$database_connection_charset.»’», $db) or die(«Charset error : » . mysql_error());
перед return $table_prefix;
вывел:
Charset error : Unknown character set: ’’
как это можно исправить?
все исправил изменением запроса с четким указанием кодирвки
$lang = mysql_query(«SET CHARACTER SET ’utf8’», $db) or die(«Ошибка в запросе установки языка : » . mysql_error());
приведенный вами в другой теме.
есть вопрос:
как сделать чтобы «Щелкните здесь, чтобы увидеть все результаты.» переходила на страницу со всеми результатами. Создал страницу «Поиск», но что прописывать в шаблоне не знаю.
и ещё, в результатах поиска вместо некоторых букв появляются знаки вопроса, это устранимо? вот пример:
. �тных лиц за наличный и безналичный расчет: Тиражирование на ризографе(бланки, листовки и т.д); Полноцветн�.
заранее вам спасибо!
вывел:
Charset error : Unknown character set: ’’
как это можно исправить?
Если не забыли дописать global $database_connection_charset;, то это значение не установлено.
В файле manager/includes/config.inc.php пропишите
Это, кстати, важно не только для AjaxSearch. По умолчанию при установке MODx почему-то не задает правильное значение.
Quote from: p13sitive at Oct 01, 2007, 05:44 AM
как сделать чтобы «Щелкните здесь, чтобы увидеть все результаты.» переходила на страницу со всеми результатами. Создал страницу «Поиск», но что прописывать в шаблоне не знаю.
Рекомендую почитать документацию. Там сказано:
&moreResultsPage [целое] (по умолчанию — 1) — ID страницы «все результаты». Эта страница должна также содержать вызов сниппета.
В моем примере вызова сниппета ID страницы равен 10. На странице результатов стоит
Quote from: p13sitive at Oct 01, 2007, 05:44 AM
и ещё, в результатах поиска вместо некоторых букв появляются знаки вопроса, это устранимо? вот пример:
По поводу кодировки попровил, спасибо.
extension_loaded(’mbstring’) выдает false, сайт стоит на денвере. Простите за невежество, но как можно в Денвере включить mbstring?
нашел интересный баг в ajaxsearch. При показе всех ответов он может добавить несколько «вырезок» из конктретных страниц. Так вот, у меня прай-лист хранится в таблицах, когда он вытаскивает найденную информацию он вместе с ней вытягивает теги
и другие, которые естественно не закрывает Заранее вам большое спасибо. | |
и другие, которые естественно не закрывает 🙂 [/quote] Если это происходить только при Ajax-поиске (то есть при переходе на страницу такого нет) то нужно в файле [b]AjaxSearch.php[/b] найти строку [b]strip_tags( $text );[/b] и поменять ее на [b]$text= strip_tags( $text );[/b] :'( Чтобы проблема исчезла при простом поиске (не Ajax), точно такие же действия (строку [b]strip_tags( $text );[/b] поменять на [b]$text= strip_tags( $text );[/b]) нужно выполнить в сниппете AjaxSearch. У меня на сайте табличные теги нормально удаляются (я вообще-то эту строку раньше тоже исправил, просто не написал об этом ;D). «>
Денвером не пользуюсь, а так надо в конфигурации PHP указать, чтобы подключилось mbstring. Подробнее http://lv.php.net/manual/ru/ref.mbstring.php Quote from: p13sitive at Oct 02, 2007, 11:05 AM
|