OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / bbs_2ch_main / include / container / bbs_2ch_mainReadWidgetContainer.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-2011 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: bbs_2ch_mainReadWidgetContainer.php 4055 2011-04-01 07:15:28Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/bbs_2ch_mainBaseWidgetContainer.php');
17
18 class bbs_2ch_mainReadWidgetContainer extends bbs_2ch_mainBaseWidgetContainer
19 {
20         private $threadStyle;   // スレッド部表示スタイル
21         private $subjectColor;  // 件名文字色
22         private $nameColor;             // 登録者名文字色
23         private $createEmailLink;       // Eメールのリンクを作成するかどうか
24         private $isExistsMessage;       // メッセージが存在するかどうか
25         
26         /**
27          * コンストラクタ
28          */
29         function __construct()
30         {
31                 // 親クラスを呼び出す
32                 parent::__construct();
33         }
34         /**
35          * テンプレートファイルを設定
36          *
37          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
38          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
39          *
40          * @param RequestManager $request               HTTPリクエスト処理クラス
41          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
42          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
43          */
44         function _setTemplate($request, &$param)
45         {
46                 return 'thread.tmpl.html';
47         }
48         /**
49          * テンプレートにデータ埋め込む
50          *
51          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
52          *
53          * @param RequestManager $request               HTTPリクエスト処理クラス
54          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
55          * @param                                                               なし
56          */
57         function _assign($request, &$param)
58         {
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->valueOf('bbs_message');// 投稿メッセージ
65                 $name = $request->trimValueOf('bbs_name');// 名前
66                 $email = $request->trimValueOf('bbs_email');// Eメールアドレス
67                 
68                 if ($act == 'add'){             // 投稿追加のとき
69                         if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){           // 正常なPOST値のとき
70                                 // 入力項目のエラーチェック
71                                 $this->checkMessageInput($this->_boardId, $threadId, $name, $email, $message);
72                         
73                                 // エラーなしの場合は、データを更新
74                                 if ($this->getMsgCount() == 0){
75                                         // 新規投稿文の追加
76                                         if (strcasecmp($email, self::DEFAULT_EMAIL_NOT_UPDATE) == 0){           // 日付更新を行わないとき
77                                                 $updateDt = false;
78                                         } else {
79                                                 $updateDt = true;               // 日付を更新
80                                         }
81                                         $ret = $this->_db->addMessage($this->_boardId, $threadId, $name, $email, $message, $updateDt, $newSerial);
82
83                                         if ($ret){              // データ追加成功のとき
84                                                 //$this->setMsg(self::MSG_GUIDANCE, 'スレッドを作成しました');
85                                                 $this->setMsg(self::MSG_GUIDANCE, '書きこみが終わりました。');
86                                         
87                                                 // 入力項目を使用不可に設定
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 ');
92                                                 
93                                                 // スレッドが最大数に達したときはメッセージを追加
94                                                 $ret = $this->_db->getThreadInfo($this->_boardId, $threadId, $row);
95                                                 if ($ret){
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);
104                                                         }
105                                                 }
106                                         } else {
107                                                 //$this->setMsg(self::MSG_APP_ERR, 'スレッドを作成に失敗しました');
108                                                 $this->setMsg(self::MSG_APP_ERR, '書きこみに失敗しました。');
109                                         }
110                                 } else {
111                                         // 入力データを再設定
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));
115                                 }
116                         } else {
117                                 $this->setMsg(self::MSG_APP_ERR, '不正な投稿により、書きこみに失敗しました。');
118                         }
119                         $request->unsetSessionValue(M3_SESSION_POST_TICKET);            // セッション値をクリア
120                 }
121                 
122                 // 表示スタイル作成
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];            // 登録者名文字色
128                 
129                 // スレッドIDが正しいかチェック
130                 $ret = $this->_db->getThreadInfo($this->_boardId, $threadId, $row);
131                 if ($ret){
132                         $offset = 0;            // データ取得開始位置
133                         $limit = 0;             // 取得数、すべて取得
134                         
135                         // 表示範囲を取得
136                         if (empty($list) && !empty($no)){               // メッセージNoで取得のとき
137                                 $offset = $no -1;
138                                 if ($offset < 0) $offset = 0;
139                                 $limit = 1;
140                         } else {                // 一覧で取得のとき
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;
147                                 }
148                         }
149                         // 投稿文を作成
150                         $this->_db->getThreadMessageByRange(array($this, 'itemsLoop'), $this->_boardId, $threadId, $limit, $offset);
151                         
152                         // リンク作成
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;
158                         
159                         // 画面にデータを埋め込む
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);               // 件名表示色
169                         
170                         // スレッドが存在しないときはタグを非表示にする
171                         if (!$this->isExistsMessage){
172                                 $this->setUserErrorMsg('ERROR:メッセージが存在しません!');
173                                 
174                                 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
175                         }
176                         // ハッシュキー作成
177                         $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
178                         $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket);         // セッションに保存
179                         $this->tmpl->addVar("thread_area", "ticket", $postTicket);                              // 画面に書き出し
180                 } else {
181                         $this->setUserErrorMsg('ERROR:スレッドIDが不正です!');
182                         
183                         // スレッド表示部を非表示にする
184                         $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
185                 }
186
187                 // 画面にデータを埋め込む
188                 $this->tmpl->addVar("thread_area", "thread_style", $this->threadStyle);
189         }
190         /**
191          * 取得したコンテンツ項目をテンプレートに設定する
192          *
193          * @param int           $index                  行番号
194          * @param array         $fetchedRow             取得行
195          * @param object        $param                  任意使用パラメータ
196          * @return bool                                         trueを返すとループ続行。falseを返すとその時点で終了。
197          */
198         function itemsLoop($index, $fetchedRow)
199         {
200                 $no = $fetchedRow['te_index'];                  // メッセージインデックス番号
201                 
202                 // ##### メッセージ部分を作成 #####
203                 // 登録者名作成
204                 $name = $this->convertToDispString($fetchedRow['te_user_name']);                // ユーザ名
205                 if (empty($name)) $name = $this->_configArray[self::CF_NONAME_NAME];                            // 名前未設定時の表示名
206                 $email = $this->convertToDispString($fetchedRow['te_email']);                   // Eメール
207                 if (!empty($email) && !empty($this->createEmailLink)){                  // Eメールリンク作成のとき
208                         $name = '<a href="mailto:' . $email . '"><b>' . $name . ' </b></a>';
209                 } else {
210                         $name = '<font color="' . $this->nameColor . '"><b>' . $name . ' </b></font>';
211                 }
212                 
213                 // 日付作成
214                 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
215                 $timestamp = strtotime($fetchedRow['te_regist_dt']);
216                 $weekNo = intval(date('w', $timestamp));
217                 $date = date('Y/m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
218                 
219                 // 投稿文
220                 $message = $this->convertToDispString($fetchedRow['te_message']);// 文字エスケープ処理
221                 $message = $this->convertToPreviewText($message);                       // 改行をBRタグに変換
222                 if ($fetchedRow['te_index'] == 1) $message .= '<br />';         // トップのメッセージは改行を追加
223                 
224                 // メッセージ変換
225                 $message = $this->convDispMessage($message, $fetchedRow['te_thread_id']);
226                 
227                 // 削除メッセージのとき
228                 if ($fetchedRow['te_deleted']){
229                         $name = '参照不可';
230                         $message = '参照できません。';
231                 }
232                 
233                 $row = array(
234                         'no'            => $no,         // メッセージインデックス番号
235                         'name'          => $name,       // 投稿者名
236                         'date'          => $date,       // 投稿日付
237                         'message'               => $message             // 投稿文
238                 );
239                 $this->tmpl->addVars('message_list', $row);
240                 $this->tmpl->parseTemplate('message_list', 'a');
241                 
242                 // メッセージが存在するかどうか
243                 $this->isExistsMessage = true;
244                 return true;
245         }
246 }
247 ?>