We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 785
    • 2,113 Posts
    Пару дней боролся с 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, правда, бывают некоторые проблемы с хостингом, сайт периодически недоступен.
      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
      Статьи о MODx, регулярно новые публикации
      • 22526
      • 15 Posts
      Здравствуйте.
      Попробовал добавить :
      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());

      приведенный вами в другой теме.

      спасибо.

      есть вопрос:
      как сделать чтобы "Щелкните здесь, чтобы увидеть все результаты." переходила на страницу со всеми результатами. Создал страницу "Поиск", но что прописывать в шаблоне не знаю.

      и ещё, в результатах поиска вместо некоторых букв появляются знаки вопроса, это устранимо? вот пример:
      ...�тных лиц за наличный и безналичный расчет: Тиражирование на ризографе(бланки, листовки и т.д); Полноцветн�...

      заранее вам спасибо!
        • 785
        • 2,113 Posts
        Quote from: p13sitive at Oct 01, 2007, 05:44 AM

        вывел:
        Charset error : Unknown character set: ’’
        как это можно исправить?

        Если не забыли дописать global $database_connection_charset;, то это значение не установлено.

        В файле manager/includes/config.inc.php пропишите
        $database_connection_charset = 'utf8';

        Это, кстати, важно не только для AjaxSearch. По умолчанию при установке MODx почему-то не задает правильное значение.

        Quote from: p13sitive at Oct 01, 2007, 05:44 AM

        как сделать чтобы "Щелкните здесь, чтобы увидеть все результаты." переходила на страницу со всеми результатами. Создал страницу "Поиск", но что прописывать в шаблоне не знаю.

        Рекомендую почитать документацию. Там сказано:

        &moreResultsPage [целое] (по умолчанию - 1) - ID страницы «все результаты». Эта страница должна также содержать вызов сниппета.

        В моем примере вызова сниппета ID страницы равен 10. На странице результатов стоит
        [!AjaxSearch? &AS_showForm=`0` &ajaxSearch=`0`!]


        Quote from: p13sitive at Oct 01, 2007, 05:44 AM

        и ещё, в результатах поиска вместо некоторых букв появляются знаки вопроса, это устранимо? вот пример:

        Это означает, что не работает расширение mbstring. А оно у вас установлено? То есть extension_loaded(’mbstring’) выдает истину или ложь? Если ложь, следует установить это расширение (настроить PHP).
          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 22526
          • 15 Posts
          По поводу кодировки попровил, спасибо.

          extension_loaded(’mbstring’) выдает false, сайт стоит на денвере. Простите за невежество, но как можно в Денвере включить mbstring?

          нашел интересный баг в ajaxsearch. При показе всех ответов он может добавить несколько "вырезок" из конктретных страниц. Так вот, у меня прай-лист хранится в таблицах, когда он вытаскивает найденную информацию он вместе с ней вытягивает теги <table> <tr> <td> и другие, которые естественно не закрывает smiley из-за чего весь шаблон расплывается и обрамляет себя рамкой таблицы. Мб, как-то можно исключить теги в результатах поиска, поискал в документации, там таких параметров не указано sad ?

          Заранее вам большое спасибо.
            • 785
            • 2,113 Posts
            Quote from: p13sitive at Oct 02, 2007, 11:05 AM

            extension_loaded(’mbstring’) выдает false, сайт стоит на денвере. Простите за невежество, но как можно в Денвере включить mbstring?

            Денвером не пользуюсь, а так надо в конфигурации PHP указать, чтобы подключилось mbstring. Подробнее http://lv.php.net/manual/ru/ref.mbstring.php

            Quote from: p13sitive at Oct 02, 2007, 11:05 AM

            вытягивает теги <table> <tr> <td> и другие, которые естественно не закрывает smiley
            Если это происходить только при Ajax-поиске (то есть при переходе на страницу такого нет) то нужно в файле AjaxSearch.php найти строку strip_tags( $text ); и поменять ее на $text= strip_tags( $text ); :’(

            Чтобы проблема исчезла при простом поиске (не Ajax), точно такие же действия (строку strip_tags( $text ); поменять на $text= strip_tags( $text );) нужно выполнить в сниппете AjaxSearch.

            У меня на сайте табличные теги нормально удаляются (я вообще-то эту строку раньше тоже исправил, просто не написал об этом grin).
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 36823
              • 334 Posts
              В денвере по умолчанию нет фйала php_mbstring.dll.
              Скачиваете архив с нужной версией php, копируете файл в \usr\local\php5\ext или (\usr\local\php\ext) - зависит от версии php.
              В php.ini раскоментируете соответствующую строку.
                • 22526
                • 15 Posts

                Если это происходить только при Alax-поиске (то есть при переходе на страницу такого нет) то нужно в файле AjaxSearch.php найти строку strip_tags( $text ); и поменять ее на
                $text= strip_tags( $text ); :’(

                У меня на сайте табличные теги нормально удаляются (я вообще-то эту строку раньше тоже исправил, просто не написал об этом grin).


                нет, поиск без аякса и это происходит при переходе на страницу "со всеми результатами".
                  • 785
                  • 2,113 Posts
                  Еще один глюк!

                  Проблема: если в документе используются HTML-сущности, такие, как

                  »  «


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

                  Решение: в файле AjaxSearch.inc.php в функции function SmartSubstr вставить первой строкой

                  $text=html_entity_decode($text, ENT_QUOTES , 'UTF-8');


                  Кстати, аналогичная проблема есть и в Ditto, там тоже могут обрезаться HTML-сущности rolleyes. Вообще что-то меня стало несколько раздражать обилие недоработок embarrassed.
                    Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                    Статьи о MODx, регулярно новые публикации
                    • 897
                    • 1,620 Posts
                    у вас есть возможность писать в багтрак систему. это опенсоурс.
                      "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                      Не используйте Revo для "просто сайтов". Используйте Evo

                      Who can defeat the Russian bear?
                      • 785
                      • 2,113 Posts
                      Quote from: p13sitive at Oct 02, 2007, 12:29 PM

                      нет, поиск без аякса и это происходит при переходе на страницу "со всеми результатами".

                      Исправил предыдущее сообщение - то же самое нужно сделать в сниппете.
                        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                        Статьи о MODx, регулярно новые публикации