OSDN Git Service

themlerテンプレートに対応。
[magic3/magic3.git] / include / container / baseFrameContainer.php
1 <?php
2 /**
3  * フレームコンテナ作成用ベースクラス
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    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
13  * @version    SVN: $Id$
14  * @link       http://www.magic3.org
15  */
16 require_once(M3_SYSTEM_INCLUDE_PATH . '/db/systemDb.php');              // システムDBアクセスクラス
17 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
18
19 class BaseFrameContainer extends Core
20 {
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';         // 携帯の自動遷移
28         
29         /**
30          * コンストラクタ
31          */
32         function __construct()
33         {
34                 // 親クラスを呼び出す
35                 parent::__construct();
36                 
37                 // DBオブジェクト取得
38                 $this->_db = $this->gInstance->getSytemDbObject();
39         }
40         /**
41          * 起動マネージャから呼ばれる唯一のメソッド
42          *
43          * @param RequestManager $request               HTTPリクエスト処理クラス
44          */
45         function process($request)
46         {
47                 // パラメータを取得
48                 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);               // 実行コマンドを取得
49                                 
50                 // インストール画面への制御は、install.phpファイルの作成、削除で制御する
51                 // 最小限の設定が行われていない場合,DBに接続できない場合は、インストール画面へ
52                 if (!defined('M3_STATE_IN_INSTALL')){
53                         if (($this->gEnv->canUseDb() && $this->gSystem->canInitSystem()) ||             // システム初期化モードのとき
54                                 !$this->gConfig->isConfigured()){                                                                       // 設定ファイルに設定がないとき(初回インストール)
55                                 
56                                 // インストーラファイルがない場合は回復
57                                 $this->gInstance->getFileManager()->recoverInstaller();
58
59                                 $this->gPage->redirectToInstall();
60                                 return;
61                         } else if ($this->gConfig->isConfigured() && !$this->gEnv->canUseDb()){         // DB接続失敗のとき
62                                 if ($this->gEnv->isAdminDirAccess()){           // 管理画面の場合のみインストーラ起動
63                                         // インストーラファイルがない場合は回復
64                                         $this->gInstance->getFileManager()->recoverInstaller();
65
66                                         $this->gPage->redirectToInstall();
67                                 } else {
68                                         // サーバ内部エラーメッセージ表示
69                                         $this->gPage->showError(500);
70                                 }
71                                 return;
72                         }
73                 }
74                 
75                 // 開始ログ出力
76                 //$this->gLog->info(__METHOD__, 'フレーム作成開始');
77
78                 // ページ作成開始
79                 // セッション変数読み込み。サブページIDの設定。
80                 $this->gPage->startPage($request);
81                 
82                 // パラメータ取得
83                 $isSystemAdmin = $this->gEnv->isSystemAdmin();          // 管理者権限があるかどうか
84                 $isSystemManageUser = $this->gEnv->isSystemManageUser();                // システム運用可能かどうか
85                         
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);
93                                         if (empty($lang)){
94                                                 // 空の場合はクッキーから言語値を取得
95                                                 $lang = $request->getCookieValue(M3_COOKIE_LANG);
96                                         }
97
98                                         // アクセス可能な言語な場合は変更
99                                         if (in_array($lang, $this->gSystem->getAcceptLanguage())){
100                                                 $this->gEnv->setCurrentLanguage($lang);
101                                                 
102                                                 // クッキーに言語を保存
103                                                 $request->setCookieValue(M3_COOKIE_LANG, $lang);
104                                         } else {                // アクセス不可の場合はクッキーを削除
105                                                 // クッキーを削除
106                                                 $request->setCookieValue(M3_COOKIE_LANG, '', -1);
107                                         }
108                                 } else {
109                                         // クッキーを削除
110                                         $request->setCookieValue(M3_COOKIE_LANG, '', -1);
111                                 }
112                                 // 言語に依存する情報を取り込む
113                                 $this->gPage->loadLang();
114                         }
115                         // ################### URLアクセス制御 ######################
116                         // 非公開URLへは管理権限がないとアクセスできない
117                         $canAccess = true;              // アクセス可能かどうか
118                         $isErrorAccess = false;         // 不正アクセスかどうか
119                         $toAdminType = 0;               // 管理画面の遷移タイプ(0=アクセス不可、1=ログイン画面、2=サイト非公開画面, 3=存在しないページ)
120                         $errMessage = '';       // エラーメッセージ
121                         $messageDetail = '';    // 詳細メッセージ
122                         
123                         // ページID,ページサブIDからアクセス権をチェック
124                         $isPublicUrl = $this->gPage->canAccessUrl($isActivePage);
125                         if (!$isPublicUrl && !$isSystemManageUser){// システム運用可能ユーザかどうか
126                                 $canAccess = false;
127                                 $isErrorAccess = true;          // 不正アクセスかどうか
128                                 $errMessage = 'ユーザに公開されていないページへのアクセス。';
129                                 
130                                 if (!$isActivePage) $toAdminType = 3;           // 有効なアクセスポイントでない場合は存在しないページとする
131                         }
132
133                         // ################### ユーザアクセス制御 ######################
134                         // クッキーがないため権限を識別できない場合でも、管理者として処理する場合があるので、サブクラスの_checkAccess()メソッドは必ず通るようにする
135                         if ($canAccess){                // アクセス可能な場合はユーザをチェック
136                                 if (method_exists($this, '_checkAccess')){
137                                         // 管理画面へのアクセスを制御
138                                         $canAccess = $this->_checkAccess($request);             // サブクラスメソッドの呼び出し
139                                         
140                                         // 一般画面から直接管理画面が呼ばれた場合は一旦ログインへ遷移
141                                         if (!$canAccess && 
142                                                 ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET ||                                                // ウィジェットの設定
143                                                 $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET)){                     // 表示位置を表示するとき(ウィジェット付き)
144                                                 // 管理画面で処理
145                                                 $toAdminType = 1;               // ログイン画面へ
146                                         }
147                                 } else {                        // _checkAccess()がないときは、標準のアクセス制御
148                                         // 一般画面へのアクセスを制御
149                                         $canAccess = $this->_accessSite($request);              // サイト公開制御
150                                         if ($canAccess){
151                                                 if ($cmd == M3_REQUEST_CMD_LOGIN ||                                     // ログイン画面を表示のとき
152                                                         $cmd == M3_REQUEST_CMD_LOGOUT){                         // ログアウトのとき
153
154                                                         // 管理画面で処理
155                                                         $canAccess = false;
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生成
166                                                         
167                                                         // 標準のアクセスでは、上記コマンド以外は受け付けない
168                                                         $canAccess = false;
169                                                         $isErrorAccess = true;          // 不正アクセス
170                                                         $errMessage = '不正なコマンドの実行。';
171                                                         $messageDetail = 'アクセスポイント状態=公開';
172                                                 }
173                                         } else {                // サイトアクセスできない場合は、管理画面でメッセージを表示
174                                                 if ($cmd == M3_REQUEST_CMD_LOGIN ||                                     // ログイン画面を表示のとき
175                                                         $cmd == M3_REQUEST_CMD_LOGOUT ||                                // ログアウトのとき
176                                                         $cmd == M3_REQUEST_CMD_PREVIEW){                                        // サイトのプレビューを表示
177                                                         $toAdminType = 1;               // ログイン画面へ
178                                                 } else {
179                                                         $toAdminType = 2;               // サイト非公開画面へ
180                                                 }
181                                                 
182                                                 // 不正なコマンドはログを残す
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生成
194                                                         
195                                                         $isErrorAccess = true;          // 不正アクセス
196                                                         $errMessage = '不正なコマンドの実行。';
197                                                         $messageDetail = 'アクセスポイント状態=非公開';
198                                                 }
199                                         }
200                                 }
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 システム管理者のみに変更
205                         }
206                         // #################### アクセスログ記録 #######################
207                         // DBが使用可能であれば、ログイン処理終了後、アクセスログを残す
208                         if ($this->gEnv->canUseDb()) $this->gAccess->accessLog();
209
210                         // アクセス不可のときはここで終了
211                         if (!$canAccess){
212                                 switch ($toAdminType){
213                                         case 1:                 // ログイン画面へ
214                                                 // システム制御モードに変更
215                                                 $this->gPage->setSystemHandleMode(1/*管理画面*/);
216                                                 break;
217                                         case 2:                 // サイト非公開画面へ
218                                                 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
219                                                 break;
220                                         case 3:                 // 存在しないページ画面へ(システム運用可能ユーザ以外)
221                                                 // サイトが非公開の場合は、メンテナンス中画面のみ表示
222                                                 if ($this->_accessSite($request)){              // サイト公開中の場合
223                                                         $messageDetail = 'アクセスポイント状態=公開';
224                                                         $this->gPage->setSystemHandleMode(12/*存在しないページ*/);
225                                                 } else {
226                                                         $messageDetail = 'アクセスポイント状態=非公開';
227                                                         $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
228                                                 }
229                                                 break;
230                                         default:                // アクセス不可画面へ
231                                                 // システム制御モードに変更
232                                                 $this->gPage->setSystemHandleMode(11/*アクセス不可*/);
233                                                 break;
234                                 }
235                                 // システム制御画面を表示
236                                 $this->_showSystemPage($request, $toAdminType);
237                                                 
238                                 // 不正アクセスの場合は、アクセスエラーログを残す
239                                 if ($isErrorAccess) $this->gOpeLog->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2200, 'アクセスをブロックしました。URL: ' . $this->gEnv->getCurrentRequestUri() . ', ' . $messageDetail);
240                                 return;
241                         }
242                         // #################### URLの遷移 #######################
243                         //if ($this->gSystem->getSystemConfig(self::CF_MOBILE_AUTO_REDIRECT)){          // 携帯自動遷移を行う場合
244                         if ($this->gSystem->mobileAutoRedirect()){              // 携帯自動遷移を行う場合
245                                 // 携帯のときは携帯用URLへ遷移
246                                 if ($this->gEnv->isMobile() && !$this->gEnv->getIsMobileSite()){
247                                         $this->gPage->redirect($this->gEnv->getDefaultMobileUrl(true/*携帯用パラメータ付加*/), true/*遷移時のダイアログ表示を抑止*/);
248                                         return;
249                                 }
250                         }
251                         if ($this->gSystem->smartphoneAutoRedirect()){          // スマートフォン自動遷移を行う場合
252                                 // スマートフォンのときはスマートフォンURLへ遷移
253                                 if ($this->gEnv->isSmartphone() && !$this->gEnv->getIsSmartphoneSite()){
254                                         $this->gPage->redirect($this->gEnv->getDefaultSmartphoneUrl());
255                                         return;
256                                 }
257                         }
258                 }
259
260                 // ################## 実行コマンドから処理を確定 ##################
261                 $openBy = $request->trimValueOf(M3_REQUEST_PARAM_OPEN_BY);              // ウィンドウオープンタイプ
262                 
263                 // 画面作成モードか、ウィジェット単体処理モードかを決定
264                 $createPage = true;             // 画面作成モード
265                 if ($cmd == M3_REQUEST_CMD_INIT_DB){    // DB初期化オペレーションのとき
266                 } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION){               // 表示位置を表示するとき
267                         // 管理者権限がある場合のみ実行可能
268                         //if ($this->gEnv->isSystemAdmin()){
269                         if ($isSystemAdmin){
270                                 // ポジションの表示画面のアクセスは、すべて管理機能URLで受け付ける
271                                 // ページIDを再設定
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);
277                                 
278                                 $this->gPage->showPosition(1);                  // ポジションを表示
279                         } else {
280                                 return;
281                         }
282                 } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){           // 表示位置を表示するとき(ウィジェット付き)
283                         // 管理者権限がある場合のみ実行可能
284                         //if ($this->gEnv->isSystemAdmin()){
285                         if ($isSystemAdmin){
286                                 // ポジションの表示画面のアクセスは、すべて管理機能URLで受け付ける
287                                 // ページIDを再設定
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);
293                                 
294                                 $this->gPage->showPosition(2);                  // ウィジェット付きポジションを表示
295                         } else {
296                                 return;
297                         }
298                 } else if ($cmd == M3_REQUEST_CMD_GET_WIDGET_INFO){             // ウィジェット各種情報取得(AJAX用)
299                         // ウィジェット情報取得
300                         $this->gPage->getWidgetInfoByAjax($request);
301                         return;
302                 } else if ($cmd == M3_REQUEST_CMD_SHOW_PHPINFO){        // phpinfoの表示
303                         // phpinfo画面を表示
304                         $this->_showPhpinfoPage($request);
305                         return;
306                 } else if ($cmd == M3_REQUEST_CMD_FIND_WIDGET){         // ウィジェットを検索し、前面表示
307                         // 目的のウィジェットのあるページサブIDへ遷移
308                         $this->gPage->redirectToUpdatedPageSubId($request);
309                         return;
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;            // ウィジェット単体処理モードに設定
318                         
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生成
324                 
325                 } else if ($this->gEnv->isServerConnector()){           // サーバ接続の場合
326                         $createPage = false;            // ウィジェット単体処理モードに設定
327                 }
328
329                 // ################### クライアントへの出力方法の制御 ######################
330                 // ウィジェットIDの取得
331                 $widgetId = $request->trimValueOf(M3_REQUEST_PARAM_WIDGET_ID);
332                 if ($createPage){                               // 通常の画面作成の場合
333                         // 画面のキャッシュデータを取得
334                         $this->gCache->initCache($request);             // キャッシュ機能初期化
335                         $cacheData = $this->gCache->getPageCache($request);
336                         
337                         if (empty($cacheData)){         // キャッシュデータがないときは画面を作成
338                                 // カレントのテンプレートを決定
339                                 $curTemplateId = $this->_defineTemplate($request);
340                 
341                                 // 画面を作成
342                                 $pageData = $this->_createPage($request, $curTemplateId);
343                                 
344                                 // 使用した非共通ウィジェットの数をチェック
345                                 $nonSharedWidgetCount = $this->gPage->getNonSharedWidgetCount();
346                                 if ($nonSharedWidgetCount == -1){               // カウントなしの場合
347                                         $this->gCache->setPageCache($request, $pageData);               // キャッシュデータを設定
348                                         echo $pageData;
349                                 } else {
350                                         if ($isSystemAdmin || $nonSharedWidgetCount > 0){
351                                                 $this->gCache->setPageCache($request, $pageData);               // キャッシュデータを設定
352                                                 echo $pageData;
353                                         } else {                // 管理者以外で、非共通のウィジェットが使用されていないページはアクセス不可とする
354                                                 $errMessage = 'ユーザに公開されていないページへのアクセス。';
355                                                 $messageDetail = 'アクセスポイント状態=公開, 要因: 共有ウィジェットのみのページへのアクセスは不可。';
356                                                 $this->gOpeLog->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2200, 'アクセスをブロックしました。URL: ' . $this->gEnv->getCurrentRequestUri() . ', ' . $messageDetail);
357
358                                                 // アクセス不可ページへ遷移
359                                                 $this->gPage->redirect('?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=_accessdeny');
360                                                 // システム制御モードに変更
361                                                 //$this->gPage->setSystemHandleMode(11/*アクセス不可*/);
362
363                                                 // システム制御画面を表示
364                                                 //$this->_showSystemPage($request, 0/*アクセス不可画面*/);
365                                         }
366                                 }
367                         } else {
368                                 echo $cacheData;
369                         }
370                         
371                         if ($cmd != M3_REQUEST_CMD_CSS){                // 画面出力(CSS生成以外)のとき
372                                 // オプション出力(時間計測等)追加
373                                 echo $this->gPage->getOptionContents($request);
374                         }
375                 } else {                // ウィジェット単体実行モードのとき
376                         // ###################ウィジェット指定で出力の場合####################
377                         // ウィジェット単体を直接実行するインターフェイスで、HTTPヘッダは送信しない。
378                         // 以下のパターンで使用する。
379                         // ・Ajaxを使って、データをやり取りしたい場合
380                         // ・ウィジェット単体での実行(ウィジェットが生成したタグのみ)
381                         // ・ウィジェット単体での実行(HTMLやJavascriptの追加あり)
382                         // ・ウィジェット個別の設定(セキュリティの必要あり)
383
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']){  // ウィジェット単体実行
390                                                 // アクセスエラーのログを残す
391                                                 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
392                                                 
393                                                 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットは単体起動できません。(ウィジェットID: ' . $widgetId . ')', 2200,
394                                                 '実行処理はキャンセルされました。このウィジェットは単体起動できないウィジェットです。単体起動を許可するにはウィジェット情報(_widgets)の単体起動フラグ(wd_enable_operation)がtrueになっている必要があります。');
395                                                 return;
396                                         } else if ($cmd == M3_REQUEST_CMD_RSS && !$row['wd_has_rss']){                          // RSS配信
397                                                 // アクセスエラーのログを残す
398                                                 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
399                                                 
400                                                 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットはRSS配信できません。(ウィジェットID: ' . $widgetId . ')', 2200,
401                                                 '実行処理はキャンセルされました。このウィジェットはRSS配信できないウィジェットです。RSS配信を許可するにはウィジェット情報(_widgets)のRSS配信フラグ(wd_has_rss)がtrueになっている必要があります。');
402                                                 return;
403                                         }
404                                 } else {
405                                         $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットは実行許可がありません。(ウィジェットID: ' . $widgetId . ')', 2200,
406                                                 '実行処理はキャンセルされました。ウィジェット情報(_widgets)が見つかりません。');
407                                         return;
408                                 }
409                         }
410                         
411                         // 管理権限がない場合は、ウィジェットのページへの配置状況からアクセス権限をチェックする
412                         if (!$isSystemManageUser && !$this->gAccess->isValidAdminKey() && !$this->_db->canAccessWidget($widgetId)){
413                                 // アクセスエラーのログを残す
414                                 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
415                                 
416                                 $this->gOpeLog->writeUserAccess(__METHOD__, 'ウィジェットへの不正なアクセスを検出しました。(ウィジェットID: ' . $widgetId . ')', 2200,
417                                                 '実行処理はキャンセルされました。このウィジェットは一般ユーザに公開されているページ上に存在しないため単体実行できません。');
418                                 return;
419                         }
420                         
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]))){
427                                         // アクセスエラーのログを残す
428                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
429                                 
430                                         $this->gOpeLog->writeUserAccess(__METHOD__, 'サーバ接続アクセスポイントへの不正なアクセスを検出しました。', 2200,
431                                                         '実行処理はキャンセルされました。URLのクエリー部が不正です。URL=' . $this->gEnv->getCurrentRequestUri());
432                                         return;
433                                 }
434                         }
435
436                         // 画面表示する場合はテンプレートを設定。画面に表示しない場合はテンプレートが必要ない。
437                         if ($this->gPage->getShowWidget()){
438                                 // 管理用テンプレートに固定
439                                 //$curTemplate = $this->_defineTemplate($request);
440                                 $curTemplate = $this->gSystem->defaultAdminTemplateId();
441
442                                 // カレントのテンプレートIDを設定
443                                 $this->gEnv->setCurrentTemplateId($curTemplate);
444                         }
445                         
446                         // ################### バッファリング開始 ######################
447                         // ob_end_flush()までの出力をバッファリングする
448                         ob_start();
449                         
450                         // サブクラスの前処理を実行
451                         if (method_exists($this, '_preBuffer')) $this->_preBuffer($request);
452                 
453                         // 作業中のウィジェットIDを設定
454                         $this->gEnv->setCurrentWidgetId($widgetId);
455                         
456                         if ($this->gEnv->isServerConnector()){          // サーバ接続の場合
457                                 // ウィジェット用のHTMLヘッダを出力
458                                 $this->gPage->startWidgetXml($cmd);
459
460                                 // 指定のウィジェットを実行
461                                 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
462
463                                 if (file_exists($widgetIndexFile)){
464                                         // 実行のログを残す
465                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
466
467                                         require_once($widgetIndexFile);
468                                 } else {
469                                         echo 'file not found: ' . $widgetIndexFile;
470                                 }
471                         
472                                 // ウィジェット用のタグを閉じる
473                                 $this->gPage->endWidgetXml($cmd);
474                         } else if ($cmd == M3_REQUEST_CMD_RSS){         // RSS配信のとき
475                                 ob_start();// バッファ作成
476                                 
477                                 // ウィジェット用のHTMLヘッダを出力
478                                 $this->gPage->startWidgetRss($cmd);
479                                 
480                                 // 指定のウィジェットを実行
481                                 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
482
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'];            // シリアル番号
490                                         }
491
492                                         // ウィジェット定義IDを設定
493                                         $this->gEnv->setCurrentWidgetConfigId($configId);
494                         
495                                         // ページ定義のシリアル番号を設定
496                                         $this->gEnv->setCurrentPageDefSerial($serial);
497                                 
498                                         // 実行のログを残す
499                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
500
501                                         require_once($widgetIndexFile);
502                                         
503                                         // ウィジェット定義IDを解除
504                                         $this->gEnv->setCurrentWidgetConfigId('');
505                                 
506                                         // ページ定義のシリアル番号を解除
507                                         $this->gEnv->setCurrentPageDefSerial(0);
508                                 } else {
509                                         echo 'file not found: ' . $widgetIndexFile;
510                                 }
511                         
512                                 // 現在のバッファ内容を取得し、バッファを破棄
513                                 $content = ob_get_contents();
514                                 ob_end_clean();
515                                 
516                                 // ウィジェット用のタグを閉じる
517                                 $this->gPage->endWidgetRss($cmd, $content);
518                         } else {                // RSS配信以外のとき
519                                 ob_start();// バッファ作成
520                                                         
521                                 // ウィジェット用のHTMLヘッダを出力
522                                 $this->gPage->startWidget($cmd);
523                                 
524                                 // 指定のウィジェットを実行
525                                 if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){              // ウィジェット設定のとき
526                                         $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/admin/index.php';                // 管理用画面
527                                 } else {
528                                         $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
529                                 }
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'];            // シリアル番号
537                                         }
538
539                                         // ウィジェット定義IDを設定
540                                         $this->gEnv->setCurrentWidgetConfigId($configId);
541                         
542                                         // ページ定義のシリアル番号を設定
543                                         $this->gEnv->setCurrentPageDefSerial($serial);
544                                         
545                                         // 実行のログを残す
546                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
547
548                                         require_once($widgetIndexFile);
549                                         
550                                         // ウィジェット定義IDを解除
551                                         $this->gEnv->setCurrentWidgetConfigId('');
552                                 
553                                         // ページ定義のシリアル番号を解除
554                                         $this->gEnv->setCurrentPageDefSerial(0);
555                                 } else {
556                                         echo 'file not found: ' . $widgetIndexFile;
557                                 }
558                         
559                                 // 現在のバッファ内容を取得し、バッファを破棄
560                                 $content = ob_get_contents();
561                                 ob_end_clean();
562                                 
563                                 // ウィジェット用のタグを閉じる
564                                 $this->gPage->endWidget($cmd, $content);
565                         }
566                 
567                         // 作業中のウィジェットIDを解除
568                         $this->gEnv->setCurrentWidgetId('');
569                         
570                         // サブクラスの後処理の呼び出し
571                         if (method_exists($this, '_postBuffer')) $this->_postBuffer($request);
572                         
573                         if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET ||               // ウィジェットの単体表示
574                                 $cmd == M3_REQUEST_CMD_CONFIG_WIDGET ||         // ウィジェット設定のとき
575                                 ($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy))){         // ウィンドウオープンタイプ指定でウィジェット単体実行のとき
576                                 
577                                 // 現在の出力内容を取得し、一旦内容をクリア
578                                 $srcContents = ob_get_contents();
579                                 ob_clean();
580                                 
581                                 // 追加変換処理。HTMLヘッダ出力する。
582                                 $destContents = $this->gPage->lateLaunchWidget($request, $srcContents);
583                                 
584                                 echo $destContents;
585                         }
586                         
587                         // ページ作成終了処理(HTTPヘッダ出力)
588                         $this->gPage->endPage($request);
589
590                         if ($cmd != M3_REQUEST_CMD_RSS){                // 画面出力(RSS配信以外)のとき
591                                 // オプション出力(時間計測等)追加
592                                 echo $this->gPage->getOptionContents($request);
593                         }
594
595                         // バッファ内容を送信(クライアントへの送信完了)
596                         ob_end_flush();
597                 }
598                 if (!defined('M3_STATE_IN_INSTALL')){           // インストールモード以外のとき
599                         // #################### アクセスログ記録 #######################
600                         // DBが使用可能であれば、アクセスログのユーザを登録
601                         if ($this->gEnv->canUseDb()) $this->gAccess->accessLogUser();
602                 }
603
604                 // 終了ログ出力
605                 //$this->gLog->info(__METHOD__, 'フレーム作成終了');
606         }
607         /**
608          * 画面を作成
609          *
610          * @param RequestManager $request               HTTPリクエスト処理クラス
611          * @param string $curTemplate                   テンプレートID
612          * @return string                                               画面出力
613          */
614         function _createPage($request, $curTemplate)
615         {
616                 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);               // 実行コマンドを取得
617                 
618                 // カレントのテンプレートIDを設定
619                 $this->gEnv->setCurrentTemplateId($curTemplate);
620
621                 // テンプレート情報を取得
622                 $convType = 0;          // 変換処理タイプ(0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
623                 if ($this->gEnv->getIsMobileSite()){
624                         $convType = -1;         // 携帯サイト用変換
625                 } else {
626                         // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
627                         $convType = $this->gEnv->getCurrentTemplateType();
628                 }
629
630                 // バッファリングの準備
631                 if (method_exists($this, '_prepareBuffer')) $this->_prepareBuffer($request);
632         
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"); // 出力のバッファリング開始
639                 } else {
640                         ob_start();
641                 }
642
643                 // サブクラスの前処理を実行
644                 if (method_exists($this, '_preBuffer')) $this->_preBuffer($request);
645         
646                 if ($convType >= 1){            // Joomla!v1.5,v2.5テンプレートのとき
647                         global $mainframe;
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');
651                                                 
652                         // 設定ファイルの読み込み
653                         //$params = array();
654                         $paramFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplate . '/params.ini';
655                         if (is_readable($paramFile)){
656                                 $content = file_get_contents($paramFile);
657                                 $params = new JParameter($content);
658                         } else {
659                                 $params = new JParameter();
660                         }
661                         // テンプレートヘッダ画像上のテキスト設定(Joomla!テンプレート2.5以降)
662                         $params->set('siteTitle',               $this->gEnv->getSiteName());            // サイト名
663                         $params->set('siteSlogan',              $this->gSystem->getSiteDef(M3_TB_FIELD_SITE_SLOGAN));           // サイトスローガン
664                         
665                         // Joomla!テンプレート共通の設定
666                         define('_JEXEC', 1);
667                                                 
668                         // Joomla!v1.5用の設定
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;
678                         
679                         // 現在のJoomla!ドキュメントを設定
680                         $this->gEnv->setJoomlaDocument($this);
681                 } else {                        // デフォルト(Joomla!v1.0テンプレート)テンプレートのとき(PC用および携帯用)
682                         // Joomla!テンプレート共通の設定
683                         define('_JEXEC', 1);
684                         
685                         // 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;
692                         global $mainframe;
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');
696                 }
697
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;
706                         } else {
707                                 // 一般向けにはメンテナンス画面を表示
708                                 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
709                                 $this->_showSystemPage($request, 2/*サイト非公開画面*/);// システム制御画面を表示
710                                                 
711                                 // 運用ログに記録(一度だけ出力したい)
712                                 //$this->gOpeLog->writeFatal(__METHOD__, 'テンプレートが存在しません。メンテナンス画面を表示します。(テンプレートID=' . $curTemplate . ')', 1100);
713                                 return;
714                         }
715                 }
716
717                 // サブクラスの後処理の呼び出し
718                 if (method_exists($this, '_postBuffer')) $this->_postBuffer($request);
719
720                 // 現在の出力内容を取得し、一旦内容をクリア
721                 $srcContents = ob_get_contents();
722                 ob_clean();
723
724                 // Joomla!タグの変換処理(ウィジェット実行)
725                 if ($convType >= 1){            // Joomla!v1.5,v2.5テンプレートのとき
726                         $srcContents = $this->gPage->launchWidgetByJoomlaTag($srcContents, $convType);
727                 }
728         
729                 // 遅延実行ウィジェットの出力を埋め込む。HTMLヘッダ出力する。
730                 $destContents = $this->gPage->lateLaunchWidget($request, $srcContents);
731
732                 // 携帯インターフェイスのときのときは、手動変換後、バイナリコード(絵文字等)を埋め込む
733                 if ($convType == -1){                   // 携帯アクセスポイントの場合
734                         // 出力するコードに変換
735                         $destContents = mb_convert_encoding($destContents, $mobileEncoding, M3_ENCODING);
736         
737                         // コンテンツ変換メソッドがある場合は実行
738                         if (method_exists($this, '_convContents')){
739                                 $destContents = $this->_convContents($destContents);// 絵文字埋め込み処理等
740                         }
741                 }
742                 
743                 // ##### CSS生成の場合は、すべてのウィジェット実行後出力を削除する #####
744                 if ($cmd == M3_REQUEST_CMD_CSS) $destContents = '';             // CSS生成のとき
745
746                 // ページ作成終了処理(HTTPヘッダ出力)
747                 $destContents .= $this->gPage->endPage($request, true/*出力を取得*/);              // 最終HTMLを追加
748                 if ($this->gPage->isRedirect()) return '';// リダイレクトの場合ob_end_clean()を実行すると、ログインできないことがあるのでここで終了(2011/11/11)
749                 
750                 // バッファを破棄
751                 //ob_end_flush();
752                 ob_end_clean();
753
754                 // 送信データを返す
755                 return $destContents;
756         }
757         /**
758          * テンプレートを決定
759          *
760          * @param RequestManager $request               HTTPリクエスト処理クラス
761          * @param bool $useSubClassDefine               サブクラスでの定義を使用するかどうか
762          * @return string               テンプレート名
763          */
764         function _defineTemplate($request, $useSubClassDefine = true)
765         {
766                 // ########### テンプレートID(ディレクトリ名)を設定 ############
767                 // テンプレートIDの指定の方法は2パターン
768                 //  1.サブクラスで固定に指定
769                 //  2.コンテンツからの指定
770                 //  3.セッションに保持
771                 // テンプレートIDの優先順位
772                 //  1.サブクラスの_setTemplate()で固定設定にしている場合の固定値
773                 //  2.セッションに持っている値
774                 //  3.DBのデフォルト値
775                 $curTemplate = '';
776                 $isSystemManageUser = $this->gEnv->isSystemManageUser();                // システム運用可能かどうか
777                 
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));
784                         }
785                 }
786
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;                // テンプレート固定かどうか
794                         }
795                 }
796
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の引数のテンプレートを優先し、引数で指定されていなければ、ページ用個別のテンプレートを取得する
804                                 
805                                 // URLの引数でテンプレートIDが指定されている場合は設定
806                                 $templateId = $request->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID);              // テンプレートIDを取得
807                                 if (!empty($templateId)) $curTemplate = $templateId;
808                                         
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;
815                                 }
816                                 
817                                 // 取得できなければデフォルトを取得
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;
832                                         }
833                                 }
834                         } else {
835                                 // ページ用のテンプレートがあるときは優先
836                                 $pageTemplateId = $this->gPage->getTemplateIdFromCurrentPageInfo();
837                                 if (!empty($pageTemplateId)) $curTemplate = $pageTemplateId;
838
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);// 携帯サイト、スマートフォンサイトでないときはセッション値を取得
844                                                 }
845                                         }
846                                 }
847                                 
848                                 // オプションのテンプレートがある場合はオプションを優先
849                                 $optionTemplate = $this->gPage->getOptionTemplateId();
850                                 if (!empty($optionTemplate)){
851                                         $curTemplate = $optionTemplate;
852                                         $templateDefined = true;                // テンプレート固定かどうか
853                                 }
854                                 
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();           // スマートフォン用デフォルトテンプレート
861                                         } else {
862                                                 $curTemplate = $this->gSystem->defaultTemplateId();
863                                         }
864                                 }
865                         }
866                 }
867
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){      // 表示位置を表示するとき(ウィジェット付き)
877                                 } else {
878                                         if (!$this->gEnv->getIsMobileSite() && !$this->gEnv->getIsSmartphoneSite() && !$templateDefined){               // PC用画面でサブクラス固定でないとき場合は保存
879                                                 $request->setSessionValue(M3_SESSION_CURRENT_TEMPLATE, $curTemplate);
880                                         }
881                                 }
882                         }*/
883                 }
884                 return $curTemplate;
885         }
886         /**
887          * サイト公開制御
888          *
889          * @param RequestManager $request               HTTPリクエスト処理クラス
890          * @return bool                                                 サイトにアクセスできるかどうか
891          */
892         function _accessSite($request)
893         {
894                 // サイトの公開状況を取得
895                 $isOpen = $this->gSystem->siteInPublic();
896                 if ($isOpen){
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;
904                         }
905                         return false;
906                 } else {
907                         // 例外とするIPアドレスをチェック
908                         $ip = $this->gSystem->getSystemConfig(self::SITE_ACCESS_EXCEPTION_IP);
909                         if (!empty($ip) && $ip = $request->trimServerValueOf('REMOTE_ADDR')){
910                                 return true;
911                         } else {
912                                 return false;
913                         }
914                 }
915         }
916         /**
917          * システム制御画面表示
918          *
919          * @param RequestManager $request               HTTPリクエスト処理クラス
920          * @param int $type                                             画面タイプ(0=アクセス不可、1=ログイン画面、2=サイト非公開画面)
921          * @return なし
922          */
923         function _showSystemPage($request, $type)
924         {
925                 // ページIDを設定
926                 $pageId = 'admin_index';                // 管理画面を表示
927                 $this->gEnv->setCurrentPageId($pageId);                                                         // ここでデフォルトページサブIDが再設定される
928                 $this->gEnv->setCurrentPageSubId($this->gEnv->getDefaultPageSubId());// デフォルトページサブIDをカレントにする
929                 
930                 // テンプレートの設定
931                 // DBで設定されている値を取得し、なければ管理用デフォルトテンプレートを使用
932                 if ($this->gEnv->getIsMobileSite()){            // 携帯用サイトのアクセスの場合
933                         $curTemplateId = self::M_ADMIN_TEMPLATE;        // 携帯管理画面用テンプレート
934                 } else {                        // 携帯以外のサイトへのアクセスの場合
935                         if ($type == 1){                        // ログインはデフォルトの管理画面テンプレートに固定
936                                 $curTemplateId = $this->gSystem->defaultAdminTemplateId();
937                         } else {
938                                 $curTemplateId = $this->gSystem->getSystemConfig(self::CONFIG_KEY_MSG_TEMPLATE);
939                                 if (empty($curTemplateId)){
940                                         $curTemplateId = self::SYSTEM_TEMPLATE;// システム画面用テンプレート
941                                 } else {
942                                         // テンプレートの存在チェック
943                                         $templateIndexFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplateId . '/index.php';
944                                         if (!file_exists($templateIndexFile)) $curTemplateId = self::SYSTEM_TEMPLATE;// システム画面用テンプレート
945                                 }
946                         }
947                 }
948
949                 // 画面を作成
950                 $pageData = $this->_createPage($request, $curTemplateId);
951                 echo $pageData;
952         }
953         /**
954          * phpinfo画面表示
955          *
956          * @param RequestManager $request               HTTPリクエスト処理クラス
957          * @return なし
958          */
959         function _showPhpinfoPage($request)
960         {
961                 // ################### バッファリング開始 ######################
962                 // ob_end_flush()までの出力をバッファリングする
963                 ob_start();
964                 
965                 phpinfo();
966                 
967                 // バッファ内容を送信(クライアントへの送信完了)
968                 ob_end_flush();
969         }
970         /**
971          * 以下、Joomla!v1.5テンプレート専用
972          */
973         /**
974          * ウィジェット数を取得
975          *
976          * @param string $pos           ポジション
977          * @return int                          ウィジェット数
978          */
979         function countModules($pos)
980         {
981                 $count = $this->gPage->getWidgetsCount($pos);
982                 return $count;
983         }
984         function getBuffer($type = null, $name = null, $attribs = array())
985         {
986                 return '';
987         }
988         function setBuffer($contents, $type, $name = null)
989         {
990                 return;
991         }
992         /**
993          * 出力タイプ取得
994          *
995          * @return string                               出力タイプ
996          */
997         function getType()
998         {
999                 return 'html';
1000         }
1001         /**
1002          * HTMLヘッダ情報取得
1003          *
1004          * @return array                                ヘッダ情報
1005          */
1006         function getHeadData()
1007         {
1008                 $data = array();
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;*/
1019                 return $data;
1020         }
1021         /**
1022          * BASEタグ設定用
1023          *
1024          * @return string                               ベースパス
1025          */
1026         function getBase()
1027         {
1028                 return '';
1029         }
1030          /**
1031          * Adds a linked script to the page
1032          *
1033          * @param       string  $url            URL to the linked script
1034          * @param       string  $type           Type of script. Defaults to 'text/javascript'
1035          * @access   public
1036          */
1037         function addScript($url, $type="text/javascript") {
1038                 $this->_scripts[$url] = $type;
1039         }
1040         /**
1041          * Adds a script to the page
1042          *
1043          * @access   public
1044          * @param       string  $content   Script
1045          * @param       string  $type   Scripting mime (defaults to 'text/javascript')
1046          * @return   void
1047          */
1048         function addScriptDeclaration($content, $type = 'text/javascript')
1049         {
1050                 if (!isset($this->_script[strtolower($type)])) {
1051                         $this->_script[strtolower($type)] = $content;
1052                 } else {
1053                         $this->_script[strtolower($type)] .= chr(13).$content;
1054                 }
1055         }
1056 }
1057 ?>