7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
9 * @package Magic3 Framework
10 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11 * @copyright Copyright 2006-2013 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: admin_mainOpelogWidgetContainer.php 5801 2013-03-06 13:08:29Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/admin_mainConditionBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/admin_mainDb.php');
18 require_once($gEnvManager->getCurrentWidgetDbPath() . '/admin_serverDb.php');
20 class admin_mainOpelogWidgetContainer extends admin_mainConditionBaseWidgetContainer
22 private $db; // DB接続オブジェクト
23 private $serverDb; // DB接続オブジェクト
24 private $serialNo; // シリアルNo
25 private $serialArray = array(); // 表示されているコンテンツシリアル番号
26 private $logLevelArray; // 表示するログレベル
27 private $logStatusArray; // 表示するログステータス
28 private $logLevel; // 現在のログ表示レベル
29 private $logStatus; // 現在のログ表示ステータス
30 private $clientIp; // クライアントのIPアドレス
31 private $browserIconFile; // ブラウザアイコンファイル名
32 private $showMessage; // メッセージ画面かどうか
33 private $message; // 表示メッセージ
34 private $server; // 指定サーバ
35 const DEFAULT_LIST_COUNT = 30; // 最大リスト表示数
36 const MAX_PAGE_COUNT = 20; // 最大ページ数
37 const INFO_ICON_FILE = '/images/system/info16.png'; // 情報アイコン
38 const NOTICE_ICON_FILE = '/images/system/notice16.png'; // 注意アイコン
39 const ERROR_ICON_FILE = '/images/system/error16.png'; // エラーアイコン
40 const ACTION_ICON_FILE = '/images/system/action16.png'; // 操作要求アイコン
41 const BROWSER_ICON_DIR = '/images/system/browser/'; // ブラウザアイコンディレクトリ
42 const ICON_SIZE = 16; // アイコンのサイズ
43 const DEFAULT_LOG_LEVEL = '0'; // デフォルトのログレベル
44 const DEFAULT_LOG_STATUS = '1'; // デフォルトのログステータス
49 function __construct()
52 parent::__construct();
55 $this->db = new admin_mainDb();
56 $this->serverDb = new admin_serverDb();
59 $this->logLevelArray = array( array( 'name' => $this->_('All'), 'value' => '0'), // すべて
60 array( 'name' => $this->_('Check Required'), 'value' => '1')); // 要確認項目のみ
62 $this->logStatusArray = array( array( 'name' => $this->_('All'), 'value' => '0'), // すべて
63 array( 'name' => $this->_('Unchecked'), 'value' => '1'), // 未確認項目
64 array( 'name' => $this->_('Checked'), 'value' => '2')); // 確認済項目
67 $this->browserIconFile = array(
68 'OP' => 'opera.png', // opera
69 'IE' => 'ie.png', // microsoft internet explorer
70 'NS' => 'netscape.png', // netscape
71 'GA' => 'galeon.png', // galeon
72 'PX' => 'phoenix.png', // phoenix
73 'FF' => 'firefox.png', // firefox
74 'FB' => 'firebird.png', // mozilla firebird
75 'SM' => 'seamonkey.png', // seamonkey
76 'CA' => 'camino.png', // camino
77 'SF' => 'safari.png', // safari
78 'CH' => 'chrome.gif', // chrome
79 'KM' => 'k-meleon.png', // k-meleon
80 'MO' => 'mozilla.gif', // mozilla
81 'KO' => 'konqueror.png', // konqueror
82 'BB' => '', // blackberry
83 'IC' => 'icab.png', // icab
86 'MC' => '', // ncsa mosaic
88 'OW' => 'omniweb.png', // omniweb
89 'HJ' => '', // hotjava
90 'BX' => '', // browsex
91 'AV' => '', // amigavoyager
92 'AW' => '', // amiga-aweb
93 'IB' => '', // ibrowse
95 'EP' => 'epiphany.png', // epiphany
96 'FL' => 'flock.png', // flock
97 'SL' => 'sleipnir.gif' ,// sleipnir
98 'LU' => 'lunascape.gif', // lunascape
99 'SH' => 'shiira.gif', // shiira
100 'SW' => 'swift.png', // swift
101 'PS' => 'playstation.gif', // playstation portable
102 'PP' => 'playstation.gif', // ワイプアウトピュア
103 'NC' => 'netcaptor.gif', // netcaptor
104 'WT' => 'webtv.gif', // webtv
107 'GB' => 'google.gif', // Google
108 'MS' => 'msn.gif', // MSN
109 'YA' => 'yahoo.gif', // YahooSeeker
110 'GO' => 'goo.gif', // goo
111 'HT' => 'hatena.gif', // はてなアンテナ
112 'NV' => 'naver.gif', // Naver(韓国)
115 'DC' => 'docomo.gif', // ドコモ
116 'AU' => 'au.gif', // au
117 'SB' => 'softbank.gif', // ソフトバンク
123 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
124 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
126 * @param RequestManager $request HTTPリクエスト処理クラス
127 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
128 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
130 function _setTemplate($request, &$param)
132 // サーバ指定されている場合は接続先DBを変更
133 $this->server = $request->trimValueOf(M3_REQUEST_PARAM_SERVER);
134 if (!empty($this->server)){
136 $ret = $this->serverDb->getServerById($this->server, $row);
138 $dbDsn = $row['ts_db_connect_dsn']; // DB接続情報
139 $dbAccount = $row['ts_db_account']; // DB接続アカウント
140 $dbPassword = $row['ts_db_password'];// DB接続パスワード
143 $ret = $this->db->openLocalDb($dbDsn, $dbAccount, $dbPassword);// 接続先を変更
145 if (!$ret){ // サーバに接続できない場合
146 $this->showMessage = true; // メッセージ画面かどうか
147 $this->message = $this->_('Could not connect to server.'); // サーバに接続できません
148 return 'message.tmpl.html';
152 $task = $request->trimValueOf('task');
153 if ($task == 'opelog_detail'){ // 詳細画面
154 return 'opelog_detail.tmpl.html';
156 return 'opelog.tmpl.html';
162 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
164 * @param RequestManager $request HTTPリクエスト処理クラス
165 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
168 function _assign($request, &$param)
170 if ($this->showMessage){ // メッセージ画面かどうか
171 $this->setMsg(self::MSG_APP_ERR, $this->message);
175 $localeText = array();
176 $task = $request->trimValueOf('task');
177 if ($task == 'opelog_detail'){ // 詳細画面
178 $this->createDetail($request);
181 $localeText['msg_update'] = $this->_('Update item?'); // 項目を更新しますか?
182 $localeText['msg_delete'] = $this->_('Delete item?'); // 項目を削除しますか?
183 $localeText['label_log_detail'] = $this->_('Operation Log Detail'); // 運用ログ詳細
184 $localeText['label_go_back'] = $this->_('Go back'); // 戻る
185 $localeText['label_type'] = $this->_('Type'); // 種別
186 $localeText['label_check'] = $this->_('Checked'); // 確認
187 $localeText['label_message'] = $this->_('Message'); // メッセージ
188 $localeText['label_message_detail'] = $this->_('Message Detail');// メッセージ詳細
189 $localeText['label_message_code'] = $this->_('Message Code');// メッセージコード
190 $localeText['label_access_log_no'] = $this->_('Access Log No'); // アクセスログ番号
191 $localeText['label_date'] = $this->_('Date'); // 日時
192 $localeText['label_update'] = $this->_('Update'); // 更新
194 $this->createList($request);
197 $localeText['msg_select_item'] = $this->_('Select item to edit.'); // 編集する項目を選択してください
198 $localeText['msg_select_del_item'] = $this->_('Select item to delete.'); // 削除する項目を選択してください
199 $localeText['msg_delete_item'] = $this->_('Delete selected item?');// 選択項目を削除しますか?
200 $localeText['label_log_list'] = $this->_('Operation Log List'); // 運用ログ一覧
201 $localeText['label_log_level'] = $this->_('Level:');// 種別:
202 $localeText['label_log_status'] = $this->_('Status:');// ステータス:
203 $localeText['label_edit'] = $this->_('Edit'); // 編集
204 $localeText['label_check'] = $this->_('Select'); // 選択
205 $localeText['label_type'] = $this->_('Type'); // 種別
206 $localeText['label_message'] = $this->_('Message'); // メッセージ
207 $localeText['label_access_log'] = $this->_('Access Log'); // アクセスログ
208 $localeText['label_check'] = $this->_('Checked'); // 確認
209 $localeText['label_date'] = $this->_('Date'); // 日時
210 $localeText['label_range'] = $this->_('Range:'); // 範囲:
212 $this->setLocaleText($localeText);
217 * @param RequestManager $request HTTPリクエスト処理クラス
220 function createList($request)
222 $act = $request->trimValueOf('act');
223 $this->clientIp = $this->gRequest->trimServerValueOf('REMOTE_ADDR'); // クライアントのIPアドレス
224 $this->logLevel = $request->trimValueOf('loglevel');// 現在のログ表示レベル
225 if ($this->logLevel == '') $this->logLevel = self::DEFAULT_LOG_LEVEL; // 現在のログ表示レベル
226 $this->logStatus = $request->trimValueOf('logstatus');// 現在のログ表示ステータス
227 if ($this->logStatus == '') $this->logStatus = self::DEFAULT_LOG_STATUS; // 現在のログ表示ステータス(0=すべて、1=未確認のみ、2=確認済みのみ)
230 $viewLevel = 0; // 表示メッセージレベル(0すべて、1=注意以上、10=要確認)
231 if ($this->logLevel == '1') $viewLevel = 10;
234 $viewCount = $request->trimValueOf('viewcount');// 表示項目数
235 if ($viewCount == '') $viewCount = self::DEFAULT_LIST_COUNT; // 表示項目数
236 $pageNo = $request->trimValueOf('page'); // ページ番号
237 if (empty($pageNo)) $pageNo = 1;
239 if ($act == 'delete'){ // 項目を参照済みに設定
240 $listedItem = explode(',', $request->trimValueOf('seriallist'));
242 for ($i = 0; $i < count($listedItem); $i++){
244 $itemName = 'item' . $i . '_selected';
245 $itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
247 if ($itemValue){ // チェック項目
248 $delItems[] = $listedItem[$i];
251 if (count($delItems) > 0){
253 $ret = $this->db->delUserBySerial($delItems);
254 if ($ret){ // データ削除成功のとき
255 $this->setGuidanceMsg('データを削除しました');
257 $this->setAppErrorMsg('データ削除に失敗しました');
261 // 表示するログレベル、ログステータス選択メニュー作成
262 $this->createLogLevelMenu();
263 $this->createLogStatusMenu();
266 $totalCount = $this->db->getOpeLogCount($viewLevel, $this->logStatus);
269 $pageCount = (int)(($totalCount -1) / $viewCount) + 1; // 総ページ数
270 if ($pageNo < 1) $pageNo = 1;
271 if ($pageNo > $pageCount) $pageNo = $pageCount;
272 $startNo = ($pageNo -1) * $viewCount +1; // 先頭の行番号
273 $endNo = $pageNo * $viewCount > $totalCount ? $totalCount : $pageNo * $viewCount;// 最後の行番号
277 if ($pageCount > 1){ // ページが2ページ以上のときリンクを作成
278 for ($i = 1; $i <= $pageCount; $i++){
279 if ($i > self::MAX_PAGE_COUNT) break; // 最大ページ数以上のときは終了
283 //$link = ' <a href="#" onclick="selpage(\'' . $i . '\');return false;">' . $i . '</a>';
284 $link = ' <a href="?task=opelog&act=selpage&page=' . $i . '">' . $i . '</a>';
289 $this->tmpl->addVar("_widget", "page_link", $pageLink);
290 $this->tmpl->addVar("_widget", "total_count", sprintf($this->_('%d Total'), $totalCount));
291 $this->tmpl->addVar("_widget", "page", $pageNo); // ページ番号
292 $this->tmpl->addVar("_widget", "view_count", $viewCount); // 最大表示項目数
293 $this->tmpl->addVar("search_range", "start_no", $startNo);
294 $this->tmpl->addVar("search_range", "end_no", $endNo);
295 if ($totalCount > 0) $this->tmpl->setAttribute('search_range', 'visibility', 'visible');// 検出範囲を表示
298 $accessLogUrl = '?task=accesslog_detail&openby=simple';
299 if (!empty($this->server)) $accessLogUrl .= '&_server=' . $this->server;
300 $this->tmpl->addVar("_widget", "access_log_url", $accessLogUrl);
303 $this->tmpl->addVar("_widget", "edit_url", '?task=opelog_detail');
306 $this->db->getOpeLogList($viewLevel, $this->logStatus, $viewCount, $pageNo, array($this, 'logListLoop'));
307 $this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示項目のシリアル番号を設定
308 if (count($this->serialArray) == 0) $this->tmpl->setAttribute('loglist', 'visibility', 'hidden'); // ログがないときは非表示
313 * @param RequestManager $request HTTPリクエスト処理クラス
316 function createDetail($request)
319 $viewCount = $request->trimValueOf('viewcount');// 表示項目数
320 $page = $request->trimValueOf('page'); // ページ番号
321 $logLevel = $request->trimValueOf('loglevel');// 現在のログ表示レベル
322 $logStatus = $request->trimValueOf('logstatus');// 現在のログ表示ステータス
324 $act = $request->trimValueOf('act');
325 $this->serialNo = $request->trimValueOf('serial'); // 選択項目のシリアル番号
326 $isMsgChecked = ($request->trimValueOf('item_msgchecked') == 'on') ? 1 : 0; // 確認済みかどうか
328 $reloadData = false; // データの再読み込み
329 if ($act == 'update'){ // 行更新のとき
333 if ($this->getMsgCount() == 0){
334 $ret = $this->db->updateOpeLogChecked($this->serialNo, $isMsgChecked);
335 if ($ret){ // データ追加成功のとき
336 //$this->setMsg(self::MSG_GUIDANCE, 'データを更新しました');
337 $this->setMsg(self::MSG_GUIDANCE, $this->_('Data updated.')); // データを更新しました
338 $reloadData = true; // データの再読み込み
340 //$this->setMsg(self::MSG_APP_ERR, 'データ更新に失敗しました');
341 $this->setMsg(self::MSG_APP_ERR, $this->_('Failed in updating data.')); // データ更新に失敗しました
345 if (!empty($this->serialNo)) $reloadData = true; // データの再読み込み
347 if ($reloadData){ // データの再読み込み
349 $ret = $this->db->getOpeLog($this->serialNo, $row);
352 switch ($row['ot_level']){
354 $iconUrl = $this->gEnv->getRootUrl() . self::INFO_ICON_FILE;
357 $iconUrl = $this->gEnv->getRootUrl() . self::ACTION_ICON_FILE;
360 $iconUrl = $this->gEnv->getRootUrl() . self::NOTICE_ICON_FILE;
363 $iconUrl = $this->gEnv->getRootUrl() . self::ERROR_ICON_FILE;
368 $iconTitle = $row['ot_name'];
369 $iconTag = '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
370 $msgTypeTag = $row['ot_name'];
372 if (!empty($row['ol_link'])){
373 $link = $this->gEnv->getDefaultAdminUrl() . '?' . $row['ol_link'];
374 $iconTag = '<a href="'. $this->getUrl($link) .'">' . $iconTag . '</a>';
375 $msgTypeTag = '<a href="'. $this->getUrl($link) .'">' . $msgTypeTag . '</a>';
378 $isMsgChecked = $row['ol_checked']; // 確認済みかどうか
379 $logMsg = $row['ol_message']; // メッセージ
380 $logMsgDetail = $row['ol_message_ext'];// メッセージ詳細
381 $logMsgCode = $row['ol_message_code'];// メッセージコード
382 $accessLog = '';// アクセスログシリアル番号
383 if (!empty($row['ol_access_log_serial'])) $accessLog = $this->convertToDispString($row['ol_access_log_serial']);
384 $time = $this->convertToDispDateTime($row['ol_dt']); // 出力日時
388 $this->tmpl->addVar("_widget", "serial", $this->serialNo);
389 $this->tmpl->addVar("_widget", "type_image", $iconTag);
390 $this->tmpl->addVar("_widget", "type", $msgTypeTag);
392 if ($isMsgChecked) $isChecked = 'checked';
393 $this->tmpl->addVar("_widget", "msg_checked", $isChecked);
394 $this->tmpl->addVar("_widget", "message", $this->convertToDispString($logMsg));
395 $this->tmpl->addVar("_widget", "detail", $this->convertToDispString($logMsgDetail));
396 $this->tmpl->addVar("_widget", "code", $this->convertToDispString($logMsgCode));
397 $this->tmpl->addVar("_widget", "access_log_serial", $accessLog);
398 $this->tmpl->addVar("_widget", "time", $time);
401 $accessLogUrl = '?task=accesslog_detail&openby=simple';
402 if (!empty($this->server)) $accessLogUrl .= '&_server=' . $this->server;
403 $this->tmpl->addVar("_widget", "access_log_url", $accessLogUrl);
406 $this->tmpl->addVar("_widget", "page", $page); // ページ番号
407 $this->tmpl->addVar("_widget", "view_count", $viewCount); // 最大表示項目数
408 $this->tmpl->addVar("_widget", "log_level", $logLevel); // ログ表示レベル
409 $this->tmpl->addVar("_widget", "log_status", $logStatus); // ログ表示ステータス
411 $this->tmpl->setAttribute('update_button', 'visibility', 'visible');// 更新ボタン表示
413 // サーバ指定の場合は更新ボタンを使用不可に設定
414 if (!empty($this->server)){
415 $this->tmpl->addVar("_widget", "msg_disabled", 'disabled');
416 $this->tmpl->addVar("update_button", "update_disabled", 'disabled');
420 * 運用ログ一覧取得したデータをテンプレートに設定する
422 * @param int $index 行番号(0~)
423 * @param array $fetchedRow フェッチ取得した行
424 * @param object $param 未使用
425 * @return bool true=処理続行の場合、false=処理終了の場合
427 function logListLoop($index, $fetchedRow, $param)
429 $serial = $fetchedRow['ol_serial'];
432 if ($fetchedRow['ol_checked']){
433 $msgChecked = 'checked';
437 switch ($fetchedRow['ot_level']){
439 $iconUrl = $this->gEnv->getRootUrl() . self::INFO_ICON_FILE;
442 $iconUrl = $this->gEnv->getRootUrl() . self::ACTION_ICON_FILE;
445 $iconUrl = $this->gEnv->getRootUrl() . self::NOTICE_ICON_FILE;
448 $iconUrl = $this->gEnv->getRootUrl() . self::ERROR_ICON_FILE;
453 $iconTitle = $fetchedRow['ot_name'];
454 $iconTag = '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
456 if (!empty($fetchedRow['ol_access_log_serial'])) $accessLog = $this->convertToDispString($fetchedRow['ol_access_log_serial']);
459 $ip = $fetchedRow['al_ip'];
460 $ipStr = $this->convertToDispString($ip);
461 if ($ip == $this->clientIp){ // クライアントのIPアドレスと同じときはグリーンで表示
462 $ipStr = '<font color="green">' . $ipStr . '</font>';
465 // ブラウザ、プラットフォームの情報を取得
466 $browserCode = $this->gInstance->getAnalyzeManager()->getBrowserType($fetchedRow['al_user_agent'], $version);
468 if (!empty($browserCode)){
469 $iconFile = $this->browserIconFile[$browserCode];
470 if (!empty($iconFile)){
471 $iconTitle = $browserCode;
472 $iconUrl = $this->gEnv->getRootUrl() . self::BROWSER_ICON_DIR . $iconFile;
473 $browserImg = '<img src="' . $this->getUrl($iconUrl) . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
478 $messageUrl = '?task=opelog_detail&serial=' . $serial;
481 if (!empty($fetchedRow['ol_link'])){
482 $link = $this->gEnv->getDefaultAdminUrl() . '?' . $fetchedRow['ol_link'];
483 $iconTag = '<a href="'. $this->getUrl($link) .'">' . $iconTag . '</a>';
487 'index' => $index, // 行番号
488 'serial' => $this->convertToDispString($serial), // シリアル番号
489 'type' => $iconTag, // メッセージタイプを示すアイコン
490 'message' => $this->convertToDispString($fetchedRow['ol_message']), // メッセージ
491 'url' => $this->convertUrlToHtmlEntity($messageUrl), // メッセージのリンク先
492 'ip' => $ipStr, // クライアントIP
493 'access_log' => $accessLog, // アクセスログ番号
494 'browser' => $browserImg, // ブラウザ
495 'output_dt' => $this->convertToDispDateTime($fetchedRow['ol_dt']), // 出力日時
496 'msg_checked' => $msgChecked, // メッセージを確認したかどうか
497 'selected' => $selected // 項目選択用ラジオボタン
499 $this->tmpl->addVars('loglist', $row);
500 $this->tmpl->parseTemplate('loglist', 'a');
503 $this->serialArray[] = $serial;
511 function createLogLevelMenu()
513 for ($i = 0; $i < count($this->logLevelArray); $i++){
514 $value = $this->logLevelArray[$i]['value'];
515 $name = $this->logLevelArray[$i]['name'];
518 if ($value == $this->logLevel) $selected = 'selected';
521 'value' => $value, // ログレベル
522 'name' => $name, // ログレベル名
523 'selected' => $selected // 選択中かどうか
525 $this->tmpl->addVars('loglevel_list', $row);
526 $this->tmpl->parseTemplate('loglevel_list', 'a');
534 function createLogStatusMenu()
536 for ($i = 0; $i < count($this->logStatusArray); $i++){
537 $value = $this->logStatusArray[$i]['value'];
538 $name = $this->logStatusArray[$i]['name'];
541 if ($value == $this->logStatus) $selected = 'selected';
544 'value' => $value, // ログレベル
545 'name' => $name, // ログレベル名
546 'selected' => $selected // 選択中かどうか
548 $this->tmpl->addVars('logstatus_list', $row);
549 $this->tmpl->parseTemplate('logstatus_list', 'a');