Пару дней боролся с 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 не искались русские фрагменты. Кроме того, для русского языка не работал регистронезависимый поиск. С решения этих проблем я и начал. Сразу скажу, что использую такой вариант вызова сниппета:
[[AjaxSearch? &ajaxSearch=`1` &ajaxSearchType=`0` &AS_landing=`10` &moreResultsPage=`10` &language=`russian-UTF8` &ajaxMax=`3` &showMoreResults=`1` &addJscript=`1` &extract=`1` &AS_showResults=`1`]]
1. Проблема – не работает поиск с использованием Ajax для русских слов. Только для слов из латинских букв.
Решение – в файле
AjaxSearch.inc.php в начало функции
connectForAjax() добавить строку:
global $database_connection_charset;
а перед строкой
return $table_prefix; добавить строку:
$lang = mysql_query("SET CHARACTER SET '".$database_connection_charset."'", $db) or die("Charset error : " . mysql_error());
После этого поиск Ajax заработал.
2. Проблема - иногда поисковые запросы не подсвечиваются и не выводится фрагмент, в котором найдено слово (если не совпадает регистр).
Решение (для utf8) – в сниппете AjaxSearch ищется строка
if (preg_match('/' . preg_quote($searchTerm) . '/i', $text)) {
и после /I добавляется u, то есть в итоге должно получиться
if (preg_match('/' . preg_quote($searchTerm) . '/iu', $text)) {
Немного ниже ищется строка,начинающаяся на
$summary .= preg_replace( '/' . preg_quote( $searchTerm, '/' ) . '/i'
и в ней выполняется такая же операция, то есть добавляется 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, правда, бывают некоторые проблемы с хостингом, сайт периодически недоступен.