/** * ディレクトリの作成(途中のディレクトリも自動生成) * * @param string $dir ディレクトリ * @param string $name_encoding 日本語ファイル・フォルダ名のエンコーディング * @return mixed 正常時...ファイル内容/エラー時...FALSE */ function make_dir($dir, $name_encoding = '') { // フォルダが存在しない場合、ディレクトリの作成 $dir_array = explode("/", $dir); $dest_dir = $this->zip_work_dir; foreach ($dir_array as $dir) { if ($dir != '') { $dir = $name_encoding != '' ? mb_convert_encoding($dir, $name_encoding) : $dir; $dest_dir .= '/' . $dir; ACSLib::make_dir($dest_dir); } } }
/** * バックアップコンテンツの作成 * * @param string $encoding エンコーディング */ function make_contents($encoding = '') { $diary_row_array = ACSDiary::get_diary_row_array($this->user_community_id); // 日記が存在しない場合は何もせず終了 if (count($diary_row_array) == 0) { return; } // ダイアリフォルダとイメージフォルダの作成 ACSLib::make_dir($this->diary_dir); ACSLib::make_dir($this->img_dir); $contents = ''; $diary_array = array(); $months_array = array(); foreach ($diary_row_array as $diary_row) { if ($diary_row['delete_flag'] == 'f') { // html実態ファイルを作成 $html_file = $this->create_diary_html($diary_row, $encoding); $post_tm = ACSLib::convert_pg_date_to_timestamp($diary_row['post_date']); $ym = date("Ym", $post_tm); // 年月用フォーマットの生成 if (!array_key_exists($ym, $months_array)) { $ym_str = ACSMsg::get_mdmsg(__FILE__, 'YEAR_MONTH'); $ym_str = str_replace('{YEAR}', date("Y", $post_tm), $ym_str); $ym_str = str_replace('{MONTH}', date("m", $post_tm), $ym_str); $months_array[$ym] = mb_ereg_replace('@MONTHLY_TITLE@', htmlspecialchars($ym_str), _ACSDIARYBACKUP_INDEX_MONTHLY_FORMAT); } $ymd = ACSLib::convert_pg_date_to_str($diary_row['post_date']); // 日記インデックスの生成 $diary_contents = _ACSDIARYBACKUP_INDEX_DAIRY_FORMAT; $diary_contents = mb_ereg_replace('@YMD@', htmlspecialchars($ymd), $diary_contents); $diary_contents = mb_ereg_replace('@DIARY_URL@', htmlspecialchars($this->index_to_diary_url . '/' . $html_file), $diary_contents); $diary_contents = mb_ereg_replace('@DIARY_SUBJECT@', htmlspecialchars($diary_row['subject']), $diary_contents); $diary_array[$ym] .= $diary_contents; } } // index.htmlの生成 $contents = ""; foreach ($diary_array as $ym => $diary_contents) { $contents .= mb_ereg_replace('@DIARY_CONTENTS@', $diary_contents, $months_array[$ym]); } $contents = mb_ereg_replace('@CONTENTS@', $contents, _ACSDIARYBACKUP_INDEX_FORMAT); // 漢字コードの変換 if ($encoding != '') { $contents = mb_convert_encoding($contents, $encoding); } // indexファイルの出力 $fp = fopen($this->contents_dir . '/index.html', "w"); fputs($fp, $contents); fclose($fp); }
function execute() { $context = $this->getContext(); $controller = $context->getController(); $request = $context->getRequest(); $user = $context->getUser(); $acs_user_info_row = $user->getAttribute('acs_user_info_row'); // 更新対象となるユーザコミュニティIDを取得 $user_community_id = $acs_user_info_row['user_community_id']; // ワークディレクトリの作成(存在しない場合) $work_dir = ACS_CONTENTS_BACKUP_DIR; ACSLib::make_dir($work_dir); $work_dir .= $user_community_id . '/'; ACSLib::make_dir($work_dir); $work_dir .= ACS_BACKUP_ZIP_DIR_NAME; ACSLib::make_dir($work_dir); // バックアップ用ZIPクラスの生成 $zip = new ACSZip($work_dir); // Folder, Diary ディレクトリを作成しておく(0件対応) ACSLib::make_dir($work_dir . '/' . ACS_BACKUP_MYFOLDER_SUBDIR_NAME); ACSLib::make_dir($work_dir . '/' . ACS_BACKUP_MYDIARY_SUBDIR_NAME); // ----- マイフォルダバックアップコンテンツの生成 // フォルダ取得用の配列を設定 $form = array('q' => '', 'order' => 'name'); // フォルダの取得 $folder_row_array = ACSUserFolder::search_folder_row_array($user_community_id, $form); // パス情報の設定 foreach ($folder_row_array as $index => $folder_row) { $target_folder_obj = new ACSUserFolder($user_community_id, $acs_user_info_row, $folder_row['folder_id']); // パス $path_folder_obj_array = $target_folder_obj->get_path_folder_obj_array(); $path_array = array(); foreach ($path_folder_obj_array as $path_folder_obj_index => $path_folder_obj) { if ($path_folder_obj_index != 0) { array_push($path_array, $path_folder_obj->get_folder_name()); } } // ディレクトリを作成(空ディレクトリ対応) $zip->make_dir(ACS_BACKUP_MYFOLDER_SUBDIR_NAME . '/' . implode("/", $path_array), ACS_BACKUP_NAME_ENCODING); } // ファイルの取得 $file_info_row_array = ACSUserFolder::search_file_info_row_array($user_community_id, $form); // パス情報の設定 foreach ($file_info_row_array as $index => $file_info_row) { $target_folder_obj = new ACSUserFolder($user_community_id, $acs_user_info_row, $file_info_row['folder_id']); // パス $path_folder_obj_array = $target_folder_obj->get_path_folder_obj_array(); $path_array = array(); foreach ($path_folder_obj_array as $path_folder_obj_index => $path_folder_obj) { if ($path_folder_obj_index != 0) { array_push($path_array, $path_folder_obj->get_folder_name()); } } array_push($path_array, $file_info_row['display_file_name']); $file_info_row_array[$index]['path_array'] = $path_array; } // マイフォルダのフォルダ構成でファイルを配置 $dest_path_array = array(); foreach ($file_info_row_array as $file_info_row) { $from_path = ACS_FOLDER_DIR . $file_info_row['server_file_name']; $dest_path = ACS_BACKUP_MYFOLDER_SUBDIR_NAME . '/' . implode("/", $file_info_row['path_array']); // 同一名ファイル時の連番付加対応 $dest_path_array[$dest_path]++; if ($dest_path_array[$dest_path] > 1) { $count = $dest_path_array[$dest_path]; mb_ereg('.*(\\.[^\\.\\/]*$)', $dest_path, $matches); $ext = $matches[1]; if ($ext) { $dest_path = mb_ereg_replace('\\.[^\\.\\/]*$', '', $dest_path); } $dest_path .= '_' . ($count - 1) . $ext; } $zip->entry($from_path, $dest_path, ACS_BACKUP_NAME_ENCODING); } // ----- マイダイアリバックアップコンテンツの生成 $diary_backup = new ACSDiaryBackup($user_community_id, $work_dir . '/' . ACS_BACKUP_MYDIARY_SUBDIR_NAME); $diary_backup->make_contents(ACS_BACKUP_NAME_ENCODING); // ダウンロード時ZIPファイル名の生成 $download_filename = 'ACSBackup_' . date('Ymd', time()) . '.zip'; // バックアップzipアーカイブの作成(zip圧縮の実行) $zip->commpress(); $zip->download($download_filename); // 不必要なワークファイルの削除 $zip->clear_work_dir_and_files(); }