OSDN Git Service

c9bca04bb7a9bb450db8e5564d1076a9d68f10df
[magic3/magic3.git] / widgets / m / chacha / include / container / m_chachaMypageWidgetContainer.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    マイクロブログ
10  * @author     株式会社 毎日メディアサービス
11  * @copyright  Copyright 2010 株式会社 毎日メディアサービス.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: m_chachaMypageWidgetContainer.php 3363 2010-07-10 05:12:31Z fishbone $
14  * @link       http://www.m-media.co.jp
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/m_chachaBaseWidgetContainer.php');
17
18 class m_chachaMypageWidgetContainer extends m_chachaBaseWidgetContainer
19 {
20         private $messageCount;          // 表示メッセージ数
21         private $isExistsMessage;       // メッセージが存在するかどうか
22         private $isExistsNextPage;      // 次のページがあるかどうか
23         const THREAD_ID_LENGTH = 5;     // スレッドIDの長さ
24         
25         /**
26          * コンストラクタ
27          */
28         function __construct()
29         {
30                 // 親クラスを呼び出す
31                 parent::__construct();
32         }
33         /**
34          * テンプレートファイルを設定
35          *
36          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
37          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
38          *
39          * @param RequestManager $request               HTTPリクエスト処理クラス
40          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
41          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
42          */
43         function _setTemplate($request, &$param)
44         {
45                 return 'mypage.tmpl.html';
46         }
47         /**
48          * テンプレートにデータ埋め込む
49          *
50          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
51          *
52          * @param RequestManager $request               HTTPリクエスト処理クラス
53          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
54          * @param                                                               なし
55          */
56         function _assign($request, &$param)
57         {
58                 $act = $request->trimValueOf('act');
59                 $pageNo = $request->trimIntValueOf(M3_REQUEST_PARAM_PAGE_NO, '1');                              // ページ番号
60                 $postTicket = $request->trimValueOf('ticket');          // POST確認用
61                 $memberId = $request->trimValueOf(self::URL_PARAM_MEMBER_ID);   // 会員ID
62                 $message = $request->mobileTrimValueOf('message');              // 投稿メッセージ
63                 
64                 // 現在アクセス中の端末IDを取得
65                 $canPost = false;                       // ブログ投稿可能かどうか
66                 $clientId = $this->_mobileId;
67                 
68                 // 自分のブログページのときは投稿可能
69                 $clientMemberId = '';                   // 現在の端末の会員ID
70                 $ret = $this->_db->getMemberInfoByDeviceId($clientId, $row);
71                 if ($ret) $clientMemberId = $row['mb_id'];
72                 if (empty($memberId)){
73                         if (!empty($clientMemberId)){           // 登録メンバーのとき
74                                 $memberId = $clientMemberId;
75                                 $canPost = true;                        // ブログ投稿可能かどうか
76                         }
77                 } else if ($memberId == $clientMemberId){
78                         $canPost = true;                        // ブログ投稿可能かどうか
79                 }
80
81                 if ($act == 'add'){             // 投稿追加のとき
82                         if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){           // 正常なPOST値のとき
83                                 // 投稿権限のチェック
84                                 if (!$canPost) $this->setUserErrorMsg('投稿権限がありません');
85                                                 
86                                 // 入力項目のエラーチェック
87                                 //$this->checkMessageInput($this->_boardId, $threadId, $name, $email, $message);
88                                 if ($this->checkInput($message, 'メッセージ')){
89                                         // 文字数のチェック
90                                         $messageLength = $this->_configArray[self::CF_MESSAGE_LENGTH];                  // 最大メッセージ長
91                                         if (getLetterCount($message) > $messageLength) $this->setUserErrorMsg('メッセージは' . $messageLength . '文字まで入力可能です');
92                                 }
93                                 if (empty($memberId)) $this->setUserErrorMsg('会員IDが不正です');
94                         
95                                 // エラーなしの場合は、データを更新
96                                 if ($this->getMsgCount() == 0){
97                                         // スレッドID作成
98                                         $threadId = $this->createThreadId();
99                                         if (empty($threadId)){
100                                                 $this->setAppErrorMsg('スレッドIDが作成できません');
101                                         } else {
102                                                 // 新規投稿文の追加
103                                                 $ret = $this->_db->addNewThread($this->_boardId, $threadId, $memberId, ''/*件名*/, $message);
104
105                                                 if ($ret){              // データ追加成功のとき
106                                                         $this->setGuidanceMsg('投稿完了しました');
107                                                         
108                                                         $message = '';                  // メッセージクリア
109                                                 } else {
110                                                         $this->setAppErrorMsg('投稿に失敗しました');
111                                                 }
112                                         }
113                                 }
114                         }
115                         $request->unsetSessionValue(M3_SESSION_POST_TICKET);            // セッション値をクリア
116                 }
117
118                 // 会員情報を取得
119                 $ret = $this->_db->getMemberInfoById($memberId, $row);
120                 if ($ret){
121                         // アバターを設定
122                         $avatarImageUrl = $this->getAvatarUrl($memberId);// アバター画像URL
123                         $imageTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
124                         $this->tmpl->addVar("thread_area", "avatar_image", $imageTag);          // 画像
125
126                         // 投稿文を作成
127                         $this->messageCount = $this->_configArray[self::CF_MESSAGE_COUNT_MYPAGE];               // 最大項目数
128                         $this->_db->getThreadByMemberId($this->_boardId, $memberId, $this->messageCount, $pageNo, array($this, 'itemsLoop'), true);
129                         
130                         // 画面にデータを埋め込む
131                         $this->tmpl->addVar("thread_area", "name", $this->convertToDispString($row['mb_name']));                                // ユーザ名
132
133                         if ($canPost){                  // ブログ投稿可能なとき
134                                 $this->tmpl->setAttribute('add_area', 'visibility', 'visible');// 投稿エリアを表示
135                                 $this->tmpl->addVar("add_area", "member_id", $memberId);                        // 会員ID
136                                 $this->tmpl->addVar('add_area', 'act', 'add');          // 新規登録
137                                 $this->tmpl->addVar("add_area", "current_url", $this->gEnv->getCurrentRequestUri());
138                                 
139                                 // ハッシュキー作成
140                                 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
141                                 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket);         // セッションに保存
142                                 $this->tmpl->addVar("add_area", "ticket", $postTicket);                         // 画面に書き出し
143                         }
144                         
145                         // スレッドが存在しないときはタグを非表示にする
146                         if (!$this->isExistsMessage){
147                                 // 投稿なしのメッセージを表示。自分自身のマイページのときは表示しない。
148                                 if (!$canPost) $this->tmpl->setAttribute('no_message_area', 'visibility', 'visible');
149                                 
150                                 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
151                         }
152                         // リンク作成
153                         //$registLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&task=' . self::TASK_PROFILE . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
154                         $registLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile('task=' . self::TASK_PROFILE . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId)));
155                         $registName = 'プロフィール';
156                         $this->tmpl->addVar("_widget", "regist_url", $registLink);
157                         $this->tmpl->addVar("_widget", "regist_name", $registName);
158                         
159                         // ページ遷移用リンク
160                         $pageLink = '';
161                         if ($pageNo > 1){                       // 前のページがあるとき
162                                 $foreLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId . '&page=' . ($pageNo -1), true));
163                                 $pageLink .= '<a href="' . $foreLink . '" accesskey="1">前へ[1]</a>';
164                         }
165                         if ($this->isExistsNextPage){   // 次のページがあるとき
166                                 if (!empty($pageLink)) $pageLink .= '&nbsp;&nbsp;';
167                                 $nextLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId . '&page=' . ($pageNo +1), true));
168                                 $pageLink .= '<a href="' . $nextLink . '" accesskey="2">次へ[2]</a>';
169                         }
170                         $this->tmpl->addVar("_widget", "page_link", $pageLink);
171                 } else {
172                         $this->setUserErrorMsg('会員IDが不正です');
173                         
174                         // スレッド表示部を非表示にする
175                         $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
176                 }
177                 
178                 // 画面にデータを埋め込む
179                 $this->tmpl->addVar("add_area", "message", $message);
180         }
181         /**
182          * 取得したコンテンツ項目をテンプレートに設定する
183          *
184          * @param int           $index                  行番号
185          * @param array         $fetchedRow             取得行
186          * @param object        $param                  任意使用パラメータ
187          * @return bool                                         trueを返すとループ続行。falseを返すとその時点で終了。
188          */
189         function itemsLoop($index, $fetchedRow)
190         {
191                 // 最大表示数を超えたときは終了
192                 if ($index >= $this->messageCount){
193                         $this->isExistsNextPage = true;                         // 次のページあり
194                         return false;
195                 }
196                 
197                 // 日付作成
198                 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
199                 $timestamp = strtotime($fetchedRow['mm_regist_dt']);
200                 $weekNo = intval(date('w', $timestamp));
201                 $date = date('m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
202                 
203                 // 投稿文
204                 $message = $this->convertToDispString($fetchedRow['mm_message']);// 文字エスケープ処理
205                 $message = $this->convertToPreviewText($message);                       // 改行をBRタグに変換
206                 if ($fetchedRow['mm_index'] == 1) $message .= '<br />';         // トップのメッセージは改行を追加
207                 
208                 // メッセージ変換
209                 $message = $this->convDispMessage($message, $fetchedRow['mm_thread_id']);
210                 
211                 // メッセージID
212                 $messageId = $fetchedRow['mm_thread_id'];
213                 $messageCount = $fetchedRow['mt_message_count'] -1;             // メッセージ数
214                 if ($messageCount <= 0) $messageCount = '';                             // 返信がないときはメッセージ数を表示しない
215                 $messageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId));
216                 $messageIdTag = '<a href="' . $messageLink  . '">#' . $messageId . '</a>';
217
218                 // 削除メッセージのとき
219                 /*if ($fetchedRow['mm_deleted']){
220                         $message = '参照できません。';
221                 }*/
222                 
223                 $row = array(
224                         'id'            => $messageIdTag,               // メッセージID
225                         'message_count' => $messageCount,       // メッセージ数
226                         'date'          => $date,                       // 投稿日付
227                         'message'               => $message,            // 投稿文
228                         'spacer'        => $this->_spacer       // スペーサ
229                 );
230                 $this->tmpl->addVars('message_list', $row);
231                 $this->tmpl->parseTemplate('message_list', 'a');
232                 
233                 // メッセージが存在するかどうか
234                 $this->isExistsMessage = true;
235                 return true;
236         }
237         /**
238          * スレッドIDを作成
239          *
240          * @return string                               スレッドID
241          */
242         function createThreadId()
243         {
244                 $threadId = '';
245                 
246                 for ($i = 0; $i < self::CREATE_CODE_RETRY_COUNT; $i++){
247                         // 「0,I,L,O,i,l,o」除くランダム文字列を作成
248                         $threadId = $this->_createRandString('123456789ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz', self::THREAD_ID_LENGTH);
249                 
250                         // すでに登録済みかどうかチェック
251                         $ret = $this->_db->isExistsThreadId($threadId);
252                         if (!$ret) break;
253                 }
254                 return $threadId;
255         }
256 }
257 ?>