/** * CSSファイルのリストを取得. * * @param string $css_dir CSSディレクトリ * @return array ファイルリスト */ public function getCSSList($css_dir) { $objFileManager = new SC_Helper_FileManager_Ex(); $arrFileList = $objFileManager->sfGetFileList($css_dir); foreach ($arrFileList as $val) { if (!$val['is_dir']) { $arrCSSList[] = array('file_name' => $val['file_name'], 'css_name' => preg_replace('/(.+)\\.(.+?)$/', '$1', $val['file_name'])); } } return $arrCSSList; }
/** * プラグインをインストールします. * * @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; }
/** * ユーザが作成したファイルをアーカイブしダウンロードさせる * TODO 要リファクタリング * @param string $dir アーカイブを行なうディレクトリ * @param string $template_code テンプレートコード * @return boolean 成功した場合 true; 失敗した場合 false */ function downloadArchiveFiles($dir, $template_code) { // ダウンロードされるファイル名 $dlFileName = 'tpl_package_' . $template_code . '_' . date('YmdHis') . '.tar.gz'; $debug_message = $dir . ' から ' . $dlFileName . " を作成します...\n"; // ファイル一覧取得 $arrFileHash = SC_Helper_FileManager_Ex::sfGetFileList($dir); $arrFileList = array(); foreach ($arrFileHash as $val) { $arrFileList[] = $val['file_name']; $debug_message .= '圧縮:' . $val['file_name'] . "\n"; } GC_Utils_Ex::gfPrintLog($debug_message); // ディレクトリを移動 chdir($dir); // 圧縮をおこなう $tar = new Archive_Tar($dlFileName, true); if ($tar->create($arrFileList)) { // ダウンロード用HTTPヘッダ出力 header("Content-disposition: attachment; filename={$dlFileName}"); header("Content-type: application/octet-stream; name={$dlFileName}"); header('Cache-Control: '); header('Pragma: '); readfile($dlFileName); unlink($dir . '/' . $dlFileName); return true; } else { return false; } }
/** * Page のプロセス. * * @return void */ function process() { //---- 認証可否の判定 $objSess = new SC_Session(); SC_Utils_Ex::sfIsSuccess($objSess); // ルートディレクトリ $top_dir = USER_PATH; $objView = new SC_AdminView(); $objQuery = new SC_Query(); $objFileManager = new SC_Helper_FileManager_Ex(); if (!isset($_POST['mode'])) { $_POST['mode'] = ""; } // 現在の階層を取得 if ($_POST['mode'] != "") { $now_dir = $_POST['now_file']; } else { // 初期表示はルートディレクトリ(user_data/)を表示 $now_dir = $top_dir; } // ファイル管理クラス $objUpFile = new SC_UploadFile($now_dir, $now_dir); // ファイル情報の初期化 $this->lfInitFile($objUpFile); switch ($_POST['mode']) { // ファイル表示 case 'view': // エラーチェック $arrErr = $this->lfErrorCheck(); if (!is_array($arrErr)) { // 選択されたファイルがディレクトリなら移動 if (is_dir($_POST['select_file'])) { ///$now_dir = $_POST['select_file']; // ツリー遷移用のjavascriptを埋め込む $arrErr['select_file'] = "※ ディレクトリを表示することは出来ません。<br/>"; } else { // javascriptで別窓表示(テンプレート側に渡す) // FIXME XSS対策すること $file_url = ereg_replace(USER_PATH, "", $_POST['select_file']); $this->tpl_onload = "win02('./file_view.php?file=" . $file_url . "', 'user_data', '600', '400');"; } } break; // ファイルダウンロード // ファイルダウンロード case 'download': // エラーチェック $arrErr = $this->lfErrorCheck(); if (!is_array($arrErr)) { if (is_dir($_POST['select_file'])) { // ディレクトリの場合はjavascriptエラー $arrErr['select_file'] = "※ ディレクトリをダウンロードすることは出来ません。<br/>"; } else { // ファイルダウンロード $objFileManager->sfDownloadFile($_POST['select_file']); exit; } } break; // ファイル削除 // ファイル削除 case 'delete': // エラーチェック $arrErr = $this->lfErrorCheck(); if (!is_array($arrErr)) { $objFileManager->sfDeleteDir($_POST['select_file']); } break; // ファイル作成 // ファイル作成 case 'create': // エラーチェック $arrErr = $this->lfCreateErrorCheck(); if (!is_array($arrErr)) { $create_dir = ereg_replace("/\$", "", $now_dir); // ファイル作成 if (!$objFileManager->sfCreateFile($create_dir . "/" . $_POST['create_file'], 0755)) { // 作成エラー $arrErr['create_file'] = "※ " . $_POST['create_file'] . "の作成に失敗しました。<br/>"; } else { $this->tpl_onload .= "alert('フォルダを作成しました。');"; } } break; // ファイルアップロード // ファイルアップロード case 'upload': // 画像保存処理 $ret = $objUpFile->makeTempFile('upload_file', false); if ($ret != "") { $arrErr['upload_file'] = $ret; } else { $this->tpl_onload .= "alert('ファイルをアップロードしました。');"; } break; // フォルダ移動 // フォルダ移動 case 'move': $now_dir = $this->lfCheckSelectDir($_POST['tree_select_file']); break; // 初期表示 // 初期表示 default: break; } // トップディレクトリか調査 $is_top_dir = false; // 末尾の/をとる $top_dir_check = ereg_replace("/\$", "", $top_dir); $now_dir_check = ereg_replace("/\$", "", $now_dir); if ($top_dir_check == $now_dir_check) { $is_top_dir = true; } // 現在の階層より一つ上の階層を取得 $parent_dir = $this->lfGetParentDir($now_dir); // 現在のディレクトリ配下のファイル一覧を取得 $this->arrFileList = $objFileManager->sfGetFileList($now_dir); $this->tpl_is_top_dir = $is_top_dir; $this->tpl_parent_dir = $parent_dir; $this->tpl_now_dir = $now_dir; $this->tpl_now_file = basename($now_dir); $this->arrErr = isset($arrErr) ? $arrErr : ""; $this->arrParam = $_POST; // ツリーを表示する divタグid, ツリー配列変数名, 現在ディレクトリ, 選択ツリーhidden名, ツリー状態hidden名, mode hidden名 $treeView = "fnTreeView('tree', arrTree, '{$now_dir}', 'tree_select_file', 'tree_status', 'move');"; if (!empty($this->tpl_onload)) { $this->tpl_onload .= $treeView; } else { $this->tpl_onload = $treeView; } // ツリー配列作成用 javascript if (!isset($_POST['tree_status'])) { $_POST['tree_status'] = ""; } $arrTree = $objFileManager->sfGetFileTree($top_dir, $_POST['tree_status']); $this->tpl_javascript .= "arrTree = new Array();\n"; foreach ($arrTree as $arrVal) { $this->tpl_javascript .= "arrTree[" . $arrVal['count'] . "] = new Array(" . $arrVal['count'] . ", '" . $arrVal['type'] . "', '" . $arrVal['path'] . "', " . $arrVal['rank'] . ","; if ($arrVal['open']) { $this->tpl_javascript .= "true);\n"; } else { $this->tpl_javascript .= "false);\n"; } } // 画面の表示 $objView->assignobj($this); $objView->display(MAIN_FRAME); }