On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Здравствуйте.
    Установил себе wamp 2.5, развернул на нем modx 2.4.2, но возникла проблема при попытке установить пакеты, их список был пуст.
    В консоли Chrome появлялось сообщение об ошибке вида:
    "Uncaught SyntaxError: Unexpected token }"
    в
    Ext.util.JSON.doDecode @ ext-all.js:21
    после запроса:
    /connectors/index.php с параметром action:workspace/packages/rest/getList
    ответ:
    {"success":true,"total":"471","results":}

    у свойства "results" отсутствуют данные, что и вызвало ошибку декодирования JSON.

    Копаясь глубже, было выяснено, что это все происходит в файл \core\xpdo\xpdo.xpdo.class.php:2378 в методе toJSON
    В строке $encoded= json_encode($array); массив $array не пустой, однако, в $encoded содержится NULL.
    Результат вызова json_last_error_msg() после json_encode вернул:
    'Malformed UTF-8 characters, possibly incorrectly encoded'

    Было обнаружено, что в массиве $array присутствовали элементы со значениями [releasedon] => ��� 09, 2014, однако, даты других полей, например: [createdon] => 2014-12-09T05:31:41+0000 или [editedon] => 2015-11-05T08:53:13+0000 в нормальном формате.

    При использовании библиотеки JSON в поставке modx, которая подключается в случае отсутствия расширения json для php, данной ошибки не возникает, однако, дата releasedon отображается как ?003f003f 29, 2015, что, собственно, логично, ибо дата заведомом битая.
    Кто сталкивался с такими проблемами или есть решения подобной проблемы, ведь эти данные приходят с репозитория modx.com?
    • так что, как проблему решили?!
      • Может топорно, но решилось так для PHP >= 5.5
        Добавил метод ниже toJSON и массив прогоняю через этот метод, прежде чем передать функции json_encode

            /**
             * Converts a PHP array into a JSON encoded string.
             *
             * @param array $array The PHP array to convert.
             * @return string The JSON representation of the source array.
             */
            public function toJSON($array) {
                $encoded= '';
                if (is_array ($array)) {
                    if (!function_exists('json_encode')) {
                        if (@ include_once (XPDO_CORE_PATH . 'json/JSON.php')) {
                            $json = new Services_JSON();
                            $encoded= $json->encode($array);
                        }
                    } else {
        
                        $array = self::arrayEncodeUTF8($array);
        
                        $encoded= json_encode($array);
        
                    }
                }
                return $encoded;
            }
        
            public static function arrayEncodeUTF8($array){
        
                foreach($array as $key => $value){
                    if(!is_array($value) && is_string($value)){
                        json_encode($value);
                        if(json_last_error() == 5){
                            $array[$key] = iconv('CP1251', 'UTF-8', $value);
                        }
                    } else {
                        $array[$key] = self::arrayEncodeUTF8($value);
                    }
                }
                return $array;
            }
        
        [ed. note: godyrev last edited this post 3 years, 9 months ago.]
        • Fortunatly, Google translate worked well on this post... that saved my day smiley

          As it is not in english, the problem solved here is about a incorrect json return in ext-js when trying to get packages through the package manager...
          This problem occurs on a WAMP environment.

          To fix the problem, this excellent patch given above fixed it for me...
          this fix should be set in the file \core\xpdo\xpdo.xpdo.class.php:2378

          Thanks godyrev for your fix...
          • Отлично, проблема разрешилась. Спасибо, godyrev.
            • godyrev спасибо, проблема с пустой админкой и управлением пакетами решена благодаря этому исправлению в файле core\xpdo\xpdo.class.php
              MODX установлен на OpenServer, Apache 2.4, PHP 5.6.
              • Немного изменённый метод, который я использую на данный момент, представлен ниже. Добавлено пару проверок и определение кодировки.

                    public static function arrayEncodeUTF8($array){
                
                        if(is_array($array)){
                            foreach($array as $key => $value){
                                if(!is_array($value) && is_string($value)){
                                    json_encode($value);
                                    if(json_last_error() == 5){
                						$enc = mb_detect_encoding($value);
                                        $array[$key] = iconv($enc, 'UTF-8', $value);
                                    }
                                }
                                if(is_array($value)){
                                    $array[$key] = self::arrayEncodeUTF8($value);
                                }
                            }
                        }
                
                		if(is_string($array)){
                			json_encode($array);
                			if(json_last_error() == 5){
                				$enc = mb_detect_encoding($array);
                				return iconv($enc, 'UTF-8', $array);
                			}
                		}
                
                        return $array;
                    }

                P.S Расположение в файле /core/xpdo/xpdo.class.php