7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
10 * @author 株式会社 毎日メディアサービス
11 * @copyright Copyright 2010 株式会社 毎日メディアサービス.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: m_chachaThreadWidgetContainer.php 3363 2010-07-10 05:12:31Z fishbone $
14 * @link http://www.m-media.co.jp
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/m_chachaBaseWidgetContainer.php');
18 class m_chachaThreadWidgetContainer extends m_chachaBaseWidgetContainer
20 private $messageCount; // メッセージ数
21 private $isExistsMessage; // メッセージが存在するかどうか
22 private $isExistsNextPage; // 次のページがあるかどうか
27 function __construct()
30 parent::__construct();
35 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
36 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
38 * @param RequestManager $request HTTPリクエスト処理クラス
39 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
40 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
42 function _setTemplate($request, &$param)
44 return 'thread.tmpl.html';
49 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
51 * @param RequestManager $request HTTPリクエスト処理クラス
52 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
55 function _assign($request, &$param)
57 $act = $request->trimValueOf('act');
58 $postTicket = $request->trimValueOf('ticket'); // POST確認用
59 $pageNo = $request->trimIntValueOf(M3_REQUEST_PARAM_PAGE_NO, '1'); // ページ番号
60 $messageId = $request->trimValueOf(self::URL_PARAM_MESSAGE_ID); // メッセージID
61 $message = $request->mobileTrimValueOf('message'); // 投稿メッセージ
64 $canPost = false; // ブログ投稿可能かどうか
65 $clientId = $this->_mobileId;
68 $clientMemberId = ''; // 現在の端末の会員ID
69 $ret = $this->_db->getMemberInfoByDeviceId($clientId, $row);
70 if ($ret) $clientMemberId = $row['mb_id'];
71 if (!empty($clientMemberId)) $canPost = true; // ブログ返信可能かどうか
73 $reloadData = false; // データの再読み込み
74 if ($act == 'add'){ // 新規追加のとき
75 if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){ // 正常なPOST値のとき
77 if (!$canPost) $this->setUserErrorMsg('投稿権限がありません');
80 if ($this->checkInput($message, 'メッセージ')){
82 $messageLength = $this->_configArray[self::CF_MESSAGE_LENGTH]; // 最大メッセージ長
83 if (getLetterCount($message) > $messageLength) $this->setUserErrorMsg('メッセージは' . $messageLength . '文字まで入力可能です');
85 if (empty($clientMemberId)) $this->setUserErrorMsg('会員IDが不正です');
88 if ($this->getMsgCount() == 0){
89 $ret = $this->_db->addNewReply($this->_boardId, $messageId, $clientMemberId, $message);
90 if ($ret){ // データ追加成功のとき
91 $this->setGuidanceMsg('投稿完了しました');
93 $message = ''; // メッセージクリア
95 $this->setAppErrorMsg('投稿に失敗しました');
99 $request->unsetSessionValue(M3_SESSION_POST_TICKET); // セッション値をクリア
101 $reloadData = true; // データの再読み込み
105 $ret = $this->_db->getThreadInfo($this->_boardId, $messageId, $row);
108 $memberId = $row['mb_id']; // 会員ID
109 $memberName = $row['mb_name']; // 会員名
110 $messageId = $row['mm_thread_id'];
111 $messageCount = $row['mt_message_count'] -1; // メッセージ数
112 $mypageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
113 $messageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId, true));
116 $nameTag = '<a href="' . $mypageLink . '">' . $this->convertToDispString($memberName) . '</a>';
119 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
120 $timestamp = strtotime($row['mm_regist_dt']);
121 $weekNo = intval(date('w', $timestamp));
122 $date = date('m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
125 $topMessage = $this->convertToDispString($row['mm_message']);// 文字エスケープ処理
126 $topMessage = $this->_convertToPreviewTextWithSpace($topMessage); // 改行をスペースに変換
127 $topMessage = $this->convDispMessage($topMessage, $row['mm_thread_id']);// メッセージ内のリンクを作成
130 $messageIdTag = '<a href="' . $messageLink . '">#' . $messageId . '</a>';
133 $avatarImageUrl = $this->getAvatarUrl($memberId);
134 $avatarTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
135 //$avatarTag = '<a href="' . $mypageLink . '">' . $avatarTag . '</a>';
137 $this->tmpl->addVar("thread_area", "id", $messageIdTag); // メッセージID
138 $this->tmpl->addVar("thread_area", "thread_message_count", $messageCount); // メッセージ数
139 $this->tmpl->addVar("thread_area", "name", $nameTag); // 会員名
140 $this->tmpl->addVar("thread_area", "date", $date); // 投稿日付
141 $this->tmpl->addVar("thread_area", "thread_message", $topMessage); // 投稿文
142 $this->tmpl->addVar("thread_area", "avatar", $avatarTag); // アバター画像
144 // 登録用リンクを作成。会員として認識できないときはプロフィール画面。
147 if (empty($clientMemberId)){
148 $registName = 'ユーザ登録[3]';
149 $registUrl = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&task=' . self::TASK_PROFILE, true));
150 $registLink = '<a href="' . $registUrl . '" accesskey="3">' . $registName . '</a>';
152 $this->tmpl->addVar("_widget", "regist_name", $registName);
153 $this->tmpl->addVar("_widget", "regist_link", $registLink);
156 // 1つ多く呼び出し、次のページがあるか確認
157 $this->messageCount = $this->_configArray[self::CF_MESSAGE_COUNT_MYPAGE]; // 最大項目数
158 $this->_db->getThreadReply(array($this, 'itemsLoop'), $this->_boardId, $messageId, $this->messageCount, $pageNo, true);
160 // スレッドが存在しないときは一覧を非表示にする
161 if (!$this->isExistsMessage){
163 $this->tmpl->setAttribute('no_message_area', 'visibility', 'visible');
164 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
169 if ($pageNo > 1){ // 前のページがあるとき
170 $foreLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId . '&page=' . ($pageNo -1), true));
171 $pageLink .= '<a href="' . $foreLink . '" accesskey="1">前へ[1]</a>';
173 if ($this->isExistsNextPage){ // 次のページがあるとき
174 if (!empty($pageLink)) $pageLink .= ' ';
175 $nextLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId . '&page=' . ($pageNo +1), true));
176 $pageLink .= '<a href="' . $nextLink . '" accesskey="2">次へ[2]</a>';
178 $this->tmpl->addVar("_widget", "page_link", $pageLink);
180 if ($canPost){ // ブログ返信可能なとき
181 $this->tmpl->setAttribute('add_area', 'visibility', 'visible');// 投稿エリアを表示
182 $this->tmpl->addVar('add_area', 'act', 'add'); // 登録
183 $this->tmpl->addVar("add_area", "member_id", $memberId); // 会員ID
184 $this->tmpl->addVar("add_area", "message", $message);
185 $this->tmpl->addVar("add_area", "current_url", $this->gEnv->getCurrentRequestUri());
188 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
189 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket); // セッションに保存
190 $this->tmpl->addVar("add_area", "ticket", $postTicket); // 画面に書き出し
193 $this->setUserErrorMsg('メッセージIDが不正です');
196 $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
200 * 取得したメッセージ項目をテンプレートに設定する
202 * @param int $index 行番号
203 * @param array $fetchedRow 取得行
204 * @param object $param 任意使用パラメータ
205 * @return bool trueを返すとループ続行。falseを返すとその時点で終了。
207 function itemsLoop($index, $fetchedRow)
210 if ($index >= $this->messageCount){
211 $this->isExistsNextPage = true; // 次のページあり
216 $memberId = $fetchedRow['mb_id']; // 会員ID
217 $memberName = $fetchedRow['mb_name']; // 会員名
218 $messageId = $fetchedRow['mm_thread_id'];
219 $messageId .= '-' . $fetchedRow['mm_index'];
220 $mypageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
221 $messageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId, true));
224 $nameTag = '<a href="' . $mypageLink . '">' . $this->convertToDispString($memberName) . '</a>';
227 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
228 $timestamp = strtotime($fetchedRow['mm_regist_dt']);
229 $weekNo = intval(date('w', $timestamp));
230 $date = date('m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
233 $message = $this->convertToDispString($fetchedRow['mm_message']);// 文字エスケープ処理
234 $message = $this->_convertToPreviewTextWithSpace($message); // 改行をスペースに変換
235 $message = $this->convDispMessage($message, $fetchedRow['mm_thread_id']);// メッセージ内のリンクを作成
238 $messageIdTag = '<a href="' . $messageLink . '">#' . $messageId . '</a>';
241 /*if ($fetchedRow['mm_deleted']){
242 $message = '参照できません。';
245 $avatarImageUrl = $this->getAvatarUrl($memberId);
246 $avatarTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
247 //$avatarTag = '<a href="' . $mypageLink . '">' . $avatarTag . '</a>';
250 'id' => $messageIdTag, // メッセージID
251 'name' => $nameTag, // 会員名
252 'date' => $date, // 投稿日付
253 'message' => $message, // 投稿文
254 'avatar' => $avatarTag, // アバター画像
255 'spacer' => $this->_spacer // スペーサ
257 $this->tmpl->addVars('message_list', $row);
258 $this->tmpl->parseTemplate('message_list', 'a');
261 $this->isExistsMessage = true;