/** * プラグインをインストールします. * * @param string $archive_file_name アーカイブファイル名. * @param string $key キー. * @return array エラー情報を格納した連想配列. */ public function installPlugin($archive_file_name, $key) { $objQuery =& SC_Query_Ex::getSingletonInstance(); $objQuery->begin(); // 一時展開ディレクトリにファイルがある場合は事前に削除. $arrFileHash = SC_Helper_FileManager_Ex::sfGetFileList(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); if (count($arrFileHash) > 0) { SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false); } //シンタックスエラーがあるtar.gzをアップ後、削除するとたまにディレクトリが消えるので追加 $this->makeDir(PLUGIN_UPLOAD_REALDIR); $arrErr = array(); // 必須拡張モジュールのチェック $arrErr = SC_Plugin_Util_Ex::checkExtension($key); if ($this->isError($arrErr) === true) { return $arrErr; } // ファイルをチェックし一時展開用ディレクトリに展開します. $arrErr = $this->unpackPluginFile($archive_file_name, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $key); if ($this->isError($arrErr) === true) { return $arrErr; } // plugin_infoを読み込み. $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR . 'plugin_info.php', $key); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); return $arrErr; } // リフレクションオブジェクトを生成. $objReflection = new ReflectionClass('plugin_info'); $arrPluginInfo = $this->getPluginInfo($objReflection); // プラグインクラスに必須となるパラメータが正常に定義されているかチェックします. $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); return $arrErr; } // 既にインストールされていないかを判定. if ($this->isInstalledPlugin($arrPluginInfo['PLUGIN_CODE']) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); $arrErr['plugin_file'] = '※ ' . $arrPluginInfo['PLUGIN_NAME'] . 'は既にインストールされています。<br/>'; return $arrErr; } // プラグイン情報をDB登録 if ($this->registerData($arrPluginInfo) === false) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); $arrErr['plugin_file'] = '※ DB登録に失敗しました。<br/>'; return $arrErr; } // プラグイン保存ディレクトリを作成し、一時展開用ディレクトリから移動します. $plugin_dir_path = $this->getPluginDir($arrPluginInfo['PLUGIN_CODE']); $this->makeDir($plugin_dir_path); SC_Utils_Ex::copyDirectory(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin_dir_path); // プラグイン情報を取得 $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($arrPluginInfo['PLUGIN_CODE']); // クラスファイルを読み込み. $plugin_class_file_path = $this->getPluginFilePath($plugin['plugin_code'], $plugin['class_name']); $arrErr = $this->requirePluginFile($plugin_class_file_path, $key); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id']); return $arrErr; } // プラグインhtmlディレクトリ作成 $plugin_html_dir_path = $this->getHtmlPluginDir($plugin['plugin_code']); $this->makeDir($plugin_html_dir_path); $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'install'); if ($this->isError($arrErr) === true) { // エラー時, transactionがabortしてるのでロールバック $objQuery->rollback(); $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id'], $plugin_html_dir_path); return $arrErr; } $objQuery->commit(); // 不要なファイルの削除 SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false); return $arrErr; }
/** * プラグインをインストールします. * * @param string $plugin_code プラグインコード. * @param string $key キー. * @return array エラー情報を格納した連想配列. */ function installPlugin($upload_file_file_name, $key) { // インストール前に不要なファイルを消しておきます. SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false); //シンタックスエラーがあるtar.gzをアップ後、削除するとたまにディレクトリが消えるので追加 $this->makeDir(PLUGIN_UPLOAD_REALDIR); $arrErr = array(); // 必須拡張モジュールのチェック $arrErr = SC_Plugin_Util_Ex::checkExtension($key); if ($this->isError($arrErr) === true) { return $arrErr; } // ファイルをチェックし一時展開用ディレクトリに展開します. $arrErr = $this->unpackPluginFile($upload_file_file_name, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $key); if ($this->isError($arrErr) === true) { return $arrErr; } // plugin_infoを読み込み. $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR . 'plugin_info.php', $key); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); return $arrErr; } // リフレクションオブジェクトを生成. $objReflection = new ReflectionClass('plugin_info'); $arrPluginInfo = $this->getPluginInfo($objReflection); // プラグインクラスに必須となるパラメータが正常に定義されているかチェックします. $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); return $arrErr; } // プラグインコード $plugin_code = $arrPluginInfo['PLUGIN_CODE']; // プラグイン名 $plugin_name = $arrPluginInfo['PLUGIN_NAME']; // 既にインストールされていないかを判定. if ($this->isInstalledPlugin($plugin_code) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); $arrErr['plugin_file'] = '※ ' . $plugin_name . 'は既にインストールされています。<br/>'; return $arrErr; } // プラグイン情報をDB登録 if ($this->registerData($arrPluginInfo) === false) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); $arrErr['plugin_file'] = '※ DB登録に失敗しました。<br/>'; return $arrErr; } // プラグイン保存ディレクトリを作成し、一時展開用ディレクトリから移動します. $plugin_dir_path = PLUGIN_UPLOAD_REALDIR . $plugin_code . '/'; $this->makeDir($plugin_dir_path); SC_Utils_Ex::copyDirectory(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin_dir_path); // プラグイン情報を取得 $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($plugin_code); // クラスファイルを読み込み. $plugin_class_file_path = $plugin_dir_path . $plugin['class_name'] . '.php'; $arrErr = $this->requirePluginFile($plugin_class_file_path, $key); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id']); return $arrErr; } // プラグインhtmlディレクトリ作成 $plugin_html_dir = PLUGIN_HTML_REALDIR . $plugin_code; $this->makeDir($plugin_html_dir); $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'install'); if ($this->isError($arrErr) === true) { $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id'], $plugin_html_dir); return $arrErr; } // 不要なファイルの削除 SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false); return $arrErr; }