function update(array $arrPlugin, SC_Plugin_Installer $installer) { $plugin_code = $arrPlugin["plugin_code"]; GC_Utils_Ex::gfPrintLog("[{$plugin_code}]更新処理を実行します。", PLUGIN_LOG_REALFILE, FALSE); SC_Utils_Ex::copyDirectory(dirname(__FILE__) . "/", PLUGIN_UPLOAD_REALDIR . $plugin_code . "/"); require_once dirname(__FILE__) . '/AutoDisplayCore.php'; $core = new AutoDisplayCore($arrPlugin); $core->install($arrPlugin, $installer); GC_Utils_Ex::gfPrintLog("[{$plugin_code}]更新処理を実行完了しました。", PLUGIN_LOG_REALFILE, FALSE); }
/** * @param array $arrPlugin * @param SC_Plugin_Installer $objPluginInstaller * @see SC_Plugin_Base::install() */ function install($arrPlugin, $objPluginInstaller = null) { // logo コピー $objPluginInstaller->copyDirectory("copy/plugin_dir/", ""); SC_Utils_Ex::copyDirectory(KTC_COPY_MOD_DIR, DATA_REALDIR . "module/"); SC_Utils_Ex::copyDirectory(KTC_COPY_CLASS_DIR, CLASS_REALDIR); SC_Utils_Ex::copyDirectory(KTC_COPY_CLASS_EX_DIR, CLASS_EX_REALDIR); SC_Utils_Ex::copyDirectory(KTC_COPY_HTML_DIR . "user_data/", HTML_REALDIR . USER_DIR); SC_Utils_Ex::copyDirectory(KTC_COPY_HTML_DIR . "au/", HTML_REALDIR . "au/"); SC_Utils_Ex::copyDirectory(KTC_COPY_HTML_DIR . "products/", HTML_REALDIR . "products/"); SC_Utils_Ex::copyDirectory(KTC_COPY_HTML_DIR . "frontparts/bloc", HTML_REALDIR . BLOC_DIR); SC_Utils_Ex::copyDirectory(KTC_COPY_HTML_DIR . "admin/", HTML_REALDIR . ADMIN_DIR); SC_Utils_Ex::copyDirectory(KTC_COPY_TMPL_DIR . "admin/", TEMPLATE_ADMIN_REALDIR); SC_Utils_Ex::copyDirectory(KTC_COPY_TMPL_DIR . "sphone/", SMARTPHONE_TEMPLATE_REALDIR); $this->initDB($arrPlugin, $objPluginInstaller); $this->updateTemplate($arrPlugin, $objPluginInstaller); $this->createCash(); }
/** * 指定されたパスの配下を再帰的にコピーします. * @param string $source_path コピー元ディレクトリのパス * @param string $dest_path コピー先ディレクトリのパス * @return void */ public static function copyDirectory($source_path, $dest_path) { $handle = opendir($source_path); while ($filename = readdir($handle)) { if ($filename === '.' || $filename === '..') { continue; } $cur_path = $source_path . $filename; $dest_file_path = $dest_path . $filename; if (is_dir($cur_path)) { // ディレクトリの場合 // コピー先に無いディレクトリの場合、ディレクトリ作成. if (!empty($filename) && !file_exists($dest_file_path)) { mkdir($dest_file_path); } SC_Utils_Ex::copyDirectory($cur_path . '/', $dest_file_path . '/'); } else { if (file_exists($dest_file_path)) { unlink($dest_file_path); } copy($cur_path, $dest_file_path); } } }
/** * プラグインをインストールします. * * @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; }