OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / s / bbs_2ch / include / container / admin_s_bbs_2chMessageWidgetContainer.php
1 <?php
2 /**
3  * コンテナクラス
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-2012 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: admin_s_bbs_2chMessageWidgetContainer.php 4851 2012-04-15 00:43:29Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/admin_s_bbs_2chBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/s_bbs_2chDb.php');
18
19 class admin_s_bbs_2chMessageWidgetContainer extends admin_s_bbs_2chBaseWidgetContainer
20 {
21         private $db;    // DB接続オブジェクト
22         private $serialNo;              // 選択中の項目のシリアル番号
23         private $serialArray = array();         // 表示されているコンテンツシリアル番号
24         private $isExistsContent;               // メッセージ項目が存在するかどうか
25         const DEFAULT_LIST_COUNT = 30;                  // 最大リスト表示数
26         const LIST_MESSAGE_LENGTH = 50;                 // 一覧に表示するメッセージの長さ
27         
28         /**
29          * コンストラクタ
30          */
31         function __construct()
32         {
33                 // 親クラスを呼び出す
34                 parent::__construct();
35                 
36                 // DBオブジェクト作成
37                 $this->db = new s_bbs_2chDb();
38         }
39         /**
40          * テンプレートファイルを設定
41          *
42          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
43          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
44          *
45          * @param RequestManager $request               HTTPリクエスト処理クラス
46          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
47          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
48          */
49         function _setTemplate($request, &$param)
50         {
51                 $filename = '';
52                 $task = $request->trimValueOf('task');
53                 switch ($task){
54                         case 'message':         // メッセージ管理
55                         default:
56                                 $filename = 'admin_message.tmpl.html';
57                                 break;
58                         case 'message_detail':          // メッセージ管理詳細
59                                 $filename = 'admin_message_detail.tmpl.html';
60                                 break;
61                 }
62                 return $filename;
63         }
64         /**
65          * テンプレートにデータ埋め込む
66          *
67          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
68          *
69          * @param RequestManager $request               HTTPリクエスト処理クラス
70          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
71          * @return                                                              なし
72          */
73         function _assign($request, &$param)
74         {
75                 $task = $request->trimValueOf('task');
76                 switch ($task){
77                         case 'message':         // メッセージ管理
78                         default:
79                                 $this->createList($request);
80                                 break;
81                         case 'message_detail':          // メッセージ管理詳細
82                                 $this->createDetail($request);
83                                 break;
84                 }
85         }
86         /**
87          * コンテンツ一覧画面作成
88          *
89          * @param RequestManager $request               HTTPリクエスト処理クラス
90          * @param                                                               なし
91          */
92         function createList($request)
93         {
94                 // ユーザ情報、表示言語
95                 $userId = $this->gEnv->getCurrentUserId();
96                 $langId = $this->gEnv->getDefaultLanguage();
97                 
98                 $pageNo = $request->trimIntValueOf(M3_REQUEST_PARAM_PAGE_NO, '1');                              // ページ番号
99                 if (empty($pageNo)) $pageNo = 1;
100                 
101                 $act = $request->trimValueOf('act');
102                 if ($act == 'delete'){          // 項目削除の場合
103                         $listedItem = explode(',', $request->trimValueOf('seriallist'));
104                         $delItems = array();
105                         for ($i = 0; $i < count($listedItem); $i++){
106                                 // 項目がチェックされているかを取得
107                                 $itemName = 'item' . $i . '_selected';
108                                 $itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
109                                 
110                                 if ($itemValue){                // チェック項目
111                                         $delItems[] = $listedItem[$i];
112                                 }
113                         }
114                         if (count($delItems) > 0){
115                                 $ret = $this->db->delMessage($delItems);
116                                 if ($ret){              // データ削除成功のとき
117                                         $this->setGuidanceMsg('データを削除しました');
118                                 } else {
119                                         $this->setAppErrorMsg('データ削除に失敗しました');
120                                 }
121                         }
122                 } else if ($act == 'selpage'){                  // ページ選択
123                 }
124                 // 一覧表示数
125                 $maxListCount = self::DEFAULT_LIST_COUNT;
126                 
127                 // メッセージ総数を取得
128                 $totalCount = $this->db->getMessageCount($this->_boardId);
129
130                 // 表示するページ番号の修正
131                 $pageCount = (int)(($totalCount -1) / $maxListCount) + 1;               // 総ページ数
132                 if ($pageNo < 1) $pageNo = 1;
133                 if ($pageNo > $pageCount) $pageNo = $pageCount;
134                 $this->firstNo = ($pageNo -1) * $maxListCount + 1;              // 先頭番号
135                 
136                 // ページング用リンク作成
137                 $pageLink = '';
138                 if ($pageCount > 1){    // ページが2ページ以上のときリンクを作成
139                         for ($i = 1; $i <= $pageCount; $i++){
140                                 if ($i == $pageNo){
141                                         $link = '&nbsp;' . $i;
142                                 } else {
143                                         $link = '&nbsp;<a href="#" onclick="selpage(\'' . $i . '\');return false;">' . $i . '</a>';
144                                 }
145                                 $pageLink .= $link;
146                         }
147                 }
148                 
149                 // メッセージ一覧を取得
150                 $this->db->getMessage($this->_boardId, $maxListCount, $pageNo, array($this, 'itemListLoop'));
151                 if (!$this->isExistsContent) $this->tmpl->setAttribute('itemlist', 'visibility', 'hidden');// コンテンツ項目がないときは、一覧を表示しない
152                 
153                 // 画面にデータを埋め込む
154                 $this->tmpl->addVar("_widget", "page_link", $pageLink);
155                 $this->tmpl->addVar("_widget", "total_count", $totalCount);
156                 $this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示項目のシリアル番号を設定
157         }
158         /**
159          * コンテンツ詳細画面作成
160          *
161          * @param RequestManager $request               HTTPリクエスト処理クラス
162          * @param                                                               なし
163          */
164         function createDetail($request)
165         {
166                 // ユーザ情報、表示言語
167                 $langId = $this->gEnv->getDefaultLanguage();
168                 
169                 $act = $request->trimValueOf('act');
170                 $this->serialNo = $request->trimValueOf('serial');              // 選択項目のシリアル番号
171                 $name = $request->valueOf('item_name');
172                 $message = $request->valueOf('item_message');
173                 
174                 $reloadData = false;            // データの再読み込み          
175                 if ($act == 'delete'){          // 項目削除の場合
176                         if (empty($this->serialNo)){
177                                 $this->setUserErrorMsg('削除項目が選択されていません');
178                         }
179                         // エラーなしの場合は、データを削除
180                         if ($this->getMsgCount() == 0){
181                                 $ret = $this->db->delMessage(array($this->serialNo));
182                                 if ($ret){              // データ削除成功のとき
183                                         $this->setGuidanceMsg('データを削除しました');
184                                         $reloadData = true;             // データの再読み込み
185                                 } else {
186                                         $this->setAppErrorMsg('データ削除に失敗しました');
187                                 }
188                         }
189                 } else if ($act == 'update'){           // 項目更新の場合
190                         // エラーなしの場合は、データを更新
191                         if ($this->getMsgCount() == 0){
192                                 // データ再取得
193                                 $ret = $this->db->getMessageBySerial($this->serialNo, $row);
194                                 if ($ret){
195                                         //$name = $row['te_user_name'];         // ニックネーム
196                                         $email = $row['te_email'];              // Eメール
197                                 //      $message = $row['te_message'];                          // メッセージ
198                                         
199                                         // データ更新
200                                         $ret = $this->db->updateMessage($this->serialNo, $name, $email, $message);
201                                 }
202                                 
203                                 if ($ret){
204                                         $this->setGuidanceMsg('データを更新しました');
205                                         $reloadData = true;             // データの再読み込み
206                                 } else {
207                                         $this->setAppErrorMsg('データ更新に失敗しました');
208                                 }
209                         }
210                 } else {
211                         $reloadData = true;             // データの再読み込み
212                 }
213                 if ($reloadData){               // データの再読み込み
214                         $ret = $this->db->getMessageBySerial($this->serialNo, $row);
215                         if ($ret){
216                                 $no = $row['te_index'];
217                                 $name = $row['te_user_name'];           // ニックネーム
218                                 $title = $row['th_subject'];    // タイトル
219                                 $message = $row['te_message'];                          // メッセージ
220                                 $regist_dt = $row['te_regist_dt'];
221                         } else {
222                                 $this->serialNo = 0;
223                                 $name = '';
224                                 $message = '';
225                         }
226                 } else {
227                         // 表示のみのデータを再取得
228                         $ret = $this->db->getMessageBySerial($this->serialNo, $row);
229                         if ($ret){
230                                 $no = $row['te_index'];
231                                 $name = $row['te_user_name'];           // ニックネーム
232                                 $title = $row['th_subject'];    // タイトル
233                                 $message = $row['te_message'];                          // メッセージ
234                                 $regist_dt = $row['te_regist_dt'];
235                         }
236                 }
237                 
238                 // ### 入力値を再設定 ###
239                 $this->tmpl->addVar("_widget", "no", $no);                              // 投稿番号
240                 $this->tmpl->addVar("_widget", "name", $this->convertToDispString($name));                              // ニックネーム
241                 $this->tmpl->addVar("_widget", "title", $this->convertToDispString($title));                    // タイトル
242                 $this->tmpl->addVar("_widget", "message", $this->convertToDispString($message));                // メッセージ
243                 $this->tmpl->addVar("_widget", "regist_dt", $this->convertToDispDateTime($regist_dt));  // 投稿日時
244         
245                 // 選択中のシリアル番号を設定
246                 $this->tmpl->addVar("_widget", "serial", $this->serialNo);
247                 
248                 // ボタンの表示制御
249                 if (!empty($this->serialNo)){
250                         $this->tmpl->setAttribute('del_button', 'visibility', 'visible');// 「削除」ボタン
251                         $this->tmpl->setAttribute('update_button', 'visibility', 'visible');
252                 }
253         }
254         /**
255          * 取得したデータをテンプレートに設定する
256          *
257          * @param int $index                    行番号(0~)
258          * @param array $fetchedRow             フェッチ取得した行
259          * @param object $param                 未使用
260          * @return bool                                 true=処理続行の場合、false=処理終了の場合
261          */
262         function itemListLoop($index, $fetchedRow, $param)
263         {
264                 $serial = $fetchedRow['te_serial'];
265                 
266                 // メッセージ
267                 $message = $fetchedRow['te_message'];
268                 $message = makeTruncStr($message, self::LIST_MESSAGE_LENGTH);// メッセージ長調整
269
270                 $row = array(
271                         'index' => $index,                                                                                                      // 項目番号
272                         'serial' => $serial,                    // シリアル番号
273                         'no' => $this->convertToDispString($fetchedRow['te_index']),                    // 投稿番号
274                         'title' => $this->convertToDispString($fetchedRow['th_subject']),               // タイトル
275                         'message' => $this->convertToDispString($message),              // メッセージ
276                         'name' => $this->convertToDispString($fetchedRow['te_user_name']),              // ニックネーム
277                         'update_dt' => $this->convertToDispDateTime($fetchedRow['te_regist_dt'])        // 投稿日時
278                 );
279                 $this->tmpl->addVars('itemlist', $row);
280                 $this->tmpl->parseTemplate('itemlist', 'a');
281                 
282                 // 表示中のコンテンツIDを保存
283                 $this->serialArray[] = $serial;
284                 
285                 $this->isExistsContent = true;          // コンテンツ項目が存在するかどうか
286                 return true;
287         }
288 }
289 ?>