7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
9 * @package Magic3 Framework
10 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11 * @copyright Copyright 2006-2012 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: reg_userProfileWidgetContainer.php 5371 2012-11-10 14:10:10Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/reg_userBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/reg_userDb.php');
18 require_once($gEnvManager->getLibPath() . '/qqFileUploader/fileuploader.php');
20 class reg_userProfileWidgetContainer extends reg_userBaseWidgetContainer
22 const DEFAULT_TITLE = 'プロフィール'; // 画面タイトル
23 private $db; // DB接続オブジェクト
24 private $genderArray; // 性別選択メニュー用
25 private $gender; // 性別
26 private $year; // 生年月日(年)
27 private $month; // 生年月日(月)
28 private $day; // 生年月日(日)
29 private $sessionParamObj; // セッション保存データ
30 const FILE_UPLOAD_SCRIPT_FILE = '/fileuploader/fileuploader.js'; // ファイルアップロードクリプトファイル
31 const FILE_UPLOAD_CSS_FILE = '/fileuploader/fileuploader.css'; // ファイルアップロードCSSファイル
32 // const AVATAR_DIR = '/etc/avatar/'; // アバターディレクトリ
33 // const DEFAULT_AVATAR_BASE = 'default_'; // デフォルトのアバターファイル名ヘッド部
38 function __construct()
41 parent::__construct();
44 $this->db = new reg_userDb();
47 $this->genderArray = array( array( 'name' => '男', 'value' => '1'),
48 array( 'name' => '女', 'value' => '2'));
53 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
54 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
56 * @param RequestManager $request HTTPリクエスト処理クラス
57 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
58 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
60 function _setTemplate($request, &$param)
62 return 'profile.tmpl.html';
67 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
69 * @param RequestManager $request HTTPリクエスト処理クラス
70 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
73 function _assign($request, &$param)
75 $now = date("Y/m/d H:i:s"); // 現在日時
76 $avatarFormat = $this->gInstance->getImageManager()->getDefaultAvatarFormat(); // 画像フォーマット取得
78 // ##### セッションパラメータ取得 #####
79 $this->sessionParamObj = $this->getWidgetSessionObj(); // セッション保存パラメータ
80 if (empty($this->sessionParamObj)){ // 空の場合は作成
81 $this->sessionParamObj = new stdClass;
82 $this->sessionParamObj->uploadFile = ''; // アップロードしたファイル
83 $this->sessionParamObj->avatarFile = ''; // アバターファイル
87 $act = $request->trimValueOf('act');
88 $name = $request->trimValueOf('item_name'); // 名前
89 $this->gender = $request->trimValueOf('item_gender'); // 性別
90 $this->year = $request->trimValueOf('item_year'); // 生年月日(年)
91 $this->month = $request->trimValueOf('item_month'); // 生年月日(月)
92 $this->day = $request->trimValueOf('item_day'); // 生年月日(日)
94 $replaceNew = false; // データを再取得するかどうか
95 if ($act == 'update'){ // 会員情報更新
96 $this->checkInput($name, '名前');
97 // $this->checkInput($this->gender, '性別');
98 // if (empty($this->year) || empty($this->month) || empty($this->day)) $this->setUserErrorMsg('生年月日が入力されていません');
101 if ($this->getMsgCount() == 0){
104 $ret = $this->_db->getLoginUserRecordById($this->_userId, $userRow);
105 if ($ret) $avatar = $userRow['lu_avatar']; // アバター
107 if (!empty($this->sessionParamObj->avatarFile)){
109 if (!empty($avatar)){
110 //$avatarPath = $this->gEnv->getResourcePath() . self::AVATAR_DIR . $avatar;
111 $avatarPath = $this->gInstance->getImageManager()->getAvatarPath($avatar);
116 $avatar = basename($this->sessionParamObj->avatarFile);
117 //$avatarPath = $this->gEnv->getResourcePath() . self::AVATAR_DIR . $avatar;
118 $avatarPath = $this->gInstance->getImageManager()->getAvatarPath($avatar);
119 renameFile($this->sessionParamObj->avatarFile, $avatarPath);
123 $this->resetUploadImage();
126 $this->db->startTransaction();
129 $fieldArray = array();
130 $fieldArray['lu_name'] = $name; // 名前
131 $fieldArray['lu_avatar'] = $avatar; // アバター
132 $ret = $this->_db->updateLoginUserByField($this->_userId, $fieldArray, $newSerial);
136 if (!empty($this->year) && !empty($this->month) && !empty($this->day)) $birthday = $this->convertToProperDate($this->year . '/' . $this->month . '/' . $this->day);
138 if (!empty($this->gender) || !empty($birthday)){
139 $fieldArray = array();
140 if (!empty($this->gender)) $fieldArray['li_gender'] = $this->gender; // 性別
141 if (!empty($birthday)) $fieldArray['li_birthday'] = $birthday; // 生年月日
142 $ret = $this->_db->updateLoginUserInfoByField($this->_userId, $fieldArray, $newSerial);
147 $ret = $this->db->endTransaction();
149 $this->setGuidanceMsg('データを更新しました');
151 $replaceNew = true; // 会員情報を再取得
153 $this->setAppErrorMsg('データ更新に失敗しました');
156 } else if ($act == 'uploadfile'){ // 添付ファイルアップロード
157 $uploader = new qqFileUploader(array());
158 $tmpDir = $this->gEnv->getTempDirBySession(); // セッション単位の作業ディレクトリを取得
159 $resultObj = $uploader->handleUpload($tmpDir);
161 if ($resultObj['success']){
162 $fileInfo = $resultObj['file'];
163 $ret = $this->gInstance->getImageManager()->createImageByFormat($fileInfo['path'], $avatarFormat, dirname($fileInfo['path']), $fileInfo['fileid'], $destFilename);
166 $this->resetUploadImage();
169 $this->sessionParamObj->uploadFile = $fileInfo['path']; // アップロードしたファイル
170 $this->sessionParamObj->avatarFile = dirname($fileInfo['path']) . DIRECTORY_SEPARATOR . $destFilename[0]; // アバターファイル
171 $this->setWidgetSessionObj($this->sessionParamObj);
174 $urlparam = M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_DO_WIDGET . '&';
175 $urlparam .= M3_REQUEST_PARAM_WIDGET_ID . '=' . $this->gEnv->getCurrentWidgetId() .'&';
176 $urlparam .= M3_REQUEST_PARAM_OPERATION_TASK . '=' . self::TASK_PROFILE . '&' . M3_REQUEST_PARAM_OPERATION_ACT . '=' . 'getavatar&' . date('YmdHis');
177 $avatarUrl = $this->gEnv->getDefaultUrl() . '?' . $urlparam;
178 $resultObj['avatar'] = $avatarUrl;
179 } else { // 画像作成失敗のとき
180 unlink($fileInfo['path']);
181 $resultObj = array('error' => 'Could not create file information.');
184 // ##### 添付ファイルアップロード結果を返す #####
186 $this->gPage->abortPage();
189 if (function_exists('json_encode')){
190 $destStr = json_encode($resultObj);
192 $destStr = $this->gInstance->getAjaxManager()->createJsonString($resultObj);
194 //$destStr = htmlspecialchars($destStr, ENT_NOQUOTES); // 「&」が「&」に変換されるので使用しない
195 //header('Content-type: application/json; charset=utf-8');
196 header('Content-Type: text/html; charset=UTF-8'); // JSONタイプを指定するとIE8で動作しないのでHTMLタイプを指定
200 $this->gPage->exitSystem();
201 } else if ($act == 'getavatar'){ // アバター画像取得
202 if (empty($this->sessionParamObj->avatarFile)) return;
205 $this->gPage->abortPage();
207 $ret = $this->gPage->downloadFile($this->sessionParamObj->avatarFile, basename($this->sessionParamObj->avatarFile));
210 $this->gPage->exitSystem();
212 $replaceNew = true; // 会員情報を再取得
215 $this->resetUploadImage();
218 if ($replaceNew){ // 会員情報を取得のとき
220 $ret = $this->_db->getLoginUserRecordById($this->_userId, $userRow);
222 $account = $userRow['lu_account'];
223 $name = $userRow['lu_name'];
224 $avatar = $userRow['lu_avatar']; // アバター
226 $this->gender = $userRow['li_gender'];
227 $this->timestampToYearMonthDay($userRow['li_birthday'], $this->year, $this->month, $this->day);
231 $ret = $this->_db->getLoginUserRecordById($this->_userId, $userRow);
233 $account = $userRow['lu_account'];
238 $this->createGenderMenu();
241 $this->createBirthMenu();
244 $urlparam = M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_DO_WIDGET . '&';
245 $urlparam .= M3_REQUEST_PARAM_WIDGET_ID . '=' . $this->gEnv->getCurrentWidgetId() .'&';
246 $urlparam .= M3_REQUEST_PARAM_OPERATION_TASK . '=' . self::TASK_PROFILE . '&' . M3_REQUEST_PARAM_OPERATION_ACT . '=' . 'uploadfile';
247 $uploadUrl = $this->gEnv->getDefaultUrl() . '?' . $urlparam;
248 $this->tmpl->addVar("_widget", "upload_url", $this->getUrl($uploadUrl));
251 $this->gInstance->getImageManager()->parseImageFormat($avatarFormat, $imageType, $imageAttr, $imageSize); // 画像情報取得
252 $avatarUrl = $this->gInstance->getImageManager()->getAvatarUrl($avatar);
253 /* if (empty($avatar)){
254 $avatarUrl = $this->gEnv->getResourceUrl() . self::AVATAR_DIR . self::DEFAULT_AVATAR_BASE . $avatarFormat;
256 $avatarUrl = $this->gEnv->getResourceUrl() . self::AVATAR_DIR . $avatar;
258 $iconTitle = 'アバター画像';
259 $avatarTag = '<img id="avatar" src="' . $this->getUrl($avatarUrl) . '" width="' . $imageSize . '" height="' . $imageSize . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
262 $this->tmpl->addVar("_widget", "account", $this->convertToDispString($account));
263 $this->tmpl->addVar("_widget", "name", $this->convertToDispString($name));
264 $this->tmpl->addVar("_widget", "image", $avatarTag);
267 * JavascriptファイルをHTMLヘッダ部に設定
269 * JavascriptファイルをHTMLのheadタグ内に追加出力する。
270 * _assign()よりも後に実行される。
272 * @param RequestManager $request HTTPリクエスト処理クラス
273 * @param object $param 任意使用パラメータ。
274 * @return string Javascriptファイル。出力しない場合は空文字列を設定。
276 function _addScriptFileToHead($request, &$param)
278 $scriptArray = array($this->getUrl($this->gEnv->getScriptsUrl() . self::FILE_UPLOAD_SCRIPT_FILE)); // カレンダーセットアップファイル
283 * CSSファイルをHTMLヘッダ部に設定
285 * CSSファイルをHTMLのheadタグ内に追加出力する。
286 * _assign()よりも後に実行される。
288 * @param RequestManager $request HTTPリクエスト処理クラス
289 * @param object $param 任意使用パラメータ。
290 * @return string CSS文字列。出力しない場合は空文字列を設定。
292 function _addCssFileToHead($request, &$param)
294 return array(parent::_addCssFileToHead($request, $param), $this->getUrl($this->gEnv->getScriptsUrl() . self::FILE_UPLOAD_CSS_FILE));
301 function createGenderMenu()
303 for ($i = 0; $i < count($this->genderArray); $i++){
304 $value = $this->genderArray[$i]['value'];
305 $name = $this->genderArray[$i]['name'];
308 if ($value == $this->gender) $selected = 'selected';
311 'value' => $value, // ページID
312 'name' => $name, // ページ名
313 'selected' => $selected // 選択中かどうか
315 $this->tmpl->addVars('gender_list', $row);
316 $this->tmpl->parseTemplate('gender_list', 'a');
324 function createBirthMenu()
326 $nowYear = date("Y"); // 現在年
327 $startYear = $nowYear - 100;
328 for ($i = $startYear; $i < $nowYear; $i++){
332 if ($value == $this->year) $selected = 'selected';
335 'value' => $value, // 値
336 'name' => $name, // 表示タイトル
337 'selected' => $selected // 選択中かどうか
339 $this->tmpl->addVars('year_list', $row);
340 $this->tmpl->parseTemplate('year_list', 'a');
343 for ($i = 1; $i <= 12; $i++){
347 if ($value == $this->month) $selected = 'selected';
350 'value' => $value, // 値
351 'name' => $name, // 表示タイトル
352 'selected' => $selected // 選択中かどうか
354 $this->tmpl->addVars('month_list', $row);
355 $this->tmpl->parseTemplate('month_list', 'a');
358 for ($i = 1; $i <= 31; $i++){
362 if ($value == $this->day) $selected = 'selected';
365 'value' => $value, // 値
366 'name' => $name, // 表示タイトル
367 'selected' => $selected // 選択中かどうか
369 $this->tmpl->addVars('day_list', $row);
370 $this->tmpl->parseTemplate('day_list', 'a');
376 * @param RequestManager $request HTTPリクエスト処理クラス
377 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
378 * @return string ウィジェットのタイトル名
380 function _setTitle($request, &$param)
382 return self::DEFAULT_TITLE;
389 function resetUploadImage()
391 if (!empty($this->sessionParamObj->uploadFile)){ // アップロードしたファイル
392 if (file_exists($this->sessionParamObj->uploadFile)) unlink($this->sessionParamObj->uploadFile);
394 if (!empty($this->sessionParamObj->avatarFile)){ // アバターファイル
395 if (file_exists($this->sessionParamObj->avatarFile)) unlink($this->sessionParamObj->avatarFile);
397 $this->sessionParamObj->uploadFile = ''; // アップロードしたファイル
398 $this->sessionParamObj->avatarFile = ''; // アバターファイル
400 $this->setWidgetSessionObj($this->sessionParamObj);