MODX Revolution: если не загружается список пакетов

Преамбула

В этой статье я расскажу, как быть, если не загружается список пакетов.

Условия появления проблемы не выяснены, но либо это из-за Windows, либо из-за настроек PHP. Для начала можно просто поиграться с версией PHP: от 5.4 и выше.

В консоли браузера можно увидеть следующую ошибку:

Uncaught SyntaxError: Unexpected token }

Ответ запроса, который должен вернуть список пакетов, выглядит так:

{"success":true,"total":"471","results":}

Как видно, это невалидный JSON.

Не загружаются пакеты

Решение

Вообще, изменять системные файлы — это плохая практика, потому что проблема может всплыть при обновлении. Но решение такое:

  1. Открыть файл core/xpdo/xpdo.xpdo.class.php
  2. Изменить метод toJSON
  3. Добавить ещё один метод — 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;
}

Комментарии