OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / chacha_main / include / container / chacha_mainMypageWidgetContainer.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_mainMypageWidgetContainer.php 3367 2010-07-11 11:45:28Z fishbone $
14  * @link       http://www.m-media.co.jp
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/chacha_mainBaseWidgetContainer.php');
17
18 class chacha_mainMypageWidgetContainer extends chacha_mainBaseWidgetContainer
19 {
20         private $threadStyle;   // スレッド部表示スタイル
21         private $isExistsMessage;       // メッセージが存在するかどうか
22         private $isExistsNextPage;      // 次のページがあるかどうか
23         private $messageCount;          // メッセージ総数
24         const THREAD_ID_LENGTH = 5;     // スレッドIDの長さ
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 'mypage.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                 $pageNo = $request->trimIntValueOf(M3_REQUEST_PARAM_PAGE_NO, '1');                              // ページ番号
61                 if (empty($pageNo)) $pageNo = 1;
62                 $postTicket = $request->trimValueOf('ticket');          // POST確認用
63                 $memberId = $request->trimValueOf(self::URL_PARAM_MEMBER_ID);   // 会員ID
64                 $message = $request->trimValueOf('message');            // 投稿メッセージ
65                 
66                 // 現在アクセス中の端末IDを取得
67                 $canPost = false;                       // ブログ投稿可能かどうか
68                 $clientId = '';
69                 if ($this->gEnv->canUseCookie()){               // クッキー使用可能なとき
70                         $clientId = $this->gAccess->getClientId();
71                 }
72                 
73                 // 自分のブログページのときは投稿可能
74                 $clientMemberId = '';                   // 現在の端末の会員ID
75                 $ret = $this->_db->getMemberInfoByDeviceId($clientId, $row);
76                 if ($ret) $clientMemberId = $row['mb_id'];
77                 if (!empty($memberId) && $memberId == $clientMemberId) $canPost = true;                 // ブログ投稿可能かどうか
78                 
79                 if ($act == 'add'){             // 投稿追加のとき
80                         if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){           // 正常なPOST値のとき
81                                 // 投稿権限のチェック
82                                 if (!$canPost) $this->setUserErrorMsg('投稿権限がありません');
83                                                 
84                                 // 入力項目のエラーチェック
85                                 //$this->checkMessageInput($this->_boardId, $threadId, $name, $email, $message);
86                                 if ($this->checkInput($message, 'メッセージ')){
87                                         // 文字数のチェック
88                                         $messageLength = $this->_configArray[self::CF_MESSAGE_LENGTH];                  // 最大メッセージ長
89                                         if (getLetterCount($message) > $messageLength) $this->setUserErrorMsg('メッセージは' . $messageLength . '文字まで入力可能です');
90                                 }
91                                 if (empty($memberId)) $this->setUserErrorMsg('会員IDが不正です');
92                         
93                                 // エラーなしの場合は、データを更新
94                                 if ($this->getMsgCount() == 0){
95                                         // スレッドID作成
96                                         $threadId = $this->createThreadId();
97                                         if (empty($threadId)){
98                                                 $this->setAppErrorMsg('スレッドIDが作成できません');
99                                         } else {
100                                                 // 新規投稿文の追加
101                                                 $ret = $this->_db->addNewThread($this->_boardId, $threadId, $memberId, ''/*件名*/, $message);
102
103                                                 if ($ret){              // データ追加成功のとき
104                                                         $this->setGuidanceMsg('投稿完了しました');
105                                                         
106                                                         $message = '';                  // メッセージクリア
107                                                 } else {
108                                                         $this->setAppErrorMsg('投稿に失敗しました');
109                                                 }
110                                         }
111                                 }
112                         }
113                         $request->unsetSessionValue(M3_SESSION_POST_TICKET);            // セッション値をクリア
114                 }
115
116                 // 会員情報を取得
117                 $ret = $this->_db->getMemberInfoById($memberId, $row);
118                 if ($ret){
119                         // 会員情報を設定
120                         $avatarImageUrl = $this->getAvatarUrl($memberId);// アバター画像URL
121                         $imageTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
122                         $this->tmpl->addVar("thread_area", "image", $imageTag);         // 画像
123                         
124                         // 投稿文を作成
125                         $this->messageCount = $this->_configArray[self::CF_MESSAGE_COUNT_MYPAGE];               // 最大項目数
126                         $this->_db->getThreadByMemberId($this->_boardId, $memberId, $this->messageCount, $pageNo, array($this, 'itemsLoop'), true);
127                         
128                         // 画面にデータを埋め込む
129                         $this->tmpl->addVar("thread_area", "name", $this->convertToDispString($row['mb_name']));                                // ユーザ名
130
131                         if ($canPost){                  // ブログ投稿可能なとき
132                                 $this->tmpl->setAttribute('add_area', 'visibility', 'visible');// 投稿エリアを表示
133                                 $this->tmpl->addVar("add_area", "member_id", $memberId);                        // 会員ID
134                                 
135                                 // ハッシュキー作成
136                                 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
137                                 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket);         // セッションに保存
138                                 $this->tmpl->addVar("add_area", "ticket", $postTicket);                         // 画面に書き出し
139                         }
140                         
141                         // スレッドが存在しないときはタグを非表示にする
142                         if (!$this->isExistsMessage){
143                                 // 投稿なしのメッセージを表示
144                                 $this->tmpl->setAttribute('no_message_area', 'visibility', 'visible');
145                                 
146                                 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
147                         }
148                         // ページ遷移用リンク
149                         $pageLink = '';
150                         if ($pageNo > 1){                       // 前のページがあるとき
151                                 $foreLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId . '&page=' . ($pageNo -1), true));
152                                 $pageLink .= '<a href="' . $foreLink . '"><b>前へ</b></a>';
153                         }
154                         if ($this->isExistsNextPage){   // 次のページがあるとき
155                                 if (!empty($pageLink)) $pageLink .= '&nbsp;&nbsp;';
156                                 $nextLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId . '&page=' . ($pageNo +1), true));
157                                 $pageLink .= '<a href="' . $nextLink . '"><b>次へ</b></a>';
158                         }
159                         $this->tmpl->addVar("_widget", "page_link", $pageLink);
160                         
161                         // リンク作成
162                         $profileLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&task=' . self::TASK_PROFILE . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
163                         $this->tmpl->setAttribute('top_link_area', 'visibility', 'visible');
164                         $this->tmpl->addVar("top_link_area", "profile_url", $profileLink);                      // プロフィールURL
165                 } else {
166                         $this->setUserErrorMsg('会員IDが不正です');
167                         
168                         // スレッド表示部を非表示にする
169                         $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
170                 }
171                 // 表示設定
172                 $this->threadStyle = self::CSS_BLOG_INNER_STYLE;
173                 $threadColor = $this->_configArray[self::CF_THREAD_COLOR];              // スレッド表示部背景色
174                 if (empty($threadColor)) $threadColor = $this->_configArray[self::CF_INNER_BG_COLOR];           // デフォルトの内枠背景色
175                 if (!empty($threadColor)) $this->threadStyle .= 'background-color:' . $threadColor . ';';
176                 $this->tmpl->addVar("_widget", "thread_style", $this->threadStyle);
177                 
178                 // 画面にデータを埋め込む
179                 $this->tmpl->addVar("add_area", "message", $message);
180         }
181         /**
182          * 取得したコンテンツ項目をテンプレートに設定する
183          *
184          * @param int           $index                  行番号
185          * @param array         $fetchedRow             取得行
186          * @param object        $param                  任意使用パラメータ
187          * @return bool                                         trueを返すとループ続行。falseを返すとその時点で終了。
188          */
189         function itemsLoop($index, $fetchedRow)
190         {
191                 // 最大表示数を超えたときは終了
192                 if ($index >= $this->messageCount){
193                         $this->isExistsNextPage = true;                         // 次のページあり
194                         return false;
195                 }
196                 
197                 // 日付作成
198                 $weekDay = array('日', '月', '火', '水', '木', '金', '土');
199                 $timestamp = strtotime($fetchedRow['mm_regist_dt']);
200                 $weekNo = intval(date('w', $timestamp));
201                 $date = date('Y/m/d(' . $weekDay[$weekNo] . ') H:i:s', $timestamp);
202                 
203                 // 投稿文
204                 $message = $this->convertToDispString($fetchedRow['mm_message']);// 文字エスケープ処理
205                 $message = $this->convertToPreviewText($message);                       // 改行をBRタグに変換
206                 if ($fetchedRow['mm_index'] == 1) $message .= '<br />';         // トップのメッセージは改行を追加
207                 
208                 // メッセージ変換
209                 $message = $this->convDispMessage($message, $fetchedRow['mm_thread_id']);
210                 
211                 // メッセージID
212                 $messageId = $fetchedRow['mm_thread_id'];
213                 $messageCount = $fetchedRow['mt_message_count'] -1;             // メッセージ数
214                 if ($messageCount <= 0) $messageCount = '';                             // 返信がないときはメッセージ数を表示しない
215                 $messageLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MESSAGE_ID . '=' . $messageId, true));
216                 $messageIdTag = '<a href="' . $messageLink  . '">#' . $messageId . '</a>';
217                 // 削除メッセージのとき
218                 /*if ($fetchedRow['mm_deleted']){
219                         $message = '参照できません。';
220                 }*/
221                 
222                 $row = array(
223                         'id'            => $messageIdTag,               // メッセージID
224                         'message_count' => $messageCount,       // メッセージ数
225                         'date'          => $date,                       // 投稿日付
226                         'message'               => $message             // 投稿文
227                 );
228                 $this->tmpl->addVars('message_list', $row);
229                 $this->tmpl->parseTemplate('message_list', 'a');
230                 
231                 // メッセージが存在するかどうか
232                 $this->isExistsMessage = true;
233                 return true;
234         }
235         /**
236          * スレッドIDを作成
237          *
238          * @return string                               スレッドID
239          */
240         function createThreadId()
241         {
242                 $threadId = '';
243                 
244                 for ($i = 0; $i < self::CREATE_CODE_RETRY_COUNT; $i++){
245                         // 「0,I,L,O,i,l,o」除くランダム文字列を作成
246                         $threadId = $this->_createRandString('123456789ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz', self::THREAD_ID_LENGTH);
247                 
248                         // すでに登録済みかどうかチェック
249                         $ret = $this->_db->isExistsThreadId($threadId);
250                         if (!$ret) break;
251                 }
252                 return $threadId;
253         }
254 }
255 ?>