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: m_chachaMypageWidgetContainer.php 3363 2010-07-10 05:12:31Z fishbone $
14 * @link http://www.m-media.co.jp
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/m_chachaBaseWidgetContainer.php');
18 class m_chachaMypageWidgetContainer extends m_chachaBaseWidgetContainer
20 private $messageCount; // 表示メッセージ数
21 private $isExistsMessage; // メッセージが存在するかどうか
22 private $isExistsNextPage; // 次のページがあるかどうか
23 const THREAD_ID_LENGTH = 5; // スレッドIDの長さ
28 function __construct()
31 parent::__construct();
36 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
37 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
39 * @param RequestManager $request HTTPリクエスト処理クラス
40 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
41 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
43 function _setTemplate($request, &$param)
45 return 'mypage.tmpl.html';
50 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
52 * @param RequestManager $request HTTPリクエスト処理クラス
53 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
56 function _assign($request, &$param)
58 $act = $request->trimValueOf('act');
59 $pageNo = $request->trimIntValueOf(M3_REQUEST_PARAM_PAGE_NO, '1'); // ページ番号
60 $postTicket = $request->trimValueOf('ticket'); // POST確認用
61 $memberId = $request->trimValueOf(self::URL_PARAM_MEMBER_ID); // 会員ID
62 $message = $request->mobileTrimValueOf('message'); // 投稿メッセージ
65 $canPost = false; // ブログ投稿可能かどうか
66 $clientId = $this->_mobileId;
69 $clientMemberId = ''; // 現在の端末の会員ID
70 $ret = $this->_db->getMemberInfoByDeviceId($clientId, $row);
71 if ($ret) $clientMemberId = $row['mb_id'];
72 if (empty($memberId)){
73 if (!empty($clientMemberId)){ // 登録メンバーのとき
74 $memberId = $clientMemberId;
75 $canPost = true; // ブログ投稿可能かどうか
77 } else if ($memberId == $clientMemberId){
78 $canPost = true; // ブログ投稿可能かどうか
81 if ($act == 'add'){ // 投稿追加のとき
82 if (!empty($postTicket) && $postTicket == $request->getSessionValue(M3_SESSION_POST_TICKET)){ // 正常なPOST値のとき
84 if (!$canPost) $this->setUserErrorMsg('投稿権限がありません');
87 //$this->checkMessageInput($this->_boardId, $threadId, $name, $email, $message);
88 if ($this->checkInput($message, 'メッセージ')){
90 $messageLength = $this->_configArray[self::CF_MESSAGE_LENGTH]; // 最大メッセージ長
91 if (getLetterCount($message) > $messageLength) $this->setUserErrorMsg('メッセージは' . $messageLength . '文字まで入力可能です');
93 if (empty($memberId)) $this->setUserErrorMsg('会員IDが不正です');
96 if ($this->getMsgCount() == 0){
98 $threadId = $this->createThreadId();
99 if (empty($threadId)){
100 $this->setAppErrorMsg('スレッドIDが作成できません');
103 $ret = $this->_db->addNewThread($this->_boardId, $threadId, $memberId, ''/*件名*/, $message);
105 if ($ret){ // データ追加成功のとき
106 $this->setGuidanceMsg('投稿完了しました');
108 $message = ''; // メッセージクリア
110 $this->setAppErrorMsg('投稿に失敗しました');
115 $request->unsetSessionValue(M3_SESSION_POST_TICKET); // セッション値をクリア
119 $ret = $this->_db->getMemberInfoById($memberId, $row);
122 $avatarImageUrl = $this->getAvatarUrl($memberId);// アバター画像URL
123 $imageTag = '<img src="' . $this->getUrl($avatarImageUrl) . '" width="' . self::AVATAR_SIZE . '" height="' . self::AVATAR_SIZE .'" />';
124 $this->tmpl->addVar("thread_area", "avatar_image", $imageTag); // 画像
127 $this->messageCount = $this->_configArray[self::CF_MESSAGE_COUNT_MYPAGE]; // 最大項目数
128 $this->_db->getThreadByMemberId($this->_boardId, $memberId, $this->messageCount, $pageNo, array($this, 'itemsLoop'), true);
131 $this->tmpl->addVar("thread_area", "name", $this->convertToDispString($row['mb_name'])); // ユーザ名
133 if ($canPost){ // ブログ投稿可能なとき
134 $this->tmpl->setAttribute('add_area', 'visibility', 'visible');// 投稿エリアを表示
135 $this->tmpl->addVar("add_area", "member_id", $memberId); // 会員ID
136 $this->tmpl->addVar('add_area', 'act', 'add'); // 新規登録
137 $this->tmpl->addVar("add_area", "current_url", $this->gEnv->getCurrentRequestUri());
140 $postTicket = md5(time() . $this->gAccess->getAccessLogSerialNo());
141 $request->setSessionValue(M3_SESSION_POST_TICKET, $postTicket); // セッションに保存
142 $this->tmpl->addVar("add_area", "ticket", $postTicket); // 画面に書き出し
145 // スレッドが存在しないときはタグを非表示にする
146 if (!$this->isExistsMessage){
147 // 投稿なしのメッセージを表示。自分自身のマイページのときは表示しない。
148 if (!$canPost) $this->tmpl->setAttribute('no_message_area', 'visibility', 'visible');
150 $this->tmpl->setAttribute('message_list', 'visibility', 'hidden');
153 //$registLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&task=' . self::TASK_PROFILE . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId, true));
154 $registLink = $this->convertUrlToHtmlEntity($this->getUrl($this->gEnv->createCurrentPageUrlForMobile('task=' . self::TASK_PROFILE . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId)));
155 $registName = 'プロフィール';
156 $this->tmpl->addVar("_widget", "regist_url", $registLink);
157 $this->tmpl->addVar("_widget", "regist_name", $registName);
161 if ($pageNo > 1){ // 前のページがあるとき
162 $foreLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId . '&page=' . ($pageNo -1), true));
163 $pageLink .= '<a href="' . $foreLink . '" accesskey="1">前へ[1]</a>';
165 if ($this->isExistsNextPage){ // 次のページがあるとき
166 if (!empty($pageLink)) $pageLink .= ' ';
167 $nextLink = $this->convertUrlToHtmlEntity($this->getUrl($this->_currentPageUrl . '&' . self::URL_PARAM_MEMBER_ID . '=' . $memberId . '&page=' . ($pageNo +1), true));
168 $pageLink .= '<a href="' . $nextLink . '" accesskey="2">次へ[2]</a>';
170 $this->tmpl->addVar("_widget", "page_link", $pageLink);
172 $this->setUserErrorMsg('会員IDが不正です');
175 $this->tmpl->setAttribute('thread_area', 'visibility', 'hidden');
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('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));
216 $messageIdTag = '<a href="' . $messageLink . '">#' . $messageId . '</a>';
219 /*if ($fetchedRow['mm_deleted']){
220 $message = '参照できません。';
224 'id' => $messageIdTag, // メッセージID
225 'message_count' => $messageCount, // メッセージ数
226 'date' => $date, // 投稿日付
227 'message' => $message, // 投稿文
228 'spacer' => $this->_spacer // スペーサ
230 $this->tmpl->addVars('message_list', $row);
231 $this->tmpl->parseTemplate('message_list', 'a');
234 $this->isExistsMessage = true;
240 * @return string スレッドID
242 function createThreadId()
246 for ($i = 0; $i < self::CREATE_CODE_RETRY_COUNT; $i++){
247 // 「0,I,L,O,i,l,o」除くランダム文字列を作成
248 $threadId = $this->_createRandString('123456789ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz', self::THREAD_ID_LENGTH);
251 $ret = $this->_db->isExistsThreadId($threadId);