Русский язык в PDOtools WHERE

[[!pdoUsers? 
&sortdir=`DESC` 
&tpl=`user` 
&where=`{"`modUserProfile`.`extended`:LIKE":"%\"callsign\":\"РУССКИЙ ЯЗЫК\"%"}`
]]
строка в базе

{"callsign":"\u041f\u0440\u0438\u0432\u0435\u0442"}
Не выводит ничего. Как исправить?
Konstantin
11 января 2016, 20:29
modx.pro
1
1 752
0

Комментарии: 6

Konstantin
12 января 2016, 00:49
0
При добавлении данных в доп поле modx записывает как есть строку

тобишь доп поле callsign он записывает в базу прям как есть

{"callsign":"\u041d\u0435\u0442"}
вместо того чтобы перевести в русский и хранить в базе на понятном языке

Теперь образовалась проблема как сделать запрос LIKE с русским
или
как научить modx декодировать и записывать в базу уже в нормальном виде русский

    Василий Наумкин
    12 января 2016, 08:31
    0
    вместо того чтобы перевести в русский и хранить в базе на понятном языке
    Приплыли. Это и есть русский, в кодировке UTF-8, просто экранированный.

    Возможность кодирования UTF-8 в JSON без экранирования появилась только в PHP 5.4, когда MODX Revolution уже во всю работал. Естественно, никто не будет увеличивать минимальную версию PHP для MODX только ради этой функции.

    как научить modx декодировать и записывать в базу уже в нормальном виде русский
    Выходит, что никак.

    Но можно хранить эти данные в modUserSetting в виде key => value или создать отдельную таблицу.
    Сергей Шлоков
    12 января 2016, 09:35
    +1
    Так кодирует json_encode. Ну и кодируйте также через сниппет
    [[!pdoUsers? 
    &sortdir=`DESC` 
    &tpl=`user` 
    &where=`[[!convertWhere? &cond=`%"callsign":"РУССКИЙ ЯЗЫК"%`]]`
    ]]
    Сниппет convertWhere
    $a = array('modUserProfile`.`extended`:LIKE'=>$cond);
    return json_encode($a);
    Не тестировал. По идее должен работать.
      Konstantin
      12 января 2016, 17:05
      0
      Сергей, я делал сниппет на подобие
      НО есть особенность,

      при вызове pdoUsers с параметром return sql то в тексте лайк автоматом становится обычный UTF8 понятный глазу (((
      запрос типа
      LIKE":"%\"callsign\":\"\\\u041d\\\u0435\\\u0442\"%
      невозможен ибо происходит перекодировка налету до обращения к базе
      Это наверное не реал осуществлять поиск русского текста в доп полях пользователя.
      Хотя у вас опыта больше может и сможете помочь, а моих знаний не хватает.

      Как то делают связанную таблицу но я не соображу как это делать, где бы была инструкция я бы с удовольствием повторил
        Сергей Шлоков
        12 января 2016, 18:10
        0
        Ну тут мне нечем помочь. Опыта у меня не больше, чем в вас. Пробуйте вариант Василия.
        Konstantin
        12 января 2016, 17:13
        0
        вот такой сниппет делал

        $string = $modx->getOption('string', $scriptProperties, '');
        $string = json_encode($string); // кодируем в JSON строку
        $string = str_replace(array("'",'"'),'',$string); // убрать кавычки
        $string = str_replace('\\','\\\\\\', $string); // экранировать обратные слеши
        
        return $string;
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6