示例#1
0
 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");
 }
示例#2
0
 /**
  * プラグインをインストールします.
  *
  * @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;
 }