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-2011 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: m_bbs_2chReadWidgetContainer.php 4039 2011-03-21 05:37:18Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/m_bbs_2chBaseWidgetContainer.php');
18 class m_bbs_2chReadWidgetContainer extends m_bbs_2chBaseWidgetContainer
20 private $threadStyle; // スレッド部表示スタイル
21 private $subjectColor; // 件名文字色
22 private $nameColor; // 登録者名文字色
23 private $createEmailLink; // Eメールのリンクを作成するかどうか
24 private $isExistsMessage; // メッセージが存在するかどうか
29 function __construct()
32 parent::__construct();
37 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
38 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
40 * @param RequestManager $request HTTPリクエスト処理クラス
41 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
42 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
44 function _setTemplate($request, &$param)
46 return 'thread.tmpl.html';
51 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
53 * @param RequestManager $request HTTPリクエスト処理クラス
54 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
57 function _assign($request, &$param)
59 $act = $request->trimValueOf('act');
60 $postTicket = $request->trimValueOf('ticket'); // POST確認用
61 $threadId = $request->trimValueOf(M3_REQUEST_PARAM_BBS_THREAD_ID); // スレッドID
62 $list = $request->trimValueOf(M3_REQUEST_PARAM_LIST_NO); // 取得メッセージ
63 $no = intval($request->trimValueOf(M3_REQUEST_PARAM_ITEM_NO)); // 取得メッセージ
64 $message = $request->mobileTrimValueOf('bbs_message');// 投稿メッセージ
65 $name = $request->mobileTrimValueOf('bbs_name');// 名前
66 $email = $request->trimValueOf('bbs_email');// Eメールアドレス
68 if ($act == 'add'){ // 投稿追加のとき
69 if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){ // 正常なPOST値のとき
71 $this->checkMessageInput($this->_boardId, $threadId, $name, $email, $message);
74 if ($this->getMsgCount() == 0){
76 if (strcasecmp($email, self::DEFAULT_EMAIL_NOT_UPDATE) == 0){ // 日付更新を行わないとき
79 $updateDt = true; // 日付を更新
81 $ret = $this->_db->addMessage($this->_boardId, $threadId, $name, $email, $message, $updateDt, $newSerial);
83 if ($ret){ // データ追加成功のとき
84 //$this->setMsg(self::MSG_GUIDANCE, 'スレッドを作成しました');
85 $this->setMsg(self::MSG_GUIDANCE, '書きこみが終わりました。');
88 $this->tmpl->addVar("thread_area", "name_disabled", 'disabled ');
89 $this->tmpl->addVar("thread_area", "email_disabled", 'disabled ');
90 $this->tmpl->addVar("thread_area", "message_disabled", 'disabled ');
91 $this->tmpl->addVar("thread_area", "button_disabled", 'disabled ');
93 // スレッドが最大数に達したときはメッセージを追加
94 $ret = $this->_db->getThreadInfo($this->_boardId, $threadId, $row);
96 $resCount = $this->_configArray[self::CF_THREAD_RES];
97 if ($row['th_message_count'] >= $resCount){
98 $adminName = $this->_configArray[self::CF_ADMIN_NAME]; // サイト運営者名
99 if (empty($adminName)) $adminName = self::DEFAULT_ADMIN_NAME;
100 $overMessage = $this->_configArray[self::CF_THREAD_END_MESSAGE]; // デフォルトのレス上限メッセージ
101 if (empty($overMessage)) $overMessage = self::DEFAULT_THREAD_END_MESSAGE;
102 $overMessage = str_replace(M3_TAG_START . self::MACRO_RES_MAX_NO . M3_TAG_END, $resCount, $overMessage);// レス上限数を埋め込む
103 $ret = $this->_db->addMessage($this->_boardId, $threadId, $adminName, ''/*Eメール*/, $overMessage, $updateDt, $newSerial);
107 //$this->setMsg(self::MSG_APP_ERR, 'スレッドを作成に失敗しました');
108 $this->setMsg(self::MSG_APP_ERR, '書きこみに失敗しました。');
112 $this->tmpl->addVar("thread_area", "bbs_name", $this->convertToDispString($name));
113 $this->tmpl->addVar("thread_area", "bbs_email", $this->convertToDispString($email));
114 $this->tmpl->addVar("thread_area", "bbs_message", $this->convertToDispString($message));
117 $this->setMsg(self::MSG_APP_ERR, '不正な投稿により、書きこみに失敗しました。');
119 $request->unsetSessionValue(M3_SESSION_POST_TICKET); // セッション値をクリア
123 $this->createEmailLink = $this->_configArray[self::CF_SHOW_EMAIL]; // Eメールのリンクを作成するかどうか
124 $threadColor = $this->_configArray[self::CF_THREAD_COLOR]; // スレッド表示部背景色
125 $this->threadStyle .= 'background-color:' . $threadColor . ';';
126 $this->subjectColor = $this->_configArray[self::CF_SUBJECT_COLOR]; // 件名文字色
127 $this->nameColor = $this->_configArray[self::CF_NAME_COLOR]; // 登録者名文字色
130 $ret = $this->_db->getThreadInfo($this->_boardId, $threadId, $row);
132 $offset = 0; // データ取得開始位置
133 $limit = 0; // 取得数、すべて取得
136 if (empty($list) && !empty($no)){ // メッセージNoで取得のとき
138 if ($offset < 0) $offset = 0;
141 if (strStartsWith($list, 'l')){ // 最新から取得の場合
142 $messageCount = intval(substr($list, 1));
143 if ($messageCount <= 0) $messageCount = 1;
144 $offset = $row['th_message_count'] - $messageCount;
145 if ($offset < 0) $offset = 0;
146 $limit = $messageCount;
150 $this->_db->getThreadMessageByRange(array($this, 'itemsLoop'), $this->_boardId, $threadId, $limit, $offset);
153 $threadUrl = $this->_currentPageUrl . '&' . M3_REQUEST_PARAM_BBS_THREAD_ID . '=' . $threadId;
154 $threadNewUrl = $this->_currentPageUrl . '&' . M3_REQUEST_PARAM_BBS_THREAD_ID . '=' . $threadId . '&' . M3_REQUEST_PARAM_LIST_NO . '=l1';
155 $thread50Url = $this->_currentPageUrl . '&' . M3_REQUEST_PARAM_BBS_THREAD_ID . '=' . $threadId . '&' . M3_REQUEST_PARAM_LIST_NO . '=l' . self::DEFAULT_LAST_MESSAGE_COUNT;
156 $thread100Url = $this->_currentPageUrl . '&' . M3_REQUEST_PARAM_BBS_THREAD_ID . '=' . $threadId . '&' . M3_REQUEST_PARAM_LIST_NO . '=' . self::DEFAULT_MESSAGE_COUNT_PER_PAGE;
157 $reloadUrl = $this->_currentPageUrl;
160 $this->tmpl->addVar("thread_area", "bbs_url", $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrl(), true)));
161 $this->tmpl->addVar("thread_area", "thread_url", $this->convertUrlToHtmlEntity($this->getUrl($threadUrl, true)));// スレッド全表示URL
162 $this->tmpl->addVar("thread_area", "threadNew_url", $this->convertUrlToHtmlEntity($this->getUrl($threadNewUrl, true)));// スレッド最新表示URL
163 $this->tmpl->addVar("thread_area", "thread50_url", $this->convertUrlToHtmlEntity($this->getUrl($thread50Url, true)));// スレッド最新50表示URL
164 $this->tmpl->addVar("thread_area", "thread100_url", $this->convertUrlToHtmlEntity($this->getUrl($thread100Url, true)));// スレッド100まで表示URL
165 $this->tmpl->addVar("thread_area", "reload_url", $this->convertUrlToHtmlEntity($this->getUrl($reloadUrl, true)));// 画面再表示
166 $this->tmpl->addVar("thread_area", "thread_id", $threadId);
167 $this->tmpl->addVar("thread_area", "subject", $this->convertToDispString($row['th_subject'])); // スレッド件名
168 $this->tmpl->addVar("thread_area", "subject_color", $this->subjectColor); // 件名表示色
170 // スレッドが存在しないときはタグを非表示にする
171 if (!$this->isExistsMessage){
172 $this->setUserErrorMsg('ERROR:メッセージが存在しません!');
174 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
177 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
178 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket); // セッションに保存
179 $this->tmpl->addVar("thread_area", "ticket", $postTicket); // 画面に書き出し
181 $this->setUserErrorMsg('ERROR:スレッドIDが不正です!');
184 $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
188 $this->tmpl->addVar("thread_area", "post_url", $this->_currentPageUrl);
191 $this->tmpl->addVar("thread_area", "thread_style", $this->threadStyle);
194 * 取得したコンテンツ項目をテンプレートに設定する
196 * @param int $index 行番号
197 * @param array $fetchedRow 取得行
198 * @param object $param 任意使用パラメータ
199 * @return bool trueを返すとループ続行。falseを返すとその時点で終了。
201 function itemsLoop($index, $fetchedRow)
203 $no = $fetchedRow['te_index']; // メッセージインデックス番号
205 // ##### メッセージ部分を作成 #####
207 $name = $this->convertToDispString($fetchedRow['te_user_name']); // ユーザ名
208 if (empty($name)) $name = $this->_configArray[self::CF_NONAME_NAME]; // 名前未設定時の表示名
209 $email = $this->convertToDispString($fetchedRow['te_email']); // Eメール
210 if (!empty($email) && !empty($this->createEmailLink)){ // Eメールリンク作成のとき
211 $name = '<a href="mailto:' . $email . '">' . $name . '</a>';
213 $name = '<span style="color:' . $this->nameColor . ';">' . $name . '</span>';
217 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
218 $timestamp = strtotime($fetchedRow['te_regist_dt']);
219 $weekNo = intval(date('w', $timestamp));
220 $date = date('Y/m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
223 $message = $this->convertToDispString($fetchedRow['te_message']);// 文字エスケープ処理
224 $message = $this->convertToPreviewText($message); // 改行をBRタグに変換
225 if ($fetchedRow['te_index'] == 1) $message .= '<br />'; // トップのメッセージは改行を追加
228 $message = $this->convDispMessage($message, $fetchedRow['te_thread_id']);
231 if ($fetchedRow['te_deleted']){
233 $message = '参照できません。';
237 'no' => $no, // メッセージインデックス番号
238 'name' => $name, // 投稿者名
239 'date' => $date, // 投稿日付
240 'message' => $message // 投稿文
242 $this->tmpl->addVars('message_list', $row);
243 $this->tmpl->parseTemplate('message_list', 'a');
246 $this->isExistsMessage = true;