OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / reg_user / include / container / reg_userProfileWidgetContainer.php
1 <?php
2 /**
3  * index.php用コンテナクラス
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
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
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/reg_userBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() .   '/reg_userDb.php');
18 require_once($gEnvManager->getLibPath()                 . '/qqFileUploader/fileuploader.php');
19
20 class reg_userProfileWidgetContainer extends reg_userBaseWidgetContainer
21 {
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_';         // デフォルトのアバターファイル名ヘッド部
34         
35         /**
36          * コンストラクタ
37          */
38         function __construct()
39         {
40                 // 親クラスを呼び出す
41                 parent::__construct();
42                 
43                 // DB接続オブジェクト作成
44                 $this->db = new reg_userDb();
45                 
46                 // 性別選択メニュー項目
47                 $this->genderArray = array(     array(  'name' => '男',        'value' => '1'),
48                                                                         array(  'name' => '女',        'value' => '2'));
49         }
50         /**
51          * テンプレートファイルを設定
52          *
53          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
54          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
55          *
56          * @param RequestManager $request               HTTPリクエスト処理クラス
57          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
58          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
59          */
60         function _setTemplate($request, &$param)
61         {       
62                 return 'profile.tmpl.html';
63         }
64         /**
65          * テンプレートにデータ埋め込む
66          *
67          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
68          *
69          * @param RequestManager $request               HTTPリクエスト処理クラス
70          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
71          * @param                                                               なし
72          */
73         function _assign($request, &$param)
74         {
75                 $now = date("Y/m/d H:i:s");     // 現在日時
76                 $avatarFormat = $this->gInstance->getImageManager()->getDefaultAvatarFormat();          // 画像フォーマット取得
77                 
78                 // ##### セッションパラメータ取得 #####
79                 $this->sessionParamObj = $this->getWidgetSessionObj();          // セッション保存パラメータ
80                 if (empty($this->sessionParamObj)){                     // 空の場合は作成
81                         $this->sessionParamObj = new stdClass;          
82                         $this->sessionParamObj->uploadFile = '';                // アップロードしたファイル
83                         $this->sessionParamObj->avatarFile = '';                // アバターファイル
84                 }
85                 
86                 // 入力値を取得
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');         // 生年月日(日)
93                 
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('生年月日が入力されていません');
99                         
100                         // エラーなしの場合は、更新
101                         if ($this->getMsgCount() == 0){
102                                 // 旧アバターを取得
103                                 $avatar = '';
104                                 $ret = $this->_db->getLoginUserRecordById($this->_userId, $userRow);
105                                 if ($ret) $avatar = $userRow['lu_avatar'];              // アバター
106                                         
107                                 if (!empty($this->sessionParamObj->avatarFile)){
108                                         // 旧アバターを削除
109                                         if (!empty($avatar)){
110                                                 //$avatarPath = $this->gEnv->getResourcePath() . self::AVATAR_DIR . $avatar;
111                                                 $avatarPath = $this->gInstance->getImageManager()->getAvatarPath($avatar);
112                                                 unlink($avatarPath);
113                                         }
114                                         
115                                         // 新アバター画像を移動
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);
120                                 }
121                                 
122                                 // セッションの画像情報をクリア
123                                 $this->resetUploadImage();
124                 
125                                 // トランザクションスタート
126                                 $this->db->startTransaction();
127
128                                 // ログインユーザ情報を更新
129                                 $fieldArray = array();
130                                 $fieldArray['lu_name'] = $name;                         // 名前
131                                 $fieldArray['lu_avatar'] = $avatar;                     // アバター
132                                 $ret = $this->_db->updateLoginUserByField($this->_userId, $fieldArray, $newSerial);
133                                         
134                                 // ユーザ情報を更新
135                                 if ($ret){
136                                         if (!empty($this->year) && !empty($this->month) && !empty($this->day)) $birthday = $this->convertToProperDate($this->year . '/' . $this->month . '/' . $this->day);
137                                         
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);
143                                         }
144                                 }
145                                                                                                         
146                                 // トランザクション終了
147                                 $ret = $this->db->endTransaction();
148                                 if ($ret){
149                                         $this->setGuidanceMsg('データを更新しました');
150                                         
151                                         $replaceNew = true;                     // 会員情報を再取得
152                                 } else {
153                                         $this->setAppErrorMsg('データ更新に失敗しました');
154                                 }
155                         }
156                 } else if ($act == 'uploadfile'){               // 添付ファイルアップロード
157                         $uploader = new qqFileUploader(array());
158                         $tmpDir = $this->gEnv->getTempDirBySession();           // セッション単位の作業ディレクトリを取得
159                         $resultObj = $uploader->handleUpload($tmpDir);
160                         
161                         if ($resultObj['success']){
162                                 $fileInfo = $resultObj['file'];
163                                 $ret = $this->gInstance->getImageManager()->createImageByFormat($fileInfo['path'], $avatarFormat, dirname($fileInfo['path']), $fileInfo['fileid'], $destFilename);
164                                 if ($ret){
165                                         // 旧画像を削除
166                                         $this->resetUploadImage();
167                                         
168                                         // 新規画像を登録
169                                         $this->sessionParamObj->uploadFile = $fileInfo['path'];         // アップロードしたファイル
170                                         $this->sessionParamObj->avatarFile = dirname($fileInfo['path']) . DIRECTORY_SEPARATOR . $destFilename[0];               // アバターファイル
171                                         $this->setWidgetSessionObj($this->sessionParamObj);
172                                         
173                                         // アバター画像URL
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.');
182                                 }
183                         }
184                         // ##### 添付ファイルアップロード結果を返す #####
185                         // ページ作成処理中断
186                         $this->gPage->abortPage();
187                         
188                         // 添付ファイルの登録データを返す
189                         if (function_exists('json_encode')){
190                                 $destStr = json_encode($resultObj);
191                         } else {
192                                 $destStr = $this->gInstance->getAjaxManager()->createJsonString($resultObj);
193                         }
194                         //$destStr = htmlspecialchars($destStr, ENT_NOQUOTES);          // 「&」が「&amp;」に変換されるので使用しない
195                         //header('Content-type: application/json; charset=utf-8');
196                         header('Content-Type: text/html; charset=UTF-8');               // JSONタイプを指定するとIE8で動作しないのでHTMLタイプを指定
197                         echo $destStr;
198                         
199                         // システム強制終了
200                         $this->gPage->exitSystem();
201                 } else if ($act == 'getavatar'){                // アバター画像取得
202                         if (empty($this->sessionParamObj->avatarFile)) return;
203                         
204                         // ページ作成処理中断
205                         $this->gPage->abortPage();
206                 
207                         $ret = $this->gPage->downloadFile($this->sessionParamObj->avatarFile, basename($this->sessionParamObj->avatarFile));
208                 
209                         // システム強制終了
210                         $this->gPage->exitSystem();
211                 } else {                // 初期状態のとき
212                         $replaceNew = true;                     // 会員情報を再取得
213                         
214                         // アップロードファイル初期化
215                         $this->resetUploadImage();
216                 }
217
218                 if ($replaceNew){               // 会員情報を取得のとき
219                         // ユーザ情報を取得
220                         $ret = $this->_db->getLoginUserRecordById($this->_userId, $userRow);
221                         if ($ret){
222                                 $account        = $userRow['lu_account'];
223                                 $name           = $userRow['lu_name'];
224                                 $avatar         = $userRow['lu_avatar'];                // アバター
225                                                         
226                                 $this->gender   = $userRow['li_gender'];
227                                 $this->timestampToYearMonthDay($userRow['li_birthday'], $this->year, $this->month, $this->day);
228                         }
229                 } else {
230                         // アカウントは毎回取得
231                         $ret = $this->_db->getLoginUserRecordById($this->_userId, $userRow);
232                         if ($ret){
233                                 $account        = $userRow['lu_account'];
234                         }
235                 }
236                 
237                 // 性別選択メニュー作成
238                 $this->createGenderMenu();
239                 
240                 // 生年月日メニュー作成
241                 $this->createBirthMenu();
242                 
243                 // アップロード実行用URL
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));
249                 
250                 // アバター
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;
255                 } else {
256                         $avatarUrl = $this->gEnv->getResourceUrl() . self::AVATAR_DIR . $avatar;
257                 }*/
258                 $iconTitle = 'アバター画像';
259                 $avatarTag = '<img id="avatar" src="' . $this->getUrl($avatarUrl) . '" width="' . $imageSize . '" height="' . $imageSize . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
260                 
261                 // 入力値を戻す
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);
265         }
266         /**
267          * JavascriptファイルをHTMLヘッダ部に設定
268          *
269          * JavascriptファイルをHTMLのheadタグ内に追加出力する。
270          * _assign()よりも後に実行される。
271          *
272          * @param RequestManager $request               HTTPリクエスト処理クラス
273          * @param object         $param                 任意使用パラメータ。
274          * @return string                                               Javascriptファイル。出力しない場合は空文字列を設定。
275          */
276         function _addScriptFileToHead($request, &$param)
277         {
278                 $scriptArray = array($this->getUrl($this->gEnv->getScriptsUrl() . self::FILE_UPLOAD_SCRIPT_FILE));      // カレンダーセットアップファイル
279                 return $scriptArray;
280
281         }
282         /**
283          * CSSファイルをHTMLヘッダ部に設定
284          *
285          * CSSファイルをHTMLのheadタグ内に追加出力する。
286          * _assign()よりも後に実行される。
287          *
288          * @param RequestManager $request               HTTPリクエスト処理クラス
289          * @param object         $param                 任意使用パラメータ。
290          * @return string                                               CSS文字列。出力しない場合は空文字列を設定。
291          */
292         function _addCssFileToHead($request, &$param)
293         {
294                 return array(parent::_addCssFileToHead($request, $param), $this->getUrl($this->gEnv->getScriptsUrl() . self::FILE_UPLOAD_CSS_FILE));
295         }
296         /**
297          * 性別選択メニュー作成
298          *
299          * @return なし
300          */
301         function createGenderMenu()
302         {
303                 for ($i = 0; $i < count($this->genderArray); $i++){
304                         $value = $this->genderArray[$i]['value'];
305                         $name = $this->genderArray[$i]['name'];
306                         
307                         $selected = '';
308                         if ($value == $this->gender) $selected = 'selected';
309                         
310                         $row = array(
311                                 'value'    => $value,                   // ページID
312                                 'name'     => $name,                    // ページ名
313                                 'selected' => $selected                                                                                                         // 選択中かどうか
314                         );
315                         $this->tmpl->addVars('gender_list', $row);
316                         $this->tmpl->parseTemplate('gender_list', 'a');
317                 }
318         }
319         /**
320          * 生年月日メニュー作成
321          *
322          * @return なし
323          */
324         function createBirthMenu()
325         {
326                 $nowYear = date("Y");   // 現在年
327                 $startYear = $nowYear - 100;
328                 for ($i = $startYear; $i < $nowYear; $i++){
329                         $value = $name = $i;
330                         
331                         $selected = '';
332                         if ($value == $this->year) $selected = 'selected';
333                         
334                         $row = array(
335                                 'value'    => $value,                   // 値
336                                 'name'     => $name,                    // 表示タイトル
337                                 'selected' => $selected                                                                                                         // 選択中かどうか
338                         );
339                         $this->tmpl->addVars('year_list', $row);
340                         $this->tmpl->parseTemplate('year_list', 'a');
341                 }
342                 
343                 for ($i = 1; $i <= 12; $i++){
344                         $value = $name = $i;
345                         
346                         $selected = '';
347                         if ($value == $this->month) $selected = 'selected';
348                         
349                         $row = array(
350                                 'value'    => $value,                   // 値
351                                 'name'     => $name,                    // 表示タイトル
352                                 'selected' => $selected                                                                                                         // 選択中かどうか
353                         );
354                         $this->tmpl->addVars('month_list', $row);
355                         $this->tmpl->parseTemplate('month_list', 'a');
356                 }
357                 
358                 for ($i = 1; $i <= 31; $i++){
359                         $value = $name = $i;
360                         
361                         $selected = '';
362                         if ($value == $this->day) $selected = 'selected';
363                         
364                         $row = array(
365                                 'value'    => $value,                   // 値
366                                 'name'     => $name,                    // 表示タイトル
367                                 'selected' => $selected                                                                                                         // 選択中かどうか
368                         );
369                         $this->tmpl->addVars('day_list', $row);
370                         $this->tmpl->parseTemplate('day_list', 'a');
371                 }
372         }
373         /**
374          * ウィジェットのタイトルを設定
375          *
376          * @param RequestManager $request               HTTPリクエスト処理クラス
377          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
378          * @return string                                               ウィジェットのタイトル名
379          */
380         function _setTitle($request, &$param)
381         {
382                 return self::DEFAULT_TITLE;
383         }
384         /**
385          * アップロード画像初期化
386          *
387          * @return なし
388          */
389         function resetUploadImage()
390         {
391                 if (!empty($this->sessionParamObj->uploadFile)){                // アップロードしたファイル
392                         if (file_exists($this->sessionParamObj->uploadFile)) unlink($this->sessionParamObj->uploadFile);
393                 }
394                 if (!empty($this->sessionParamObj->avatarFile)){                // アバターファイル
395                         if (file_exists($this->sessionParamObj->avatarFile)) unlink($this->sessionParamObj->avatarFile);
396                 }
397                 $this->sessionParamObj->uploadFile = '';                // アップロードしたファイル
398                 $this->sessionParamObj->avatarFile = '';                // アバターファイル
399                 
400                 $this->setWidgetSessionObj($this->sessionParamObj);
401         }
402 }
403 ?>