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-2015 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
14 * @link http://www.magic3.org
16 require_once(M3_SYSTEM_INCLUDE_PATH . '/db/systemDb.php'); // システムDBアクセスクラス
17 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
19 class BaseFrameContainer extends Core
21 protected $_db; // DB接続オブジェクト
22 const SYSTEM_TEMPLATE = '_system'; // システム画面用テンプレート
23 const M_ADMIN_TEMPLATE = 'm/_admin'; // 携帯用管理画面テンプレート
24 const ERR_MESSAGE_ACCESS_DENY = 'Access denied.'; // ウィジェットアクセスエラーのメッセージ
25 const SITE_ACCESS_EXCEPTION_IP = 'site_access_exception_ip'; // アクセス制御、例外とするIP
26 const CONFIG_KEY_MSG_TEMPLATE = 'msg_template'; // メッセージ用テンプレート取得キー
27 // const CF_MOBILE_AUTO_REDIRECT = 'mobile_auto_redirect'; // 携帯の自動遷移
32 function __construct()
35 parent::__construct();
38 $this->_db = $this->gInstance->getSytemDbObject();
41 * 起動マネージャから呼ばれる唯一のメソッド
43 * @param RequestManager $request HTTPリクエスト処理クラス
45 function process($request)
48 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND); // 実行コマンドを取得
50 // インストール画面への制御は、install.phpファイルの作成、削除で制御する
51 // 最小限の設定が行われていない場合,DBに接続できない場合は、インストール画面へ
52 if (!defined('M3_STATE_IN_INSTALL')){
53 if (($this->gEnv->canUseDb() && $this->gSystem->canInitSystem()) || // システム初期化モードのとき
54 !$this->gConfig->isConfigured()){ // 設定ファイルに設定がないとき(初回インストール)
57 $this->gInstance->getFileManager()->recoverInstaller();
59 $this->gPage->redirectToInstall();
61 } else if ($this->gConfig->isConfigured() && !$this->gEnv->canUseDb()){ // DB接続失敗のとき
62 if ($this->gEnv->isAdminDirAccess()){ // 管理画面の場合のみインストーラ起動
64 $this->gInstance->getFileManager()->recoverInstaller();
66 $this->gPage->redirectToInstall();
69 $this->gPage->showError(500);
76 //$this->gLog->info(__METHOD__, 'フレーム作成開始');
79 // セッション変数読み込み。サブページIDの設定。
80 $this->gPage->startPage($request);
83 $isSystemAdmin = $this->gEnv->isSystemAdmin(); // 管理者権限があるかどうか
84 $isSystemManageUser = $this->gEnv->isSystemManageUser(); // システム運用可能かどうか
86 if (!defined('M3_STATE_IN_INSTALL')){ // インストールモード以外のとき
87 // ############## ユーザごとの設定の読み込み ###################
88 // 引数での言語設定取得、言語変更可能な場合は変更
89 // 言語の優先順は、URLの言語設定、クッキーの言語設定の順
90 if (!$this->gEnv->isAdminDirAccess()){ // 管理画面以外の場合
91 if ($this->gEnv->getCanChangeLang() && $this->gEnv->isMultiLanguageSite()){ // 言語変更可能で多言語対応サイトのとき
92 $lang = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_LANG);
95 $lang = $request->getCookieValue(M3_COOKIE_LANG);
99 if (in_array($lang, $this->gSystem->getAcceptLanguage())){
100 $this->gEnv->setCurrentLanguage($lang);
103 $request->setCookieValue(M3_COOKIE_LANG, $lang);
104 } else { // アクセス不可の場合はクッキーを削除
106 $request->setCookieValue(M3_COOKIE_LANG, '', -1);
110 $request->setCookieValue(M3_COOKIE_LANG, '', -1);
113 $this->gPage->loadLang();
115 // ################### URLアクセス制御 ######################
116 // 非公開URLへは管理権限がないとアクセスできない
117 $canAccess = true; // アクセス可能かどうか
118 $isErrorAccess = false; // 不正アクセスかどうか
119 $toAdminType = 0; // 管理画面の遷移タイプ(0=アクセス不可、1=ログイン画面、2=サイト非公開画面, 3=存在しないページ)
120 $errMessage = ''; // エラーメッセージ
121 $messageDetail = ''; // 詳細メッセージ
123 // ページID,ページサブIDからアクセス権をチェック
124 $isPublicUrl = $this->gPage->canAccessUrl($isActivePage);
125 if (!$isPublicUrl && !$isSystemManageUser){// システム運用可能ユーザかどうか
127 $isErrorAccess = true; // 不正アクセスかどうか
128 $errMessage = 'ユーザに公開されていないページへのアクセス。';
130 if (!$isActivePage) $toAdminType = 3; // 有効なアクセスポイントでない場合は存在しないページとする
133 // ################### ユーザアクセス制御 ######################
134 // クッキーがないため権限を識別できない場合でも、管理者として処理する場合があるので、サブクラスの_checkAccess()メソッドは必ず通るようにする
135 if ($canAccess){ // アクセス可能な場合はユーザをチェック
136 if (method_exists($this, '_checkAccess')){
138 $canAccess = $this->_checkAccess($request); // サブクラスメソッドの呼び出し
140 // 一般画面から直接管理画面が呼ばれた場合は一旦ログインへ遷移
142 ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || // ウィジェットの設定
143 $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET)){ // 表示位置を表示するとき(ウィジェット付き)
145 $toAdminType = 1; // ログイン画面へ
147 } else { // _checkAccess()がないときは、標準のアクセス制御
149 $canAccess = $this->_accessSite($request); // サイト公開制御
151 if ($cmd == M3_REQUEST_CMD_LOGIN || // ログイン画面を表示のとき
152 $cmd == M3_REQUEST_CMD_LOGOUT){ // ログアウトのとき
156 $toAdminType = 1; // ログイン画面へ
157 } else if ($cmd != '' && // コマンドなし
158 $cmd != M3_REQUEST_CMD_CHANGE_TEMPLATE && // テンプレート変更
159 $cmd != M3_REQUEST_CMD_SHOW_POSITION && // 表示位置を表示するとき
160 $cmd != M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET && // 表示位置を表示するとき(ウィジェット付き)
161 $cmd != M3_REQUEST_CMD_FIND_WIDGET && // ウィジェットを検索
162 $cmd != M3_REQUEST_CMD_DO_WIDGET && // ウィジェット単体実行
163 $cmd != M3_REQUEST_CMD_PREVIEW && // サイトのプレビューを表示
164 $cmd != M3_REQUEST_CMD_RSS && // RSS配信
165 $cmd != M3_REQUEST_CMD_CSS){ // CSS生成
167 // 標準のアクセスでは、上記コマンド以外は受け付けない
169 $isErrorAccess = true; // 不正アクセス
170 $errMessage = '不正なコマンドの実行。';
171 $messageDetail = 'アクセスポイント状態=公開';
173 } else { // サイトアクセスできない場合は、管理画面でメッセージを表示
174 if ($cmd == M3_REQUEST_CMD_LOGIN || // ログイン画面を表示のとき
175 $cmd == M3_REQUEST_CMD_LOGOUT || // ログアウトのとき
176 $cmd == M3_REQUEST_CMD_PREVIEW){ // サイトのプレビューを表示
177 $toAdminType = 1; // ログイン画面へ
179 $toAdminType = 2; // サイト非公開画面へ
183 if ($cmd != '' && // コマンドなし
184 $cmd != M3_REQUEST_CMD_LOGIN && // ログイン画面を表示のとき
185 $cmd != M3_REQUEST_CMD_LOGOUT && // ログアウトのとき
186 $cmd != M3_REQUEST_CMD_CHANGE_TEMPLATE && // テンプレート変更
187 $cmd != M3_REQUEST_CMD_SHOW_POSITION && // 表示位置を表示するとき
188 $cmd != M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET && // 表示位置を表示するとき(ウィジェット付き)
189 $cmd != M3_REQUEST_CMD_FIND_WIDGET && // ウィジェットを検索
190 $cmd != M3_REQUEST_CMD_DO_WIDGET && // ウィジェット単体実行
191 $cmd != M3_REQUEST_CMD_PREVIEW && // サイトのプレビューを表示
192 $cmd != M3_REQUEST_CMD_RSS && // RSS配信
193 $cmd != M3_REQUEST_CMD_CSS){ // CSS生成
195 $isErrorAccess = true; // 不正アクセス
196 $errMessage = '不正なコマンドの実行。';
197 $messageDetail = 'アクセスポイント状態=非公開';
201 // システム運用可能ユーザはアクセス可。
202 // ログアウトのときはすでに管理ユーザの可能性があるので、ログアウト時は変更しない
203 //if ($isSystemManageUser && $cmd != M3_REQUEST_CMD_LOGOUT) $canAccess = true;
204 if ($isSystemAdmin && $cmd != M3_REQUEST_CMD_LOGOUT) $canAccess = true; // 2011/8/31 システム管理者のみに変更
206 // #################### アクセスログ記録 #######################
207 // DBが使用可能であれば、ログイン処理終了後、アクセスログを残す
208 if ($this->gEnv->canUseDb()) $this->gAccess->accessLog();
212 switch ($toAdminType){
215 $this->gPage->setSystemHandleMode(1/*管理画面*/);
218 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
220 case 3: // 存在しないページ画面へ(システム運用可能ユーザ以外)
221 // サイトが非公開の場合は、メンテナンス中画面のみ表示
222 if ($this->_accessSite($request)){ // サイト公開中の場合
223 $messageDetail = 'アクセスポイント状態=公開';
224 $this->gPage->setSystemHandleMode(12/*存在しないページ*/);
226 $messageDetail = 'アクセスポイント状態=非公開';
227 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
230 default: // アクセス不可画面へ
232 $this->gPage->setSystemHandleMode(11/*アクセス不可*/);
236 $this->_showSystemPage($request, $toAdminType);
238 // 不正アクセスの場合は、アクセスエラーログを残す
239 if ($isErrorAccess) $this->gOpeLog->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2200, 'アクセスをブロックしました。URL: ' . $this->gEnv->getCurrentRequestUri() . ', ' . $messageDetail);
242 // #################### URLの遷移 #######################
243 //if ($this->gSystem->getSystemConfig(self::CF_MOBILE_AUTO_REDIRECT)){ // 携帯自動遷移を行う場合
244 if ($this->gSystem->mobileAutoRedirect()){ // 携帯自動遷移を行う場合
246 if ($this->gEnv->isMobile() && !$this->gEnv->getIsMobileSite()){
247 $this->gPage->redirect($this->gEnv->getDefaultMobileUrl(true/*携帯用パラメータ付加*/), true/*遷移時のダイアログ表示を抑止*/);
251 if ($this->gSystem->smartphoneAutoRedirect()){ // スマートフォン自動遷移を行う場合
252 // スマートフォンのときはスマートフォンURLへ遷移
253 if ($this->gEnv->isSmartphone() && !$this->gEnv->getIsSmartphoneSite()){
254 $this->gPage->redirect($this->gEnv->getDefaultSmartphoneUrl());
260 // ################## 実行コマンドから処理を確定 ##################
261 $openBy = $request->trimValueOf(M3_REQUEST_PARAM_OPEN_BY); // ウィンドウオープンタイプ
263 // 画面作成モードか、ウィジェット単体処理モードかを決定
264 $createPage = true; // 画面作成モード
265 if ($cmd == M3_REQUEST_CMD_INIT_DB){ // DB初期化オペレーションのとき
266 } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION){ // 表示位置を表示するとき
268 //if ($this->gEnv->isSystemAdmin()){
270 // ポジションの表示画面のアクセスは、すべて管理機能URLで受け付ける
272 $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
273 if (empty($pageId)) $pageId = $this->gEnv->getDefaultPageId(); // 値がないときはデフォルトのページIDを設定
274 $this->gEnv->setCurrentPageId($pageId);
275 $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
276 if (!empty($pageSubId)) $this->gEnv->setCurrentPageSubId($pageSubId);
278 $this->gPage->showPosition(1); // ポジションを表示
282 } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 表示位置を表示するとき(ウィジェット付き)
284 //if ($this->gEnv->isSystemAdmin()){
286 // ポジションの表示画面のアクセスは、すべて管理機能URLで受け付ける
288 $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
289 if (empty($pageId)) $pageId = $this->gEnv->getDefaultPageId(); // 値がないときはデフォルトのページIDを設定
290 $this->gEnv->setCurrentPageId($pageId);
291 $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
292 if (!empty($pageSubId)) $this->gEnv->setCurrentPageSubId($pageSubId);
294 $this->gPage->showPosition(2); // ウィジェット付きポジションを表示
298 } else if ($cmd == M3_REQUEST_CMD_GET_WIDGET_INFO){ // ウィジェット各種情報取得(AJAX用)
300 $this->gPage->getWidgetInfoByAjax($request);
302 } else if ($cmd == M3_REQUEST_CMD_SHOW_PHPINFO){ // phpinfoの表示
304 $this->_showPhpinfoPage($request);
306 } else if ($cmd == M3_REQUEST_CMD_FIND_WIDGET){ // ウィジェットを検索し、前面表示
307 // 目的のウィジェットのあるページサブIDへ遷移
308 $this->gPage->redirectToUpdatedPageSubId($request);
310 } else if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET){ // ウィジェットの単体表示
311 $createPage = false; // ウィジェット単体処理モードに設定
312 $this->gPage->showWidget(); // ウィジェット表示
313 } else if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){ // ウィジェットの設定管理
314 $createPage = false; // ウィジェット単体処理モードに設定
315 $this->gPage->showWidget(); // ウィジェット表示
316 } else if ($cmd == M3_REQUEST_CMD_DO_WIDGET){ // ウィジェット単体オペレーション
317 $createPage = false; // ウィジェット単体処理モードに設定
319 // ウィンドウオープンタイプ指定のときは、テンプレートを表示する
320 if (!empty($openBy)) $this->gPage->showWidget(); // ウィジェット表示
321 } else if ($cmd == M3_REQUEST_CMD_RSS){ // RSS配信
322 $createPage = false; // ウィジェット単体処理モードに設定
323 } else if ($cmd == M3_REQUEST_CMD_CSS){ // CSS生成
325 } else if ($this->gEnv->isServerConnector()){ // サーバ接続の場合
326 $createPage = false; // ウィジェット単体処理モードに設定
329 // ################### クライアントへの出力方法の制御 ######################
331 $widgetId = $request->trimValueOf(M3_REQUEST_PARAM_WIDGET_ID);
332 if ($createPage){ // 通常の画面作成の場合
334 $this->gCache->initCache($request); // キャッシュ機能初期化
335 $cacheData = $this->gCache->getPageCache($request);
337 if (empty($cacheData)){ // キャッシュデータがないときは画面を作成
339 $curTemplateId = $this->_defineTemplate($request);
342 $pageData = $this->_createPage($request, $curTemplateId);
344 // 使用した非共通ウィジェットの数をチェック
345 $nonSharedWidgetCount = $this->gPage->getNonSharedWidgetCount();
346 if ($nonSharedWidgetCount == -1){ // カウントなしの場合
347 $this->gCache->setPageCache($request, $pageData); // キャッシュデータを設定
350 if ($isSystemAdmin || $nonSharedWidgetCount > 0){
351 $this->gCache->setPageCache($request, $pageData); // キャッシュデータを設定
353 } else { // 管理者以外で、非共通のウィジェットが使用されていないページはアクセス不可とする
354 $errMessage = 'ユーザに公開されていないページへのアクセス。';
355 $messageDetail = 'アクセスポイント状態=公開, 要因: 共有ウィジェットのみのページへのアクセスは不可。';
356 $this->gOpeLog->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2200, 'アクセスをブロックしました。URL: ' . $this->gEnv->getCurrentRequestUri() . ', ' . $messageDetail);
359 $this->gPage->redirect('?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=_accessdeny');
361 //$this->gPage->setSystemHandleMode(11/*アクセス不可*/);
364 //$this->_showSystemPage($request, 0/*アクセス不可画面*/);
371 if ($cmd != M3_REQUEST_CMD_CSS){ // 画面出力(CSS生成以外)のとき
373 echo $this->gPage->getOptionContents($request);
375 } else { // ウィジェット単体実行モードのとき
376 // ###################ウィジェット指定で出力の場合####################
377 // ウィジェット単体を直接実行するインターフェイスで、HTTPヘッダは送信しない。
379 // ・Ajaxを使って、データをやり取りしたい場合
380 // ・ウィジェット単体での実行(ウィジェットが生成したタグのみ)
381 // ・ウィジェット単体での実行(HTMLやJavascriptの追加あり)
382 // ・ウィジェット個別の設定(セキュリティの必要あり)
384 // ################# アクセスチェック ################
385 // ウィジェット単体オペレーションのときは、ウィジェット情報の単体実行許可があるかどうか判断(管理権限にかかわらず同じ動作)
386 if ($cmd == M3_REQUEST_CMD_DO_WIDGET || // ウィジェット単体実行
387 $cmd == M3_REQUEST_CMD_RSS){ // RSS配信
388 if ($this->_db->getWidgetInfo($widgetId, $row)){
389 if ($cmd == M3_REQUEST_CMD_DO_WIDGET && !$row['wd_enable_operation']){ // ウィジェット単体実行
391 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
393 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットは単体起動できません。(ウィジェットID: ' . $widgetId . ')', 2200,
394 '実行処理はキャンセルされました。このウィジェットは単体起動できないウィジェットです。単体起動を許可するにはウィジェット情報(_widgets)の単体起動フラグ(wd_enable_operation)がtrueになっている必要があります。');
396 } else if ($cmd == M3_REQUEST_CMD_RSS && !$row['wd_has_rss']){ // RSS配信
398 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
400 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットはRSS配信できません。(ウィジェットID: ' . $widgetId . ')', 2200,
401 '実行処理はキャンセルされました。このウィジェットはRSS配信できないウィジェットです。RSS配信を許可するにはウィジェット情報(_widgets)のRSS配信フラグ(wd_has_rss)がtrueになっている必要があります。');
405 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットは実行許可がありません。(ウィジェットID: ' . $widgetId . ')', 2200,
406 '実行処理はキャンセルされました。ウィジェット情報(_widgets)が見つかりません。');
411 // 管理権限がない場合は、ウィジェットのページへの配置状況からアクセス権限をチェックする
412 if (!$isSystemManageUser && !$this->gAccess->isValidAdminKey() && !$this->_db->canAccessWidget($widgetId)){
414 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
416 $this->gOpeLog->writeUserAccess(__METHOD__, 'ウィジェットへの不正なアクセスを検出しました。(ウィジェットID: ' . $widgetId . ')', 2200,
417 '実行処理はキャンセルされました。このウィジェットは一般ユーザに公開されているページ上に存在しないため単体実行できません。');
421 // ################# パラメータチェック ################
422 if (!$isSystemManageUser && !$this->gAccess->isValidAdminKey() && $this->gEnv->isServerConnector()){ // サーバ接続の場合
423 // クエリーパラメータはウィジェットIDのみ正常とする
424 $params = $this->gRequest->getQueryArray();
425 $paramCount = count($params);
426 if (!($paramCount == 1 && !empty($params[M3_REQUEST_PARAM_WIDGET_ID]))){
428 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
430 $this->gOpeLog->writeUserAccess(__METHOD__, 'サーバ接続アクセスポイントへの不正なアクセスを検出しました。', 2200,
431 '実行処理はキャンセルされました。URLのクエリー部が不正です。URL=' . $this->gEnv->getCurrentRequestUri());
436 // 画面表示する場合はテンプレートを設定。画面に表示しない場合はテンプレートが必要ない。
437 if ($this->gPage->getShowWidget()){
439 //$curTemplate = $this->_defineTemplate($request);
440 $curTemplate = $this->gSystem->defaultAdminTemplateId();
443 $this->gEnv->setCurrentTemplateId($curTemplate);
446 // ################### バッファリング開始 ######################
447 // ob_end_flush()までの出力をバッファリングする
451 if (method_exists($this, '_preBuffer')) $this->_preBuffer($request);
454 $this->gEnv->setCurrentWidgetId($widgetId);
456 if ($this->gEnv->isServerConnector()){ // サーバ接続の場合
457 // ウィジェット用のHTMLヘッダを出力
458 $this->gPage->startWidgetXml($cmd);
461 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
463 if (file_exists($widgetIndexFile)){
465 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
467 require_once($widgetIndexFile);
469 echo 'file not found: ' . $widgetIndexFile;
473 $this->gPage->endWidgetXml($cmd);
474 } else if ($cmd == M3_REQUEST_CMD_RSS){ // RSS配信のとき
477 // ウィジェット用のHTMLヘッダを出力
478 $this->gPage->startWidgetRss($cmd);
481 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
483 if (file_exists($widgetIndexFile)){
484 // ウィジェット定義ID、ページ定義のシリアル番号を取得
485 $configId = 0; // 定義ID
486 $serial = 0; // シリアル番号
487 if ($this->_db->getPageDefOnPageByWidgetId($this->gEnv->getCurrentPageId(), $this->gEnv->getCurrentPageSubId(), $widgetId, $row)){
488 $configId = $row['pd_config_id']; // 定義ID
489 $serial = $row['pd_serial']; // シリアル番号
493 $this->gEnv->setCurrentWidgetConfigId($configId);
496 $this->gEnv->setCurrentPageDefSerial($serial);
499 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
501 require_once($widgetIndexFile);
504 $this->gEnv->setCurrentWidgetConfigId('');
507 $this->gEnv->setCurrentPageDefSerial(0);
509 echo 'file not found: ' . $widgetIndexFile;
512 // 現在のバッファ内容を取得し、バッファを破棄
513 $content = ob_get_contents();
517 $this->gPage->endWidgetRss($cmd, $content);
518 } else { // RSS配信以外のとき
521 // ウィジェット用のHTMLヘッダを出力
522 $this->gPage->startWidget($cmd);
525 if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){ // ウィジェット設定のとき
526 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/admin/index.php'; // 管理用画面
528 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
530 if (file_exists($widgetIndexFile)){
531 // ウィジェット定義ID、ページ定義のシリアル番号を取得
532 $configId = 0; // 定義ID
533 $serial = 0; // シリアル番号
534 if ($this->_db->getPageDefOnPageByWidgetId($this->gEnv->getCurrentPageId(), $this->gEnv->getCurrentPageSubId(), $widgetId, $row)){
535 $configId = $row['pd_config_id']; // 定義ID
536 $serial = $row['pd_serial']; // シリアル番号
540 $this->gEnv->setCurrentWidgetConfigId($configId);
543 $this->gEnv->setCurrentPageDefSerial($serial);
546 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
548 require_once($widgetIndexFile);
551 $this->gEnv->setCurrentWidgetConfigId('');
554 $this->gEnv->setCurrentPageDefSerial(0);
556 echo 'file not found: ' . $widgetIndexFile;
559 // 現在のバッファ内容を取得し、バッファを破棄
560 $content = ob_get_contents();
564 $this->gPage->endWidget($cmd, $content);
568 $this->gEnv->setCurrentWidgetId('');
571 if (method_exists($this, '_postBuffer')) $this->_postBuffer($request);
573 if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET || // ウィジェットの単体表示
574 $cmd == M3_REQUEST_CMD_CONFIG_WIDGET || // ウィジェット設定のとき
575 ($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy))){ // ウィンドウオープンタイプ指定でウィジェット単体実行のとき
577 // 現在の出力内容を取得し、一旦内容をクリア
578 $srcContents = ob_get_contents();
581 // 追加変換処理。HTMLヘッダ出力する。
582 $destContents = $this->gPage->lateLaunchWidget($request, $srcContents);
587 // ページ作成終了処理(HTTPヘッダ出力)
588 $this->gPage->endPage($request);
590 if ($cmd != M3_REQUEST_CMD_RSS){ // 画面出力(RSS配信以外)のとき
592 echo $this->gPage->getOptionContents($request);
595 // バッファ内容を送信(クライアントへの送信完了)
598 if (!defined('M3_STATE_IN_INSTALL')){ // インストールモード以外のとき
599 // #################### アクセスログ記録 #######################
600 // DBが使用可能であれば、アクセスログのユーザを登録
601 if ($this->gEnv->canUseDb()) $this->gAccess->accessLogUser();
605 //$this->gLog->info(__METHOD__, 'フレーム作成終了');
610 * @param RequestManager $request HTTPリクエスト処理クラス
611 * @param string $curTemplate テンプレートID
612 * @return string 画面出力
614 function _createPage($request, $curTemplate)
616 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND); // 実行コマンドを取得
619 $this->gEnv->setCurrentTemplateId($curTemplate);
622 $convType = 0; // 変換処理タイプ(0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
623 if ($this->gEnv->getIsMobileSite()){
624 $convType = -1; // 携帯サイト用変換
626 // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
627 $convType = $this->gEnv->getCurrentTemplateType();
631 if (method_exists($this, '_prepareBuffer')) $this->_prepareBuffer($request);
633 // ################### バッファリング開始 ######################
634 // ob_end_flush()までの出力をバッファリングする
635 if ($convType == -1){// 携帯用サイトの場合は出力エンコーディングを変更
636 $mobileEncoding = $this->gEnv->getMobileEncoding(); // 携帯用エンコーディングを取得
637 mb_http_output($mobileEncoding);
638 ob_start("mb_output_handler"); // 出力のバッファリング開始
644 if (method_exists($this, '_preBuffer')) $this->_preBuffer($request);
646 if ($convType >= 1){ // Joomla!v1.5,v2.5テンプレートのとき
648 require_once($this->gEnv->getJoomlaRootPath() . '/mosDef.php');// Joomla定義読み込み
649 require_once($this->gEnv->getJoomlaRootPath() . '/JParameter.php');
650 require_once($this->gEnv->getJoomlaRootPath() . '/JRender.php');
654 $paramFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplate . '/params.ini';
655 if (is_readable($paramFile)){
656 $content = file_get_contents($paramFile);
657 $params = new JParameter($content);
659 $params = new JParameter();
661 // テンプレートヘッダ画像上のテキスト設定(Joomla!テンプレート2.5以降)
662 $params->set('siteTitle', $this->gEnv->getSiteName()); // サイト名
663 $params->set('siteSlogan', $this->gSystem->getSiteDef(M3_TB_FIELD_SITE_SLOGAN)); // サイトスローガン
665 // Joomla!テンプレート共通の設定
669 define('JPATH_BASE', dirname(__FILE__));
670 define('JPATH_SITE', $this->gEnv->getSystemRootPath());
671 define('DS', DIRECTORY_SEPARATOR);
672 $this->language = $this->gEnv->getCurrentLanguage();
673 $this->template = $curTemplate;
674 //$this->baseurl = $this->gEnv->getRootUrl();
675 $this->baseurl = $this->gEnv->getRootUrlByCurrentPage();
676 $this->direction = 'ltr';
677 $this->params = $params;
679 // 現在のJoomla!ドキュメントを設定
680 $this->gEnv->setJoomlaDocument($this);
681 } else { // デフォルト(Joomla!v1.0テンプレート)テンプレートのとき(PC用および携帯用)
682 // Joomla!テンプレート共通の設定
686 global $mosConfig_absolute_path;
687 global $mosConfig_live_site;
688 global $mosConfig_sitename;
689 global $mosConfig_favicon;
690 global $mosConfig_sef;
691 global $cur_template;
693 require_once($this->gEnv->getJoomlaRootPath() . '/mosDef.php');// Joomla定義読み込み
694 require_once($this->gEnv->getJoomlaRootPath() . '/mosFunc.php');
695 require_once($this->gEnv->getJoomlaRootPath() . '/includes/sef.php');
698 // ################### テンプレート読み込み ###################
699 // テンプレートのポジションタグからウィジェットが実行される
700 $templateIndexFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplate . '/index.php';
701 if (file_exists($templateIndexFile)){
702 require_once($templateIndexFile);
703 } else { // テンプレートが存在しないとき
704 if ($this->gEnv->isSystemManageUser()){ // システム管理ユーザのとき
705 echo 'template not found error: ' . $curTemplate;
708 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
709 $this->_showSystemPage($request, 2/*サイト非公開画面*/);// システム制御画面を表示
711 // 運用ログに記録(一度だけ出力したい)
712 //$this->gOpeLog->writeFatal(__METHOD__, 'テンプレートが存在しません。メンテナンス画面を表示します。(テンプレートID=' . $curTemplate . ')', 1100);
718 if (method_exists($this, '_postBuffer')) $this->_postBuffer($request);
720 // 現在の出力内容を取得し、一旦内容をクリア
721 $srcContents = ob_get_contents();
724 // Joomla!タグの変換処理(ウィジェット実行)
725 if ($convType >= 1){ // Joomla!v1.5,v2.5テンプレートのとき
726 $srcContents = $this->gPage->launchWidgetByJoomlaTag($srcContents, $convType);
729 // 遅延実行ウィジェットの出力を埋め込む。HTMLヘッダ出力する。
730 $destContents = $this->gPage->lateLaunchWidget($request, $srcContents);
732 // 携帯インターフェイスのときのときは、手動変換後、バイナリコード(絵文字等)を埋め込む
733 if ($convType == -1){ // 携帯アクセスポイントの場合
735 $destContents = mb_convert_encoding($destContents, $mobileEncoding, M3_ENCODING);
737 // コンテンツ変換メソッドがある場合は実行
738 if (method_exists($this, '_convContents')){
739 $destContents = $this->_convContents($destContents);// 絵文字埋め込み処理等
743 // ##### CSS生成の場合は、すべてのウィジェット実行後出力を削除する #####
744 if ($cmd == M3_REQUEST_CMD_CSS) $destContents = ''; // CSS生成のとき
746 // ページ作成終了処理(HTTPヘッダ出力)
747 $destContents .= $this->gPage->endPage($request, true/*出力を取得*/); // 最終HTMLを追加
748 if ($this->gPage->isRedirect()) return '';// リダイレクトの場合ob_end_clean()を実行すると、ログインできないことがあるのでここで終了(2011/11/11)
755 return $destContents;
760 * @param RequestManager $request HTTPリクエスト処理クラス
761 * @param bool $useSubClassDefine サブクラスでの定義を使用するかどうか
762 * @return string テンプレート名
764 function _defineTemplate($request, $useSubClassDefine = true)
766 // ########### テンプレートID(ディレクトリ名)を設定 ############
767 // テンプレートIDの指定の方法は2パターン
772 // 1.サブクラスの_setTemplate()で固定設定にしている場合の固定値
776 $isSystemManageUser = $this->gEnv->isSystemManageUser(); // システム運用可能かどうか
778 // テンプレート変更のときは、セッションのテンプレートIDを変更
779 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND); // 実行コマンドを取得
780 if ($cmd == M3_REQUEST_CMD_CHANGE_TEMPLATE){
781 // テンプレートIDをセッションに残す場合
782 if ($this->gSystem->useTemplateIdInSession()){ // セッションに保存する場合
783 $request->setSessionValue(M3_SESSION_CURRENT_TEMPLATE, $request->trimValueOf(M3_SYSTEM_TAG_CHANGE_TEMPLATE));
787 // サブクラスでテンプレートIDを指定している場合はそちらを使用
788 $templateDefined = false; // テンプレート固定かどうか
789 if ($useSubClassDefine){
790 $tmplStr = trim($this->_setTemplate($request));
791 if (strlen($tmplStr) > 0){
792 $curTemplate = $tmplStr;
793 $templateDefined = true; // テンプレート固定かどうか
797 // セッションにあるときは、セッションの値を使用(携帯でないとき)
798 $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
799 if (empty($curTemplate)){
800 if ($cmd == M3_REQUEST_CMD_SHOW_POSITION || // 表示位置を表示するとき
801 $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 表示位置を表示するとき(ウィジェット付き)
802 // URLの引数として、ページIDとページサブIDが指定されてくる
803 // URLの引数のテンプレートを優先し、引数で指定されていなければ、ページ用個別のテンプレートを取得する
805 // URLの引数でテンプレートIDが指定されている場合は設定
806 $templateId = $request->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID); // テンプレートIDを取得
807 if (!empty($templateId)) $curTemplate = $templateId;
809 // ページ用個別に設定されたテンプレートがある場合は取得
810 if (empty($curTemplate)){
811 $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
812 $line = $this->gPage->getPageInfo($pageId, $pageSubId);
813 if (!empty($line)) $pageTemplateId = $line['pn_template_id'];
814 if (!empty($pageTemplateId)) $curTemplate = $pageTemplateId;
818 if (empty($curTemplate)){
819 if ($pageId == $this->gEnv->getDefaultPageId()){ // 通常サイトのとき
820 $curTemplate = $this->gSystem->defaultTemplateId();
821 } else if ($pageId == $this->gEnv->getDefaultMobilePageId()){ // 携帯サイトのとき
822 $curTemplate = $this->gSystem->defaultMobileTemplateId(); // 携帯用デフォルトテンプレート
823 } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){ // スマートフォン用サイトのとき
824 $curTemplate = $this->gSystem->defaultSmartphoneTemplateId(); // スマートフォン用デフォルトテンプレート
825 } else if ($pageId == $this->gEnv->getDefaultAdminPageId() || // 管理サイトのとき
826 $pageId == $this->gEnv->getDefaultRegistPageId()){ // 登録サイトのとき
827 $curTemplate = $this->gSystem->defaultAdminTemplateId();
828 } else if (empty($pageId)){ // ページIDが指定されていないときは、ウィジェットを表示しないテンプレートのみの表示
829 // URLの引数でテンプレートIDが指定されている場合は設定
830 // $templateId = $request->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID); // テンプレートIDを取得
831 // if (!empty($templateId)) $curTemplate = $templateId;
835 // ページ用のテンプレートがあるときは優先
836 $pageTemplateId = $this->gPage->getTemplateIdFromCurrentPageInfo();
837 if (!empty($pageTemplateId)) $curTemplate = $pageTemplateId;
839 // テンプレートIDをセッションから取得
840 if (empty($curTemplate) && !$isSystemManageUser){ // システム運用者はセッション値を使用できない
841 if ($this->gSystem->useTemplateIdInSession()){ // セッションに保存する場合
842 if (!$this->gEnv->getIsMobileSite() && !$this->gEnv->getIsSmartphoneSite()){
843 $curTemplate = $request->getSessionValue(M3_SESSION_CURRENT_TEMPLATE);// 携帯サイト、スマートフォンサイトでないときはセッション値を取得
848 // オプションのテンプレートがある場合はオプションを優先
849 $optionTemplate = $this->gPage->getOptionTemplateId();
850 if (!empty($optionTemplate)){
851 $curTemplate = $optionTemplate;
852 $templateDefined = true; // テンプレート固定かどうか
855 // セッションにないときはデフォルトを取得
856 if (empty($curTemplate)){
857 if ($this->gEnv->getIsMobileSite()){// 携帯用サイトの場合
858 $curTemplate = $this->gSystem->defaultMobileTemplateId(); // 携帯用デフォルトテンプレート
859 } else if ($this->gEnv->getIsSmartphoneSite()){// スマートフォン用サイトの場合
860 $curTemplate = $this->gSystem->defaultSmartphoneTemplateId(); // スマートフォン用デフォルトテンプレート
862 $curTemplate = $this->gSystem->defaultTemplateId();
868 if (empty($curTemplate)){
869 // テンプレートが1つもみつからないときは、管理用テンプレートを使用
870 $curTemplate = $this->gSystem->defaultAdminTemplateId();
871 echo 'template not found. viewing by administration template. [' . $curTemplate . ']';
872 } else { // セッションにテンプレートIDを保存
873 // テンプレートIDをセッションに残す場合
874 /* if ($this->gSystem->useTemplateIdInSession()){ // セッションに保存する場合
875 if ($cmd == M3_REQUEST_CMD_SHOW_POSITION || // 表示位置を表示するとき
876 $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 表示位置を表示するとき(ウィジェット付き)
878 if (!$this->gEnv->getIsMobileSite() && !$this->gEnv->getIsSmartphoneSite() && !$templateDefined){ // PC用画面でサブクラス固定でないとき場合は保存
879 $request->setSessionValue(M3_SESSION_CURRENT_TEMPLATE, $curTemplate);
889 * @param RequestManager $request HTTPリクエスト処理クラス
890 * @return bool サイトにアクセスできるかどうか
892 function _accessSite($request)
895 $isOpen = $this->gSystem->siteInPublic();
897 // PC用サイト、携帯用サイト、スマートフォン用サイトの公開状況をチェック
898 if ($this->gEnv->getIsPcSite()){
899 if ($this->gSystem->sitePcInPublic()) return true;
900 } else if ($this->gEnv->getIsMobileSite()){
901 if ($this->gSystem->siteMobileInPublic()) return true;
902 } else if ($this->gEnv->getIsSmartphoneSite()){
903 if ($this->gSystem->siteSmartphoneInPublic()) return true;
908 $ip = $this->gSystem->getSystemConfig(self::SITE_ACCESS_EXCEPTION_IP);
909 if (!empty($ip) && $ip = $request->trimServerValueOf('REMOTE_ADDR')){
919 * @param RequestManager $request HTTPリクエスト処理クラス
920 * @param int $type 画面タイプ(0=アクセス不可、1=ログイン画面、2=サイト非公開画面)
923 function _showSystemPage($request, $type)
926 $pageId = 'admin_index'; // 管理画面を表示
927 $this->gEnv->setCurrentPageId($pageId); // ここでデフォルトページサブIDが再設定される
928 $this->gEnv->setCurrentPageSubId($this->gEnv->getDefaultPageSubId());// デフォルトページサブIDをカレントにする
931 // DBで設定されている値を取得し、なければ管理用デフォルトテンプレートを使用
932 if ($this->gEnv->getIsMobileSite()){ // 携帯用サイトのアクセスの場合
933 $curTemplateId = self::M_ADMIN_TEMPLATE; // 携帯管理画面用テンプレート
934 } else { // 携帯以外のサイトへのアクセスの場合
935 if ($type == 1){ // ログインはデフォルトの管理画面テンプレートに固定
936 $curTemplateId = $this->gSystem->defaultAdminTemplateId();
938 $curTemplateId = $this->gSystem->getSystemConfig(self::CONFIG_KEY_MSG_TEMPLATE);
939 if (empty($curTemplateId)){
940 $curTemplateId = self::SYSTEM_TEMPLATE;// システム画面用テンプレート
943 $templateIndexFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplateId . '/index.php';
944 if (!file_exists($templateIndexFile)) $curTemplateId = self::SYSTEM_TEMPLATE;// システム画面用テンプレート
950 $pageData = $this->_createPage($request, $curTemplateId);
956 * @param RequestManager $request HTTPリクエスト処理クラス
959 function _showPhpinfoPage($request)
961 // ################### バッファリング開始 ######################
962 // ob_end_flush()までの出力をバッファリングする
967 // バッファ内容を送信(クライアントへの送信完了)
971 * 以下、Joomla!v1.5テンプレート専用
976 * @param string $pos ポジション
977 * @return int ウィジェット数
979 function countModules($pos)
981 $count = $this->gPage->getWidgetsCount($pos);
984 function getBuffer($type = null, $name = null, $attribs = array())
988 function setBuffer($contents, $type, $name = null)
995 * @return string 出力タイプ
1004 * @return array ヘッダ情報
1006 function getHeadData()
1009 /*$data['title'] = $this->title;
1010 $data['description']= $this->description;
1011 $data['link'] = $this->link;
1012 $data['metaTags'] = $this->_metaTags;
1013 $data['links'] = $this->_links;
1014 $data['styleSheets']= $this->_styleSheets;
1015 $data['style'] = $this->_style;
1016 $data['scripts'] = $this->_scripts;
1017 $data['script'] = $this->_script;
1018 $data['custom'] = $this->_custom;*/
1024 * @return string ベースパス
1031 * Adds a linked script to the page
1033 * @param string $url URL to the linked script
1034 * @param string $type Type of script. Defaults to 'text/javascript'
1037 function addScript($url, $type="text/javascript") {
1038 $this->_scripts[$url] = $type;
1041 * Adds a script to the page
1044 * @param string $content Script
1045 * @param string $type Scripting mime (defaults to 'text/javascript')
1048 function addScriptDeclaration($content, $type = 'text/javascript')
1050 if (!isset($this->_script[strtolower($type)])) {
1051 $this->_script[strtolower($type)] = $content;
1053 $this->_script[strtolower($type)] .= chr(13).$content;