public function execPlugin() { $this->log("start"); $plugin_code = $this->arrPlugin['plugin_code']; // テーブル作成SQLなどを実行 $arrSql = $this->arrInstallData['sql']; $arrErr = array(); // SQLの検証 foreach ($arrSql as $sql) { $this->log("verify sql: " . $sql['sql']); $error_message = $this->verifySql($sql['sql'], $sql['params']); if (!is_null($error_message)) { $this->log("verify sql: invalid sql " . $sql['sql']); $this->log("verify sql: {$error_message}"); $arrErr[] = $error_message; } } if (count($arrErr) > 0) { return $arrErr; } /* @var $objQuery Query */ $objQuery = Application::alias('eccube.query'); // SQLの実行 if (!Utils::isBlank($arrSql)) { foreach ($arrSql as $sql) { $this->log("exec sql: " . $sql['sql']); $objQuery->query($sql['sql'], $sql['params']); } } $arrInsertQuery = $this->arrInstallData['insert']; if (!Utils::isBlank($arrInsertQuery)) { foreach ($arrInsertQuery as $query) { $objQuery->insert($query['table'], $query['arrVal'], $query['arrSql'], $query['arrSqlVal'], $query['form'], $query['arrFromVal']); } } $arrUpdateQuery = $this->arrInstallData['update']; if (!Utils::isBlank($arrUpdateQuery)) { foreach ($arrUpdateQuery as $query) { $objQuery->update($query['table'], $query['arrVal'], $query['where'], $query['arrWhereVal'], $query['arrRawSql'], $query['arrRawSqlVal']); } } // プラグインのディレクトリコピー $arrCopyDirectories = $this->arrInstallData['copy_directory']; if (!Utils::isBlank($arrCopyDirectories)) { foreach ($arrCopyDirectories as $directory) { $this->log("exec dir copy: " . $directory['src'] . ' -> ' . $directory['dist']); // ディレクトリコピー -> HTML配下とDATA配下を別関数にする Utils::copyDirectory(PLUGIN_UPLOAD_REALDIR . $plugin_code . DIRECTORY_SEPARATOR . $directory['src'], PLUGIN_HTML_REALDIR . $plugin_code . DIRECTORY_SEPARATOR . $directory['dist']); } } // プラグインのファイルコピー $arrCopyFiles = $this->arrInstallData['copy_file']; if (!Utils::isBlank($arrCopyFiles)) { foreach ($arrCopyFiles as $file) { $this->log("exec file copy: " . $file['src'] . ' -> ' . $file['dist']); // ファイルコピー copy(PLUGIN_UPLOAD_REALDIR . $plugin_code . DIRECTORY_SEPARATOR . $file['src'], PLUGIN_HTML_REALDIR . $plugin_code . DIRECTORY_SEPARATOR . $file['dist']); } } $this->log("end"); }
/** * プラグインをインストールします. * * @param string $archive_file_name アーカイブファイル名. * @param string $key キー. * @return array エラー情報を格納した連想配列. */ public function installPlugin($archive_file_name, $key) { $objQuery = Application::alias('eccube.query'); $objQuery->begin(); // 一時展開ディレクトリにファイルがある場合は事前に削除. $arrFileHash = Application::alias('eccube.helper.file_manager')->sfGetFileList(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR); if (count($arrFileHash) > 0) { Application::alias('eccube.helper.file_manager')->deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false); } //シンタックスエラーがあるtar.gzをアップ後、削除するとたまにディレクトリが消えるので追加 $this->makeDir(PLUGIN_UPLOAD_REALDIR); $arrErr = array(); // 必須拡張モジュールのチェック $arrErr = PluginUtil::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); Utils::copyDirectory(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin_dir_path); // プラグイン情報を取得 $plugin = PluginUtil::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(); // 不要なファイルの削除 Application::alias('eccube.helper.file_manager')->deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false); return $arrErr; }