We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 9670
    • 48 Posts
    О том и речь. Язык задан правильно, даже через параметр &language, сервер отлично работает с UTF, mbstring и проч. установлены, кодировка в базе utf. (( А главное — что не на всех выдачах, а примерно в 50% результатов
      • 1788
      • 1,103 Posts
      UTF-8 это всетаки 2 байта в русской кодировке. Происходит обрезка до байта, вот и видим не читаемый символ. Было уже решение подобной проблемы на форуме.
        • 785
        • 2,113 Posts
        Quote from: antey at Sep 20, 2009, 12:38 AM

        Происходит обрезка до байта, вот и видим не читаемый символ. Было уже решение подобной проблемы на форуме.
        В последних версиях AjaxSearch старые проблемы решены - если все настройки правильные и сервер работает нормально (и использует PHP5), проблем быть не должно. Почему они все же возникают - неизвестно. А если не в режиме Ajax искать, проблема остается?
          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 9670
          • 48 Posts
          Да, решение было, да, в новой версии все переделали, и старое решение уже ничего не решает.

          Да, источник проблемы — обрезка одного байта.

          На сколько я на данный момент смог разобраться, проблема теперь кроется в файле search.class.inc.php, где собственно в функции getExtract() и производится нарезка. Там непонятный мне пока способ поиска пробелов в словах. И вот он-то как раз за счёт постоянного то прибавления, то убавления единичек в разных выражениях берет текст то с четного байта, то с нечетного, отсюда и возникает у некоторых результатов вопросики, а у некоторых — нет.

          Да, кстати, пробелы в словах эта функция так же не находит sad
            • 9670
            • 48 Posts
            Итак, временно сделал для себя вот такую заглушку файле search.class.inc.php
            function getExtract($text, $searchString, $advSearch, $highlightClass, & $nbExtr) {
            if (($text !== '') && ($searchString !== '') && ($this->extractNb > 0) && ($advSearch !== 'nowords')){
              if (($this->dbCharset == 'utf8') && ($this->cfg['mbstring'])) {
                if (version_compare(PHP_VERSION, '5.0.0', '>=')) $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
                } else {
                $text = html_entity_decode($text, ENT_QUOTES);
                }
                // рубим входящий текст на часть до первого найденого слова и после
            $text = preg_split("/" . mb_strtolower(preg_quote($searchString), "UTF-8") . "/iu", $text);
                // отсекаем слева половину от лимита на длину анонса
            $left = mb_substr($text['0'], -($this->cfg['extractLength'] - mb_strlen($searchString))/2);
                // отсекаем справа половину от лимита на длину анонса
            $right = mb_substr($text['1'], 0, ($this->cfg['extractLength'] - mb_strlen($searchString))/2);
                // отрезаем слева кусок до первого пробела
            $left = preg_replace("/^[^ ]* /i", "", $left);
                // отрезаем справа кусок до последнего пробела
            $right = preg_replace("/(.*) [^ ]*/i", "$1", $right);
                // добавляем многоточия
            $left = $this->cfg['extractEllips'].$left;
            $right = $right.$this->cfg['extractEllips'];
                // добавляем подсветку
            if ($this->cfg['highlightResult']){$searchString = "<span class=\"".$highlightClass." ".$highlightClass.$rank."\">".$searchString."</span>";}
                // собираем все три части
            }
            return $left.$searchString.$right;
            }
            


            Слова выделяет четко, режет как надо, многоточия ставит, знаки вопросов в ромбике не рисует, длинна почти соответствует заданной за вычетом двух обрезков по краям и плюс-минус слово. Образец работы — http://www.skulsky.ru. Что делать с оригинальной функцией — ума не приложу, может тоже кто поможет, или у одного меня такая фигня? sad
              • 785
              • 2,113 Posts
              Quote from: Fil at Sep 20, 2009, 11:43 AM

              или у одного меня такая фигня? sad
              Скорее всего именно так...
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации
                • 23156
                • 15 Posts
                как сделать поиск по своим таблицам а не по тем что по умолчанию?
                  • 9670
                  • 48 Posts
                  Quote from: petyzbl at Sep 22, 2009, 08:44 AM

                  как сделать поиск по своим таблицам а не по тем что по умолчанию?

                  параметры &whereSearch и &order. Тут http://wiki.modxcms.com/index.php/AjaxSearch все есть
                    • 23156
                    • 15 Posts
                    Спасибо огромное! смотрел параметры, но тот как то прошел мимо))
                    но вылетает ошибка:
                    AjaxSearch error: table users not defined in the configuration file: !

                    добавлял таблицу и в конфиг и в вызов сниппета, одно и то же

                    AjaxSearch error: table not defined in the configuration file
                    means that you use an unknown table with the whereSearch parameter. Check the whereSearch parameter and your configuration file.

                    вот пишет проверить конфиг, но что там добавлять?

                    нашел описание таблиц в search.class.inc.php ... сейчас попробую добавить
                      • 23156
                      • 15 Posts
                      надо искать в таблице modx_users в полях nick, first, middle, last, description. В поле ’hide’ везде ’0’, в поле ’date_add’ хранится дата добавления.
                      добавляю в search.class.inc.php код:

                      	// users
                              case 'users':
                                $this->joined[] = array(
                                    'tb_name' => $this->getShortTableName('users'),
                                    'tb_alias' => 'users',
                                    'id' => 'id',
                                    'searchable' => array('nick','first','middle','last','description'),
                                    'displayed' => array('nick','first','middle','last','description'),
                                    'date' => array('date_add'),
                                    'filters' => array()
                                );
                                $j = count($this->joined) - 1;
                                if ($pfields != '' ) {
                                  unset($this->joined[$j]['searchable']);
                                  if ($pfields == 'null' or $pfields == 'NULL') $this->main['searchable'] = array();
                                  else $this->main['searchable'] = explode(',',$pfields); // overwrite the default values
                      
                                }
                                // comments should be published
                                $j = count($this->joined) - 1;
                                $this->joined[$j]['filters'][] = array(
                                    'field' => 'hide',
                                    'oper' => '=',
                                    'value' => '0'
                                );
                                break;
                      


                      пытаюсь искать выражение которое точно есть, но не находит... что неправильно?