Подарок тем пользователям OC2, которые ловят ошибки JSON Error при попытках использовать стандартный установщик расширений в OC2 (при правильно прописанных параметрах в настройках магазина на вкладке FTP).
Ошибок оказалось целых три. Причём не у всех хостеров проявлялось: где-то работает инсталл, где-то нет. Повезло исследовать ситуацию на проблемном хостинге - в результате вылечили опенкартовский инсталлятор расширений.
- Исправлена ошибка "PHP Warning: Invalid argument supplied for foreach() ... on line 333";
- Подавление вывода предупреждений "PHP Warning: ftp_mkdir(): Create directory operation failed ... on line 338" (возникает всегда - при попытках создания существующих каталогов, таких как catalog, admin, admin/controller и т.д.);
- включение пассивного режима FTP для устранения ошибки "PHP Warning: ftp_put(): Illegal PORT command ... on line 345"
Также описано на OpencartJazz: OCJ :: OC2 extension installer bugfix. Там прикреплён изменённый файл, но пока его можно скачать только после регистрации и "покупки" за 0.00. Будет время - починю это неудобство.
Для параноиков: мне даром не нужны ваши регистрации и личная информация. Просто мне удобно обслуживать и обновлять файлы в одном месте. И это место на данный момент -- там.
commit a60015450b6516406dcbf15f5e978b43eeee693f Author: Ruslan Brest <rb@labtodo.com> Date: Thu Dec 25 20:43:39 2014 +0200 [!] bugfix OC2 extension installer: - fix "PHP Warning: Invalid argument supplied for foreach() ... on line 333"; - prevent "PHP Warning: ftp_mkdir(): Create directory operation failed ... on line 338" (when existing directories created: catalog, admin, admin/controller, etc.); - prevent "PHP Warning: ftp_put(): Illegal PORT command ... on line 345" diff --git a/public_html/admin/controller/extension/installer.php b/public_html/admin/controller/extension/installer.php index 55f4517..1755cca 100644 --- a/public_html/admin/controller/extension/installer.php +++ b/public_html/admin/controller/extension/installer.php @@ -295,6 +295,10 @@ class ControllerExtensionInstaller extends Controller { $login = ftp_login($connection, $this->config->get('config_ftp_username'), $this->config->get('config_ftp_password')); if ($login) { + + // Prevent "PHP Warning: ftp_put(): Illegal PORT command" + ftp_pasv($connection, true); + if ($this->config->get('config_ftp_root')) { $root = ftp_chdir($connection, $this->config->get('config_ftp_root')); } else { @@ -330,12 +334,16 @@ class ControllerExtensionInstaller extends Controller { // Basename all the directories because on some servers they don't return the fulll paths. $list_data = array(); - foreach ($list as $list) { - $list_data[] = basename($list); + if (FALSE !== $list) { + foreach ($list as $list_item) { + $list_data[] = basename($list_item); + } } if (!in_array(basename($destination), $list_data)) { - if (!ftp_mkdir($connection, $destination)) { + // Prevent "PHP Warning: ftp_mkdir(): Create directory operation failed" when + // existing directories created + if (!@ftp_mkdir($connection, $destination)) { $json['error'] = sprintf($this->language->get('error_ftp_directory'), $destination); } }