示例#1
0
 /**
  * ディレクトリの作成(途中のディレクトリも自動生成)
  *
  * @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();
 }