On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Часто возникают вопросы, связанные с поиском на сайте - нужен поиск без различения регистра; некорректно работает поиск с русским (украинским, латышским, ...) языком, т.е. отличающимся от английского наличием собственных символов в алфавите.

    Опишу свой способ решения этих вопросов:

    1. Вначале сниппета, который обрабатывает на вашем сайте данные из поисковой формы, прописываем такую директиву (кодировку можете установить свою):
    mb_internal_encoding("UTF-8");

    Таким образом мы установим внутреннюю кодировку символов UTF-8.

    2. Во всем сниппете выбираем строковые функции и добавляем к ним приставку mb_ (мультибайтный). Таким образом у нас уже должен по идее корректно работать поиск с языками, отличными от английского.

    3. Чтобы поиск стал неразборчив к регистру, необходимо перед запросом сравнения в БД привести все данные к одному регистру.
    3.1. Для переменной, содержащей строку с искомыми данными, проделываем следующее:
    $searchString = mb_strtolower($searchString);

    т.е. приводим всю строку к нижнему регистру.
    3.2. Тоже самое надо сделать с хранимыми данными в БД, с которыми будет производиться сравнение. Для этого в SQL запросе используем функцию MySQL: LOWER.
    $sql = "SELECT id, pagetitle, description, content, introtext ";
    $sql .= "FROM $tbl ";
    $sql .= "WHERE (LOWER(pagetitle) LIKE '%$searchString%' OR LOWER(description) LIKE '%$searchString%' 
             OR LOWER(content) LIKE '%$searchString%' 
             OR LOWER(introtext) LIKE '%$searchString%') ";
    $sql .= "AND $tbl.published = 1 AND $tbl.searchable=1 AND $tbl.deleted=0;";

    3.3. Выполняем $sql запрос в БД.

    Собственно говоря, это все. Вопросы, комментарии - welcome smiley
      Разработка сайтов и программных модулей на MODX.
      Опыт работы на MODx с 2005 года. Высокое качество.
      Компания Baltic Design Colors: http://www.bdcolors.ru.
    • спасибо за отличный [TIP]:)! Механизм PublicSerach от Google похоже не настолько развит чтобы понимать кириллицую Скорее всего поспользуюсь твоим вариантом.

      PS добавь пожалуйста префикс [СОВЕТ] к своей теме, чтобы видно было сразу... как это принято на общем форуме smiley
        http://modx.ru - российская поддержка MODx
        http://newscup.ru - экспериментальный проект
        http://yentsun.com - персональный сайт
      • ОК, добавлю smiley

        PS: Написал по английски, ибо слово СОВЕТ слишком большое, название топика обрезалось и искажалось
          Разработка сайтов и программных модулей на MODX.
          Опыт работы на MODx с 2005 года. Высокое качество.
          Компания Baltic Design Colors: http://www.bdcolors.ru.
        • Спасибо, Игорь.
          С твоей помощью всё, что связано с кодировками, у меня заработало. Поэтому уверен - поиск тоже заработает. )
          Проделал шаги
          1) без комментариев
          2) заменил ВСЕ строковые функции..
          попались на глаза
          strip_tags, strtolower, strlen, substr, preg_match_all, strpos, substr_replace. stripslashes, urldecode, urlencode, preg_replace, и ещё какие-то мелкие...
          3) Третий шаг пока не делал

          Страница с формой поиска HyperFlexSearchForm (v.2r4) вообще не открывается.. Чистый лист...
          Ладно бы просто не работал, как до этого.... laugh
          • Проверь внимательно все измененные функции, к примеру mb_strip_tags - такой функции нет в PHP, да и зачем, если strip_tags просто удаляет HTML и PHP тэги из строки, т.е. не влияет никаким образом на сам текст и результат ее действия никак не может зависеть от текста. Проверять на существование мультибайтные функции здесь: http://lv2.php.net/manual/ru/ref.mbstring.php
              Разработка сайтов и программных модулей на MODX.
              Опыт работы на MODx с 2005 года. Высокое качество.
              Компания Baltic Design Colors: http://www.bdcolors.ru.
            • Опс! Оказывается, по первому пункту есть комментарий.
              Вернул всё как было изначально. Единственно -- добавил строку mb_internal_encoding("UTF-8");
              в самое начало сниппета HyperFlexSearchForm.
              Может, я куда-то не туда вставил?
              просто с добавлением одной только этой строки перестаёт отображаться вся страница. Даже <title>...
              PHP 4.4.4
              Кодировка UTF-8. (Успешно проделал всё, что ты советовал в посте "MySQL, UTF-8 и русский язык")

              P.S. Спасибо за ответ - только что прочитал ответ насчет справочника по мультибайтным функциям. Сейчас разберусь.
              • Quote from: yurican at Mar 03, 2007, 09:33 AM

                Опс! Оказывается, по первому пункту есть комментарий.
                Вернул всё как было изначально. Единственно -- добавил строку mb_internal_encoding("UTF-8");
                в самое начало сниппета HyperFlexSearchForm.
                Может, я куда-то не туда вставил?
                Туда, туда, там и есть ей самое место smiley
                Quote from: yurican at Mar 03, 2007, 09:33 AM

                просто с добавлением одной только этой строки перестаёт отображаться вся страница. Даже <title>...
                PHP 4.4.4
                Кодировка UTF-8. (Успешно проделал всё, что ты советовал в посте "MySQL, UTF-8 и русский язык")
                А это для меня великая загадка smiley Чтобы пропадал даже title, это странно.
                Я могу сказать, что однажды ко мне в приват обратился болгарин, у него тоже стояла проблема поиска с кириллическим алфавитом и кодировкой UTF-8. По-русски он практически не понимал, сумел ему все объяснить на английском. В итоге было много благодарностей, даже звал к себе в гости в Софию smiley Я это к чему.. правильной дорогой идете, товарищ (c) Должно все получиться wink
                  Разработка сайтов и программных модулей на MODX.
                  Опыт работы на MODx с 2005 года. Высокое качество.
                  Компания Baltic Design Colors: http://www.bdcolors.ru.
                • УРАААА!
                  Игорь -- памятник тебе. grin
                  к тому же та ссылка, которую ты дал, оказалась исчерпывающей.

                  Для тех, кто столкнётся с подобным:
                  В php.ini должна быть поддержка библиотеки mb_string.dll и настроены соответствующие параметры в [mbstring]

                  А вот там везде пугают Function Overloading’ом
                  It is not recommended to use the function overloading option in the per-directory context, because it’s not confirmed yet to be stable enough in a production environment and may lead to undefined behaviour.
                  Это страшно? Или.... как с этим бороться? )

                  А вообще... приезжай лучше к нам. ))
                  • Quote from: yurican at Mar 03, 2007, 10:44 AM

                    А вот там везде пугают Function Overloading’ом
                    It is not recommended to use the function overloading option in the per-directory context, because it’s not confirmed yet to be stable enough in a production environment and may lead to undefined behaviour.
                    Это страшно? Или.... как с этим бороться? )
                    Проще всего - забить на это дело wink Все работает оченно хорошо на многих сайтах, никаких проблем замечено не было.
                    Quote from: yurican at Mar 03, 2007, 10:44 AM

                    А вообще... приезжай лучше к нам. ))
                    К вам - это куда? Россия-матушка? smiley Так я был там не раз, даже жил до 20 лет.. Летом вот еще собираюсь на родину, в ростовские степи.. Так что лучше уж вы к нам smiley Ладно, флуд прекращаем )
                      Разработка сайтов и программных модулей на MODX.
                      Опыт работы на MODx с 2005 года. Высокое качество.
                      Компания Baltic Design Colors: http://www.bdcolors.ru.
                    • Ну, в общем, СПАСИБО, ИГОРЬ. Кто скажет, что это флуд? -в личку. grin