OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / chacha_main / include / container / chacha_mainThreadWidgetContainer.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: chacha_mainThreadWidgetContainer.php 3362 2010-07-10 03:08:21Z fishbone $
14  * @link       http://www.m-media.co.jp
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/chacha_mainBaseWidgetContainer.php');
17
18 class chacha_mainThreadWidgetContainer extends chacha_mainBaseWidgetContainer
19 {
20         private $messageCount;                  // メッセージ数
21         private $isExistsMessage;       // メッセージが存在するかどうか
22         private $isExistsNextPage;      // 次のページがあるかどうか
23         
24         /**
25          * コンストラクタ
26          */
27         function __construct()
28         {
29                 // 親クラスを呼び出す
30                 parent::__construct();
31         }
32         /**
33          * テンプレートファイルを設定
34          *
35          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
36          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
37          *
38          * @param RequestManager $request               HTTPリクエスト処理クラス
39          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
40          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
41          */
42         function _setTemplate($request, &$param)
43         {
44                 return 'thread.tmpl.html';
45         }
46         /**
47          * テンプレートにデータ埋め込む
48          *
49          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
50          *
51          * @param RequestManager $request               HTTPリクエスト処理クラス
52          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
53          * @param                                                               なし
54          */
55         function _assign($request, &$param)
56         {
57                 $act = $request->trimValueOf('act');
58                 $postTicket = $request->trimValueOf('ticket');          // POST確認用
59                 $pageNo = $request->trimIntValueOf(M3_REQUEST_PARAM_PAGE_NO, '1');                              // ページ番号
60                 if (empty($pageNo)) $pageNo = 1;
61                 $messageId = $request->trimValueOf(self::URL_PARAM_MESSAGE_ID);         // メッセージID
62                 $message = $request->trimValueOf('message');            // 投稿メッセージ
63                 
64                 // クライアントIDを取得
65                 $canPost = false;                       // ブログ返信可能かどうか
66                 $clientId = '';
67                 if ($this->gEnv->canUseCookie()){               // クッキー使用可能なとき
68                         $clientId = $this->gAccess->getClientId();
69                 }
70                 
71                 // 会員IDを取得
72                 $clientMemberId = '';                   // 現在の端末の会員ID
73                 $ret = $this->_db->getMemberInfoByDeviceId($clientId, $row);
74                 if ($ret) $clientMemberId = $row['mb_id'];
75                 if (!empty($clientMemberId)) $canPost = true;                   // ブログ返信可能かどうか
76                 
77                 $reloadData = false;            // データの再読み込み
78                 if ($act == 'add'){             // 新規追加のとき
79                         if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){           // 正常なPOST値のとき
80                                 // 投稿権限のチェック
81                                 if (!$canPost) $this->setUserErrorMsg('投稿権限がありません');
82                                 
83                                 // 入力項目のエラーチェック
84                                 if ($this->checkInput($message, 'メッセージ')){
85                                         // 文字数のチェック
86                                         $messageLength = $this->_configArray[self::CF_MESSAGE_LENGTH];                  // 最大メッセージ長
87                                         if (getLetterCount($message) > $messageLength) $this->setUserErrorMsg('メッセージは' . $messageLength . '文字まで入力可能です');
88                                 }
89                                 if (empty($clientMemberId)) $this->setUserErrorMsg('会員IDが不正です');
90                         
91                                 // エラーなしの場合は、データを更新
92                                 if ($this->getMsgCount() == 0){
93                                         $ret = $this->_db->addNewReply($this->_boardId, $messageId, $clientMemberId, $message);
94                                         if ($ret){              // データ追加成功のとき
95                                                 $this->setGuidanceMsg('投稿完了しました');
96                                                 
97                                                 $message = '';                  // メッセージクリア
98                                         } else {
99                                                 $this->setAppErrorMsg('投稿に失敗しました');
100                                         }
101                                 }
102                         }
103                         $request->unsetSessionValue(M3_SESSION_POST_TICKET);            // セッション値をクリア
104                 } else {
105                         $reloadData = true;             // データの再読み込み
106                 }
107                 
108                 // スレッド情報取得
109                 $ret = $this->_db->getThreadInfo($this->_boardId, $messageId, $row);
110                 if ($ret){
111                         // メッセージ用のデータを取得
112                         $memberId = $row['mb_id'];              // 会員ID
113                         $memberName = $row['mb_name'];  // 会員名
114                         $messageId = $row['mm_thread_id'];
115                         $messageCount = $row['mt_message_count'] -1;            // メッセージ数
116                         $mypageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
117                         $messageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId, true));
118                 
119                         // 名前作成
120                         $nameTag = '<a href="' . $mypageLink . '">' . $this->convertToDispString($memberName) . '</a>';
121                 
122                         // 日付作成
123                         $weekDay = array('日', '月', '火', '水', '木', '金', '土');
124                         $timestamp = strtotime($row['mm_regist_dt']);
125                         $weekNo = intval(date('w', $timestamp));
126                         $date = date('Y/m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
127                 
128                         // 投稿文
129                         $topMessage = $this->convertToDispString($row['mm_message']);// 文字エスケープ処理
130                         $topMessage = $this->_convertToPreviewTextWithSpace($topMessage);                       // 改行をスペースに変換
131                         $topMessage = $this->convDispMessage($topMessage, $row['mm_thread_id']);// メッセージ内のリンクを作成
132                 
133                         // メッセージID
134                         $messageIdTag = '<a href="' . $messageLink  . '">#' . $messageId . '</a>';
135                 
136                         // アバター画像を設定
137                         $avatarImageUrl = $this->getAvatarUrl($memberId);
138                         $avatarTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
139                         $avatarTag = '<a href="' . $mypageLink . '">' . $avatarTag . '</a>';
140                         
141                         $this->tmpl->addVar("thread_area", "id", $messageIdTag);        // メッセージID
142                         $this->tmpl->addVar("thread_area", "thread_message_count", $messageCount);      // メッセージ数
143                         $this->tmpl->addVar("thread_area", "name", $nameTag);           // 会員名
144                         $this->tmpl->addVar("thread_area", "date", $date);                      // 投稿日付
145                         $this->tmpl->addVar("thread_area", "thread_message", $topMessage);              // 投稿文
146                         $this->tmpl->addVar("thread_area", "avatar", $avatarTag);               // アバター画像
147
148                         // 個別のスタイル設定
149                         $innerStyle = self::CSS_BLOG_INNER_STYLE;
150                         //$innerColor = $this->_configArray[self::CF_PROFILE_COLOR];            // プロフィール背景色
151                         if (empty($innerColor)) $innerColor = $this->_configArray[self::CF_INNER_BG_COLOR];             // デフォルトの内枠背景色
152                         if (!empty($innerColor)) $innerStyle .= 'background-color:' . $innerColor . ';';
153                         $this->tmpl->addVar("_widget", "inner_style", $innerStyle);
154                 
155                         // 登録用リンクを作成。会員として認識できないときはプロフィール画面。
156                         if (empty($clientMemberId)){
157                                 $this->tmpl->setAttribute('top_link_area', 'visibility', 'visible');
158                                 $rigistLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&task=' . self::TASK_PROFILE, true));
159                                 $registName = 'ユーザ登録';
160                                 $this->tmpl->addVar("top_link_area", "regist_url", $rigistLink);
161                                 $this->tmpl->addVar("top_link_area", "regist_name", $registName);
162 /*                      } else {
163                                 $rigistLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&task=' . self::TASK_MYPAGE . '&' . self::URL_PARAM_MEMBER_ID . '=' . $clientMemberId, true));
164                                 $registName = '投稿';*/
165                         }
166
167                         // 表示メッセージ取得
168                         // 1つ多く呼び出し、次のページがあるか確認
169                         $this->messageCount = $this->_configArray[self::CF_MESSAGE_COUNT_MYPAGE];               // 最大項目数
170                         $this->_db->getThreadReply(array($this, 'itemsLoop'), $this->_boardId, $messageId, $this->messageCount, $pageNo, true);
171                 
172                         // スレッドが存在しないときは一覧を非表示にする
173                         if (!$this->isExistsMessage){
174                                 // 投稿なしのメッセージを表示
175                                 $this->tmpl->setAttribute('no_message_area', 'visibility', 'visible');
176                                 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
177                         }
178                 
179                         // ページ遷移用リンク
180                         $pageLink = '';
181                         if ($pageNo > 1){                       // 前のページがあるとき
182                                 $foreLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId . '&page=' . ($pageNo -1), true));
183                                 $pageLink .= '<a href="' . $foreLink . '"><b>前へ</b></a>';
184                         }
185                         if ($this->isExistsNextPage){   // 次のページがあるとき
186                                 if (!empty($pageLink)) $pageLink .= '&nbsp;&nbsp;';
187                                 $nextLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId . '&page=' . ($pageNo +1), true));
188                                 $pageLink .= '<a href="' . $nextLink . '"><b>次へ</b></a>';
189                         }
190                         $this->tmpl->addVar("_widget", "page_link", $pageLink);
191                         
192                         if ($canPost){                  // ブログ返信可能なとき
193                                 $this->tmpl->setAttribute('add_area', 'visibility', 'visible');// 投稿エリアを表示
194                                 $this->tmpl->addVar("add_area", "member_id", $memberId);                        // 会員ID
195                                 $this->tmpl->addVar("add_area", "message", $message);
196                                 
197                                 // ハッシュキー作成
198                                 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
199                                 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket);         // セッションに保存
200                                 $this->tmpl->addVar("add_area", "ticket", $postTicket);                         // 画面に書き出し
201                         }
202                 } else {
203                         $this->setUserErrorMsg('メッセージIDが不正です');
204                         
205                         // スレッド表示部を非表示にする
206                         $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
207                 }
208         
209                 // 表示設定
210                 $this->threadStyle = self::CSS_BLOG_INNER_STYLE;
211                 $threadColor = $this->_configArray[self::CF_THREAD_COLOR];              // スレッド表示部背景色
212                 if (empty($threadColor)) $threadColor = $this->_configArray[self::CF_INNER_BG_COLOR];           // デフォルトの内枠背景色
213                 if (!empty($threadColor)) $this->threadStyle .= 'background-color:' . $threadColor . ';';
214                 $this->tmpl->addVar("_widget", "thread_style", $this->threadStyle);
215         }
216         /**
217          * 取得したメッセージ項目をテンプレートに設定する
218          *
219          * @param int           $index                  行番号
220          * @param array         $fetchedRow             取得行
221          * @param object        $param                  任意使用パラメータ
222          * @return bool                                         trueを返すとループ続行。falseを返すとその時点で終了。
223          */
224         function itemsLoop($index, $fetchedRow)
225         {
226                 // 最大表示数を超えたときは終了
227                 if ($index >= $this->messageCount){
228                         $this->isExistsNextPage = true;                         // 次のページあり
229                         return false;
230                 }
231                 
232                 // メッセージ用のデータを取得
233                 $memberId = $fetchedRow['mb_id'];               // 会員ID
234                 $memberName = $fetchedRow['mb_name'];   // 会員名
235                 $messageId = $fetchedRow['mm_thread_id'];
236                 $messageId .= '-' . $fetchedRow['mm_index'];
237                 $mypageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
238                 $messageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId, true));
239                 
240                 // 名前作成
241                 $nameTag = '<a href="' . $mypageLink . '">' . $this->convertToDispString($memberName) . '</a>';
242                 
243                 // 日付作成
244                 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
245                 $timestamp = strtotime($fetchedRow['mm_regist_dt']);
246                 $weekNo = intval(date('w', $timestamp));
247                 $date = date('Y/m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
248                 
249                 // 投稿文
250                 $message = $this->convertToDispString($fetchedRow['mm_message']);// 文字エスケープ処理
251                 $message = $this->_convertToPreviewTextWithSpace($message);                     // 改行をスペースに変換
252                 $message = $this->convDispMessage($message, $fetchedRow['mm_thread_id']);// メッセージ内のリンクを作成
253                 
254                 // メッセージID
255                 $messageIdTag = '<a href="' . $messageLink  . '">#' . $messageId . '</a>';
256                 
257                 // 削除メッセージのとき
258                 /*if ($fetchedRow['mm_deleted']){
259                         $message = '参照できません。';
260                 }*/
261                 // アバター画像を設定
262                 $avatarImageUrl = $this->getAvatarUrl($memberId);
263                 $avatarTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
264                 $avatarTag = '<a href="' . $mypageLink . '">' . $avatarTag . '</a>';
265                         
266                 $row = array(
267                         'id'            => $messageIdTag,               // メッセージID
268                         'name'          => $nameTag,                    // 会員名
269                         'date'          => $date,                       // 投稿日付
270                         'message'       => $message,            // 投稿文
271                         'avatar'        => $avatarTag   // アバター画像
272                 );
273                 $this->tmpl->addVars('message_list', $row);
274                 $this->tmpl->parseTemplate('message_list', 'a');
275                 
276                 // メッセージが存在するかどうか
277                 $this->isExistsMessage = true;
278                 return true;
279         }
280 }
281 ?>