Преамбула
В этой статье я расскажу, как быть, если не загружается список пакетов.
Условия появления проблемы не выяснены, но либо это из-за Windows, либо из-за настроек PHP. Для начала можно просто поиграться с версией PHP: от 5.4 и выше.
В консоли браузера можно увидеть следующую ошибку:
Uncaught SyntaxError: Unexpected token }
Ответ запроса, который должен вернуть список пакетов, выглядит так:
{"success":true,"total":"471","results":}
Как видно, это невалидный JSON.
Решение
Вообще, изменять системные файлы — это плохая практика, потому что проблема может всплыть при обновлении. Но решение такое:
- Открыть файл core/xpdo/xpdo.xpdo.class.php
- Изменить метод toJSON
- Добавить ещё один метод — arrayEncodeUTF8
Код будет выглядеть следующим образом:
/**
* 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;
}