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: chacha_mainMypageWidgetContainer.php 3367 2010-07-11 11:45:28Z fishbone $
14 * @link http://www.m-media.co.jp
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/chacha_mainBaseWidgetContainer.php');
18 class chacha_mainMypageWidgetContainer extends chacha_mainBaseWidgetContainer
20 private $threadStyle; // スレッド部表示スタイル
21 private $isExistsMessage; // メッセージが存在するかどうか
22 private $isExistsNextPage; // 次のページがあるかどうか
23 private $messageCount; // メッセージ総数
24 const THREAD_ID_LENGTH = 5; // スレッドIDの長さ
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 'mypage.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 $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'); // 投稿メッセージ
67 $canPost = false; // ブログ投稿可能かどうか
69 if ($this->gEnv->canUseCookie()){ // クッキー使用可能なとき
70 $clientId = $this->gAccess->getClientId();
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; // ブログ投稿可能かどうか
79 if ($act == 'add'){ // 投稿追加のとき
80 if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){ // 正常なPOST値のとき
82 if (!$canPost) $this->setUserErrorMsg('投稿権限がありません');
85 //$this->checkMessageInput($this->_boardId, $threadId, $name, $email, $message);
86 if ($this->checkInput($message, 'メッセージ')){
88 $messageLength = $this->_configArray[self::CF_MESSAGE_LENGTH]; // 最大メッセージ長
89 if (getLetterCount($message) > $messageLength) $this->setUserErrorMsg('メッセージは' . $messageLength . '文字まで入力可能です');
91 if (empty($memberId)) $this->setUserErrorMsg('会員IDが不正です');
94 if ($this->getMsgCount() == 0){
96 $threadId = $this->createThreadId();
97 if (empty($threadId)){
98 $this->setAppErrorMsg('スレッドIDが作成できません');
101 $ret = $this->_db->addNewThread($this->_boardId, $threadId, $memberId, ''/*件名*/, $message);
103 if ($ret){ // データ追加成功のとき
104 $this->setGuidanceMsg('投稿完了しました');
106 $message = ''; // メッセージクリア
108 $this->setAppErrorMsg('投稿に失敗しました');
113 $request->unsetSessionValue(M3_SESSION_POST_TICKET); // セッション値をクリア
117 $ret = $this->_db->getMemberInfoById($memberId, $row);
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); // 画像
125 $this->messageCount = $this->_configArray[self::CF_MESSAGE_COUNT_MYPAGE]; // 最大項目数
126 $this->_db->getThreadByMemberId($this->_boardId, $memberId, $this->messageCount, $pageNo, array($this, 'itemsLoop'), true);
129 $this->tmpl->addVar("thread_area", "name", $this->convertToDispString($row['mb_name'])); // ユーザ名
131 if ($canPost){ // ブログ投稿可能なとき
132 $this->tmpl->setAttribute('add_area', 'visibility', 'visible');// 投稿エリアを表示
133 $this->tmpl->addVar("add_area", "member_id", $memberId); // 会員ID
136 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
137 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket); // セッションに保存
138 $this->tmpl->addVar("add_area", "ticket", $postTicket); // 画面に書き出し
141 // スレッドが存在しないときはタグを非表示にする
142 if (!$this->isExistsMessage){
144 $this->tmpl->setAttribute('no_message_area', 'visibility', 'visible');
146 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
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>';
154 if ($this->isExistsNextPage){ // 次のページがあるとき
155 if (!empty($pageLink)) $pageLink .= ' ';
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>';
159 $this->tmpl->addVar("_widget", "page_link", $pageLink);
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
166 $this->setUserErrorMsg('会員IDが不正です');
169 $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
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);
179 $this->tmpl->addVar("add_area", "message", $message);
182 * 取得したコンテンツ項目をテンプレートに設定する
184 * @param int $index 行番号
185 * @param array $fetchedRow 取得行
186 * @param object $param 任意使用パラメータ
187 * @return bool trueを返すとループ続行。falseを返すとその時点で終了。
189 function itemsLoop($index, $fetchedRow)
192 if ($index >= $this->messageCount){
193 $this->isExistsNextPage = true; // 次のページあり
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);
204 $message = $this->convertToDispString($fetchedRow['mm_message']);// 文字エスケープ処理
205 $message = $this->convertToPreviewText($message); // 改行をBRタグに変換
206 if ($fetchedRow['mm_index'] == 1) $message .= '<br />'; // トップのメッセージは改行を追加
209 $message = $this->convDispMessage($message, $fetchedRow['mm_thread_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>';
218 /*if ($fetchedRow['mm_deleted']){
219 $message = '参照できません。';
223 'id' => $messageIdTag, // メッセージID
224 'message_count' => $messageCount, // メッセージ数
225 'date' => $date, // 投稿日付
226 'message' => $message // 投稿文
228 $this->tmpl->addVars('message_list', $row);
229 $this->tmpl->parseTemplate('message_list', 'a');
232 $this->isExistsMessage = true;
238 * @return string スレッドID
240 function createThreadId()
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);
249 $ret = $this->_db->isExistsThreadId($threadId);