/**
  * プラグインをインストールします.
  *
  * @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;
 }