tpl_mainpage = 'contents/file_manager.tpl'; $this->tpl_mainno = 'contents'; $this->tpl_subno = 'file'; $this->tpl_maintitle = 'コンテンツ管理'; $this->tpl_subtitle = 'ファイル管理'; } /** * Page のプロセス. * * @return void */ public function process() { $this->action(); $this->sendResponse(); } /** * Page のアクション. * * @return void */ public function action() { // フォーム操作クラス $objFormParam = new SC_FormParam_Ex(); // パラメーター情報の初期化 $this->lfInitParam($objFormParam); $objFormParam->setParam($this->createSetParam($_POST)); $objFormParam->convParam(); // ファイル管理クラス $objUpFile = new SC_UploadFile_Ex($objFormParam->getValue('now_dir'), $objFormParam->getValue('now_dir')); // ファイル情報の初期化 $this->lfInitFile($objUpFile); // ファイル操作クラス $objFileManager = new SC_Helper_FileManager_Ex(); switch ($this->getMode()) { // フォルダ移動 case 'move': $objFormParam = new SC_FormParam_Ex(); $this->lfInitParamModeMove($objFormParam); $objFormParam->setParam($this->createSetParam($_POST)); $objFormParam->convParam(); $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { $now_dir = $this->lfCheckSelectDir($objFormParam, $objFormParam->getValue('tree_select_file')); $objFormParam->setValue('now_dir', $now_dir); } break; // ファイル表示 case 'view': $objFormParam = new SC_FormParam_Ex(); $this->lfInitParamModeView($objFormParam); $objFormParam->setParam($this->createSetParam($_POST)); $objFormParam->convParam(); $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { if ($this->tryView($objFormParam)) { $pattern = '/' . preg_quote($objFormParam->getValue('top_dir'), '/') . '/'; $file_url = htmlspecialchars(preg_replace($pattern, '', $objFormParam->getValue('select_file'))); $tpl_onload = "eccube.openWindow('./file_view.php?file=". $file_url ."', 'user_data', '600', '400');"; $this->setTplOnLoad($tpl_onload); } } break; // ファイルダウンロード case 'download': $objFormParam = new SC_FormParam_Ex(); $this->lfInitParamModeView($objFormParam); $objFormParam->setParam($this->createSetParam($_POST)); $objFormParam->convParam(); $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { if (is_dir($objFormParam->getValue('select_file'))) { $disp_error = '※ ディレクトリをダウンロードすることは出来ません。
'; $this->setDispError('select_file', $disp_error); } else { $path_exists = SC_Utils::checkFileExistsWithInBasePath($objFormParam->getValue('select_file'),USER_REALDIR); if ($path_exists) { // ファイルダウンロード $objFileManager->sfDownloadFile($objFormParam->getValue('select_file')); SC_Response_Ex::actionExit(); } } } break; // ファイル削除 case 'delete': $objFormParam = new SC_FormParam_Ex(); $this->lfInitParamModeView($objFormParam); $objFormParam->setParam($this->createSetParam($_POST)); $objFormParam->convParam(); $this->arrErr = $objFormParam->checkError(); $path_exists = SC_Utils::checkFileExistsWithInBasePath($objFormParam->getValue('select_file'),USER_REALDIR); if (SC_Utils_Ex::isBlank($this->arrErr) && ($path_exists)) { $objFileManager->deleteFile($objFormParam->getValue('select_file')); } break; // ファイル作成 case 'create': $objFormParam = new SC_FormParam_Ex(); $this->lfInitParamModeCreate($objFormParam); $objFormParam->setParam($this->createSetParam($_POST)); $objFormParam->convParam(); $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { if (!$this->tryCreateDir($objFileManager, $objFormParam)) { $disp_error = '※ '.htmlspecialchars($objFormParam->getValue('create_file'), ENT_QUOTES).'の作成に失敗しました。
'; $this->setDispError('create_file', $disp_error); } else { $tpl_onload = "alert('フォルダを作成しました。');"; $this->setTplOnLoad($tpl_onload); } } break; // ファイルアップロード case 'upload': // 画像保存処理 $ret = $objUpFile->makeTempFile('upload_file', false); if (SC_Utils_Ex::isBlank($ret)) { $tpl_onload = "alert('ファイルをアップロードしました。');"; $this->setTplOnLoad($tpl_onload); } else { $this->setDispError('upload_file', $ret); } break; // 初期表示 default: break; } // 値をテンプレートに渡す $this->arrParam = $objFormParam->getHashArray(); // 現在の階層がルートディレクトリかどうかテンプレートに渡す $this->setIsTopDir($objFormParam); // 現在の階層より一つ上の階層をテンプレートに渡す $this->setParentDir($objFormParam); // 現在いる階層(表示用)をテンプレートに渡す $this->setDispPath($objFormParam); // 現在のディレクトリ配下のファイル一覧を取得 $this->arrFileList = $objFileManager->sfGetFileList($objFormParam->getValue('now_dir')); // 現在の階層のディレクトリをテンプレートに渡す $this->setDispParam('tpl_now_file', $objFormParam->getValue('now_dir')); // ディレクトリツリー表示 $this->setDispTree($objFileManager, $objFormParam); } /** * 初期化を行う. * * @param SC_FormParam $objFormParam SC_FormParamインスタンス * @return void */ public function lfInitParam(&$objFormParam) { // 共通定義 $this->lfInitParamCommon($objFormParam); } /** * ディレクトリ移動時、パラメーター定義 * * @param SC_FormParam $objFormParam SC_FormParam インスタンス * @return void */ public function lfInitParamModeMove(&$objFormParam) { // 共通定義 $this->lfInitParamCommon($objFormParam); $objFormParam->addParam('選択ファイル', 'select_file', MTEXT_LEN, 'a', array()); } /** * ファイル表示時、パラメーター定義 * * @param SC_FormParam $objFormParam SC_FormParam インスタンス * @return void */ public function lfInitParamModeView(&$objFormParam) { // 共通定義 $this->lfInitParamCommon($objFormParam); $objFormParam->addParam('選択ファイル', 'select_file', MTEXT_LEN, 'a', array('SELECT_CHECK')); } /** * ファイル表示時、パラメーター定義 * * @param SC_FormParam $objFormParam SC_FormParam インスタンス * @return void */ public function lfInitParamModeCreate(&$objFormParam) { // 共通定義 $this->lfInitParamCommon($objFormParam); $objFormParam->addParam('選択ファイル', 'select_file', MTEXT_LEN, 'a', array()); $objFormParam->addParam('作成ファイル名', 'create_file', MTEXT_LEN, 'a', array('EXIST_CHECK', 'FILE_NAME_CHECK_BY_NOUPLOAD')); } /** * ファイル表示時、パラメーター定義 * * @param SC_FormParam $objFormParam SC_FormParam インスタンス * @return void */ public function lfInitParamCommon(&$objFormParam) { $objFormParam->addParam('ルートディレクトリ', 'top_dir', MTEXT_LEN, 'a', array()); $objFormParam->addParam('現在の階層ディレクトリ', 'now_dir', MTEXT_LEN, 'a', array()); $objFormParam->addParam('現在の階層ファイル', 'now_file', MTEXT_LEN, 'a', array()); $objFormParam->addParam('ツリー選択状態', 'tree_status', MTEXT_LEN, 'a', array()); $objFormParam->addParam('ツリー選択ディレクトリ', 'tree_select_file', MTEXT_LEN, 'a', array()); } /* * ファイル情報の初期化 * * @param object $objUpFile SC_UploadFileインスタンス * @return void */ public function lfInitFile(&$objUpFile) { $objUpFile->addFile('ファイル', 'upload_file', array(), FILE_SIZE, true, 0, 0, false); } /** * テンプレートに渡す値を整形する * * @param array $arrVal $_POST * @return array $setParam テンプレートに渡す値 */ public function createSetParam($arrVal) { $setParam = $arrVal; // Windowsの場合は, ディレクトリの区切り文字を\から/に変換する $setParam['top_dir'] = (strpos(PHP_OS, 'WIN') === false) ? USER_REALDIR : str_replace('\\', '/', USER_REALDIR); // 初期表示はルートディレクトリ(user_data/)を表示 if (SC_Utils_Ex::isBlank($this->getMode())) { $setParam['now_dir'] = $setParam['top_dir']; } return $setParam; } /** * テンプレートに値を渡す * * @param string $key キー名 * @param string $val 値 * @return void */ public function setDispParam($key, $val) { $this->$key = $val; } /** * ディレクトリを作成 * * @param object $objFileManager SC_Helper_FileManager_Exインスタンス * @param SC_FormParam $objFormParam SC_FormParamインスタンス * @return boolean ディレクトリ作成できたかどうか */ public function tryCreateDir($objFileManager, $objFormParam) { $create_dir_flg = false; $create_dir = rtrim($objFormParam->getValue('now_dir'), '/'); // ファイル作成 if ($objFileManager->sfCreateFile($create_dir.'/'.$objFormParam->getValue('create_file'), 0755)) { $create_dir_flg = true; } return $create_dir_flg; } /** * ファイル表示を行う * * @param SC_FormParam $objFormParam SC_FormParamインスタンス * @return boolean ファイル表示するかどうか */ public function tryView(&$objFormParam) { $view_flg = false; $now_dir = $this->lfCheckSelectDir($objFormParam, dirname($objFormParam->getValue('select_file'))); $objFormParam->setValue('now_dir', $now_dir); if (!strpos($objFormParam->getValue('select_file'), $objFormParam->getValue('top_dir'))) { $view_flg = true; } return $view_flg; } /** * 現在の階層の一つ上の階層のディレクトリをテンプレートに渡す * * @param SC_FormParam $objFormParam SC_FormParamインスタンス * @return void */ public function setParentDir($objFormParam) { $parent_dir = $this->lfGetParentDir($objFormParam->getValue('now_dir')); $this->setDispParam('tpl_parent_dir', $parent_dir); } /** * 現在の階層のパスをテンプレートに渡す * * @param SC_FormParam $objFormParam SC_FormParamインスタンス * @return void */ public function setDispPath($objFormParam) { // Windows 環境で DIRECTORY_SEPARATOR が JavaScript に渡るとエスケープ文字と勘違いするので置換 $html_realdir = str_replace(DIRECTORY_SEPARATOR, '/', HTML_REALDIR); $arrNowDir = preg_split('/\//', str_replace($html_realdir, '', $objFormParam->getValue('now_dir'))); $this->setDispParam('tpl_now_dir', SC_Utils_Ex::jsonEncode($arrNowDir)); $this->setDispParam('tpl_file_path', $html_realdir); } /** * エラーを表示用の配列に格納 * * @param string $key キー名 * @param string $value エラー内容 * @return void */ public function setDispError($key, $value) { // 既にエラーがある場合は、処理しない if (SC_Utils_Ex::isBlank($this->arrErr[$key])) { $this->arrErr[$key] = $value; } } /** * javascriptをテンプレートに渡す * * @param string $tpl_onload javascript * @return void */ public function setTplOnLoad($tpl_onload) { $this->tpl_onload .= $tpl_onload; } /* * 選択ディレクトリがUSER_REALDIR以下かチェック * * @param object $objFormParam SC_FormParamインスタンス * @param string $dir ディレクトリ * @return string $select_dir 選択ディレクトリ */ public function lfCheckSelectDir($objFormParam, $dir) { $select_dir = ''; $top_dir = $objFormParam->getValue('top_dir'); // USER_REALDIR以下の場合 if (preg_match("@^\Q". $top_dir. "\E@", $dir) > 0) { // 相対パスがある場合、USER_REALDIRを返す. if (preg_match("@\Q..\E@", $dir) > 0) { $select_dir = $top_dir; // 相対パスがない場合、そのままディレクトリパスを返す. } else { $select_dir= $dir; } // USER_REALDIR以下でない場合、USER_REALDIRを返す. } else { $select_dir = $top_dir; } return $select_dir; } /** * 親ディレクトリ取得 * * @param string $dir 現在いるディレクトリ * @return string $parent_dir 親ディレクトリ */ public function lfGetParentDir($dir) { $parent_dir = ''; $dir = rtrim($dir, '/'); $arrDir = explode('/', $dir); array_pop($arrDir); foreach ($arrDir as $val) { $parent_dir .= "$val/"; } $parent_dir = rtrim($parent_dir, '/'); return $parent_dir; } /** * ディレクトリツリー生成 * * @param object $objFileManager SC_Helper_FileManager_Exインスタンス * @param SC_FormParam $objFormParam SC_FormParamインスタンス * @return void */ public function setDispTree($objFileManager, $objFormParam) { $tpl_onload = ''; // ツリーを表示する divタグid, ツリー配列変数名, 現在ディレクトリ, 選択ツリーhidden名, ツリー状態hidden名, mode hidden名 $now_dir = $objFormParam->getValue('now_dir'); $treeView = "eccube.fileManager.viewFileTree('tree', arrTree, '$now_dir', 'tree_select_file', 'tree_status', 'move');"; if (!empty($this->tpl_onload)) { $tpl_onload .= $treeView; } else { $tpl_onload = $treeView; } $this->setTplOnLoad($tpl_onload); $tpl_javascript = ''; $arrTree = $objFileManager->sfGetFileTree($objFormParam->getValue('top_dir'), $objFormParam->getValue('tree_status')); $tpl_javascript .= "arrTree = new Array();\n"; foreach ($arrTree as $arrVal) { $tpl_javascript .= 'arrTree['.$arrVal['count'].'] = new Array('.$arrVal['count'].", '".$arrVal['type']."', '".$arrVal['path']."', ".$arrVal['rank'].','; if ($arrVal['open']) { $tpl_javascript .= "true);\n"; } else { $tpl_javascript .= "false);\n"; } } $this->setDispParam('tpl_javascript', $tpl_javascript); } /** * 現在の階層がルートディレクトリかどうかテンプレートに渡す * * @param object $objFormParam SC_FormParamインスタンス * @return void */ public function setIsTopDir($objFormParam) { // トップディレクトリか調査 $is_top_dir = false; // 末尾の/をとる $top_dir_check = rtrim($objFormParam->getValue('top_dir'), '/'); $now_dir_check = rtrim($objFormParam->getValue('now_dir'), '/'); if ($top_dir_check == $now_dir_check) { $is_top_dir = true; } $this->setDispParam('tpl_is_top_dir', $is_top_dir); } }