/**
  * 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);
 }