OSDN Git Service

WordPressテンプレート機能更新。
[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-2017 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         private $joomlaBufArray = array();                      // Joomla!データ受け渡し用
23         const SYSTEM_TEMPLATE = '_system';              // システム画面用テンプレート
24         const M_ADMIN_TEMPLATE = 'm/_admin';    // 携帯用管理画面テンプレート
25         const ERR_MESSAGE_ACCESS_DENY = 'Access denied.';               // ウィジェットアクセスエラーのメッセージ
26         const SITE_ACCESS_EXCEPTION_IP = 'site_access_exception_ip';            // アクセス制御、例外とするIP
27         const CONFIG_KEY_MSG_TEMPLATE = 'msg_template';                 // メッセージ用テンプレート取得キー
28 //      const CF_MOBILE_AUTO_REDIRECT = 'mobile_auto_redirect';         // 携帯の自動遷移
29         const TEMPLATE_GENERATOR_THEMLER = 'themler';                   // テンプレート作成アプリケーション(Themler)
30                 
31         /**
32          * コンストラクタ
33          */
34         function __construct()
35         {
36                 // 親クラスを呼び出す
37                 parent::__construct();
38                 
39                 // DBオブジェクト取得
40                 $this->_db = $this->gInstance->getSytemDbObject();
41         }
42         /**
43          * 起動マネージャから呼ばれる唯一のメソッド
44          *
45          * @param RequestManager $request               HTTPリクエスト処理クラス
46          */
47         function process($request)
48         {
49                 // パラメータを取得
50                 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);               // 実行コマンドを取得
51                                 
52                 // インストール画面への制御は、install.phpファイルの作成、削除で制御する
53                 // 最小限の設定が行われていない場合,DBに接続できない場合は、インストール画面へ
54                 if (!defined('M3_STATE_IN_INSTALL')){
55                         if (($this->gEnv->canUseDb() && $this->gSystem->canInitSystem()) ||             // システム初期化モードのとき
56                                 !$this->gConfig->isConfigured()){                                                                       // 設定ファイルに設定がないとき(初回インストール)
57                                 
58                                 // インストーラファイルがない場合は回復
59                                 $this->gInstance->getFileManager()->recoverInstaller();
60
61                                 $this->gPage->redirectToInstall();
62                                 return;
63                         } else if ($this->gConfig->isConfigured() && !$this->gEnv->canUseDb()){         // DB接続失敗のとき
64                                 if ($this->gEnv->isAdminDirAccess()){           // 管理画面の場合のみインストーラ起動
65                                         // インストーラファイルがない場合は回復
66                                         $this->gInstance->getFileManager()->recoverInstaller();
67
68                                         $this->gPage->redirectToInstall();
69                                 } else {
70                                         // サーバ内部エラーメッセージ表示
71                                         $this->gPage->showError(500);
72                                 }
73                                 return;
74                         }
75                 }
76                 
77                 // 開始ログ出力
78                 //$this->gLog->info(__METHOD__, 'フレーム作成開始');
79
80                 // ページ作成開始
81                 // セッション変数読み込み。サブページIDの設定。
82                 $this->gPage->startPage($request);
83                 
84                 // パラメータ取得
85                 $isSystemAdmin = $this->gEnv->isSystemAdmin();          // 管理者権限があるかどうか
86                 $isSystemManageUser = $this->gEnv->isSystemManageUser();                // システム運用可能かどうか
87                         
88                 if (!defined('M3_STATE_IN_INSTALL')){           // インストールモード以外のとき
89                         // ############## ユーザごとの設定の読み込み ###################
90                         // 引数での言語設定取得、言語変更可能な場合は変更
91                         // 言語の優先順は、URLの言語設定、クッキーの言語設定の順
92                         if (!$this->gEnv->isAdminDirAccess()){          // 管理画面以外の場合
93                                 if ($this->gEnv->getCanChangeLang() && $this->gEnv->isMultiLanguageSite()){     // 言語変更可能で多言語対応サイトのとき
94                                         $lang = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_LANG);
95                                         if (empty($lang)){
96                                                 // 空の場合はクッキーから言語値を取得
97                                                 $lang = $request->getCookieValue(M3_COOKIE_LANG);
98                                         }
99
100                                         // アクセス可能な言語な場合は変更
101                                         if (in_array($lang, $this->gSystem->getAcceptLanguage())){
102                                                 $this->gEnv->setCurrentLanguage($lang);
103                                                 
104                                                 // クッキーに言語を保存
105                                                 $request->setCookieValue(M3_COOKIE_LANG, $lang);
106                                         } else {                // アクセス不可の場合はクッキーを削除
107                                                 // クッキーを削除
108                                                 $request->setCookieValue(M3_COOKIE_LANG, '', -1);
109                                         }
110                                 } else {
111                                         // クッキーを削除
112                                         $request->setCookieValue(M3_COOKIE_LANG, '', -1);
113                                 }
114                                 // 言語に依存する情報を取り込む
115                                 $this->gPage->loadLang();
116                         }
117                         // ################### URLアクセス制御 ######################
118                         // 非公開URLへは管理権限がないとアクセスできない
119                         $canAccess = true;              // アクセス可能かどうか
120                         $isErrorAccess = false;         // 不正アクセスかどうか
121                         $toAdminType = 0;               // 管理画面の遷移タイプ(0=アクセス不可、1=ログイン画面、2=サイト非公開画面, 3=存在しないページ)
122                         $errMessage = '';       // エラーメッセージ
123                         $messageDetail = '';    // 詳細メッセージ
124                         
125                         // ページID,ページサブIDからアクセス権をチェック
126                         $isPublicUrl = $this->gPage->canAccessUrl($isActivePage, $errCode);
127                         if (!$isPublicUrl && !$isSystemManageUser){// システム運用可能ユーザかどうか
128                                 $canAccess = false;
129                                 $isErrorAccess = true;          // 不正アクセスかどうか
130                                 $errMessage = 'ユーザに公開されていないページへのアクセス。';
131                                 
132                                 if (!$isActivePage){
133                                         if ($errCode == 1){                     // ページIDが不正な場合
134                                                 $toAdminType = 4;
135                                         } else {
136                                                 $toAdminType = 3;               // 有効なアクセスポイント、ページでない場合は存在しないページとする
137                                         }
138                                 }
139                         }
140
141                         // ################### ユーザアクセス制御 ######################
142                         // クッキーがないため権限を識別できない場合でも、管理者として処理する場合があるので、サブクラスの_checkAccess()メソッドは必ず通るようにする
143                         if ($canAccess){                // アクセス可能な場合はユーザをチェック
144                                 if (method_exists($this, '_checkAccess')){
145                                         // 管理画面へのアクセスを制御
146                                         $canAccess = $this->_checkAccess($request);             // サブクラスメソッドの呼び出し
147                                         
148                                         // フロント画面から直接管理画面が呼ばれた場合は一旦ログインへ遷移
149                                         if (!$canAccess && 
150                                                 ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET ||                                                // ウィジェットの設定
151                                                 $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET)){                     // 表示位置を表示するとき(ウィジェット付き)
152                                                 // 管理画面で処理
153                                                 $toAdminType = 1;               // ログイン画面へ
154                                         }
155                                 } else {                        // _checkAccess()がないときは、標準のアクセス制御
156                                         // フロント画面へのアクセスを制御
157                                         $canAccess = $this->_accessSite($request);              // サイト公開制御
158                                         if ($canAccess){
159                                                 if ($cmd == M3_REQUEST_CMD_LOGIN ||                                     // ログイン画面を表示のとき
160                                                         $cmd == M3_REQUEST_CMD_LOGOUT){                         // ログアウトのとき
161
162                                                         // 管理画面で処理
163                                                         $canAccess = false;
164                                                         $toAdminType = 1;               // ログイン画面へ
165                                                 } else if ($cmd != '' &&                                                                // コマンドなし
166                                                         $cmd != M3_REQUEST_CMD_CHANGE_TEMPLATE &&                       // テンプレート変更
167                                                         $cmd != M3_REQUEST_CMD_SHOW_POSITION &&                         // 表示位置を表示するとき
168                                                         $cmd != M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET &&     // 表示位置を表示するとき(ウィジェット付き)
169                                                         $cmd != M3_REQUEST_CMD_FIND_WIDGET &&                           // ウィジェットを検索
170                                                         $cmd != M3_REQUEST_CMD_DO_WIDGET &&                                     // ウィジェット単体実行
171                                                         $cmd != M3_REQUEST_CMD_PREVIEW &&                                       // サイトのプレビューを表示
172                                                         $cmd != M3_REQUEST_CMD_RSS &&                                           // RSS配信
173                                                         $cmd != M3_REQUEST_CMD_CSS){                                            // CSS生成
174                                                         
175                                                         // 標準のアクセスでは、上記コマンド以外は受け付けない
176                                                         $canAccess = false;
177                                                         $isErrorAccess = true;          // 不正アクセス
178                                                         $errMessage = '不正なコマンドの実行。';
179                                                         $messageDetail = 'アクセスポイント状態=公開';
180                                                 }
181                                         } else {                // サイトアクセスできない場合は、管理画面でメッセージを表示
182                                                 if ($cmd == M3_REQUEST_CMD_LOGIN ||                                     // ログイン画面を表示のとき
183                                                         $cmd == M3_REQUEST_CMD_LOGOUT ||                                // ログアウトのとき
184                                                         $cmd == M3_REQUEST_CMD_PREVIEW){                                        // サイトのプレビューを表示
185                                                         $toAdminType = 1;               // ログイン画面へ
186                                                 } else {
187                                                         $toAdminType = 2;               // サイト非公開画面へ
188                                                 }
189                                                 
190                                                 // 不正なコマンドはログを残す
191                                                 if ($cmd != '' &&                                                               // コマンドなし
192                                                         $cmd != M3_REQUEST_CMD_LOGIN &&                         // ログイン画面を表示のとき
193                                                         $cmd != M3_REQUEST_CMD_LOGOUT &&                                        // ログアウトのとき
194                                                         $cmd != M3_REQUEST_CMD_CHANGE_TEMPLATE &&                       // テンプレート変更
195                                                         $cmd != M3_REQUEST_CMD_SHOW_POSITION &&                         // 表示位置を表示するとき
196                                                         $cmd != M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET &&     // 表示位置を表示するとき(ウィジェット付き)
197                                                         $cmd != M3_REQUEST_CMD_FIND_WIDGET &&                           // ウィジェットを検索
198                                                         $cmd != M3_REQUEST_CMD_DO_WIDGET &&                                     // ウィジェット単体実行
199                                                         $cmd != M3_REQUEST_CMD_PREVIEW &&                                       // サイトのプレビューを表示
200                                                         $cmd != M3_REQUEST_CMD_RSS &&                                           // RSS配信
201                                                         $cmd != M3_REQUEST_CMD_CSS){                                            // CSS生成
202                                                         
203                                                         $isErrorAccess = true;          // 不正アクセス
204                                                         $errMessage = '不正なコマンドの実行。';
205                                                         $messageDetail = 'アクセスポイント状態=非公開';
206                                                 }
207                                         }
208                                 }
209                                 // システム運用可能ユーザはアクセス可。
210                                 // ログアウトのときはすでに管理ユーザの可能性があるので、ログアウト時は変更しない
211                                 //if ($isSystemManageUser && $cmd != M3_REQUEST_CMD_LOGOUT) $canAccess = true;
212                                 if ($isSystemAdmin && $cmd != M3_REQUEST_CMD_LOGOUT) $canAccess = true;                 // 2011/8/31 システム管理者のみに変更
213                         }
214                         // #################### アクセスログ記録 #######################
215                         // DBが使用可能であれば、ログイン処理終了後、アクセスログを残す
216                         if ($this->gEnv->canUseDb()) $this->gAccess->accessLog();
217
218                         // アクセス不可のときはここで終了
219                         if (!$canAccess){
220                                 switch ($toAdminType){
221                                         case 1:                 // ログイン画面へ
222                                                 // システム制御モードに変更
223                                                 $this->gPage->setSystemHandleMode(1/*管理画面*/);
224                                                 break;
225                                         case 2:                 // サイト非公開画面へ
226                                                 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
227                                                 break;
228                                         case 3:                 // 存在しないページ画面へ(システム運用可能ユーザ以外)
229                                                 // サイトが非公開の場合は、メンテナンス中画面のみ表示
230                                                 if ($this->_accessSite($request)){              // サイト公開中の場合
231                                                         $messageDetail = 'アクセスポイント状態=公開';
232                                                         $this->gPage->setSystemHandleMode(12/*存在しないページ*/);
233                                                 } else {
234                                                         $messageDetail = 'アクセスポイント状態=非公開';
235                                                         $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
236                                                 }
237                                                 break;
238                                         case 4:         // 不正なページIDの指定
239                                                 $messageDetail = '不正なページIDの指定';
240                                                 $this->gPage->setSystemHandleMode(12/*存在しないページ*/);
241                                                 break;
242                                         default:                // アクセス不可画面へ
243                                                 // システム制御モードに変更
244                                                 $this->gPage->setSystemHandleMode(11/*アクセス不可*/);
245                                                 break;
246                                 }
247                                 // システム制御画面を表示
248                                 $this->_showSystemPage($request, $toAdminType);
249                                                 
250                                 // 不正アクセスの場合は、アクセスエラーログを残す
251                                 if ($isErrorAccess) $this->gOpeLog->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2201, 'アクセスをブロックしました。URL: ' . $this->gEnv->getCurrentRequestUri() . ', ' . $messageDetail);
252                                 return;
253                         }
254                         // #################### URLの遷移 #######################
255                         //if ($this->gSystem->getSystemConfig(self::CF_MOBILE_AUTO_REDIRECT)){          // 携帯自動遷移を行う場合
256                         if ($this->gSystem->mobileAutoRedirect()){              // 携帯自動遷移を行う場合
257                                 // 携帯のときは携帯用URLへ遷移
258                                 if ($this->gEnv->isMobile() && !$this->gEnv->getIsMobileSite()){
259                                         $this->gPage->redirect($this->gEnv->getDefaultMobileUrl(true/*携帯用パラメータ付加*/), true/*遷移時のダイアログ表示を抑止*/);
260                                         return;
261                                 }
262                         }
263                         if ($this->gSystem->smartphoneAutoRedirect()){          // スマートフォン自動遷移を行う場合
264                                 // スマートフォンのときはスマートフォンURLへ遷移
265                                 if ($this->gEnv->isSmartphone() && !$this->gEnv->getIsSmartphoneSite()){
266                                         $this->gPage->redirect($this->gEnv->getDefaultSmartphoneUrl());
267                                         return;
268                                 }
269                         }
270                 }
271
272                 // ################## 実行コマンドから処理を確定 ##################
273                 $openBy = $request->trimValueOf(M3_REQUEST_PARAM_OPEN_BY);              // ウィンドウオープンタイプ
274                 
275                 // 画面作成モードか、ウィジェット単体処理モードかを決定
276                 $createPage = true;             // 画面作成モード
277                 if ($cmd == M3_REQUEST_CMD_INIT_DB){    // DB初期化オペレーションのとき
278                 } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION){               // 表示位置を表示するとき
279                         // 管理者権限がある場合のみ実行可能
280                         //if ($this->gEnv->isSystemAdmin()){
281                         if ($isSystemAdmin){
282                                 // ポジションの表示画面のアクセスは、すべて管理機能URLで受け付ける
283                                 // ページIDを再設定
284 /*                              $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
285                                 if (empty($pageId)) $pageId = $this->gEnv->getDefaultPageId();          // 値がないときはデフォルトのページIDを設定
286                                 $this->gEnv->setCurrentPageId($pageId);
287                                 $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
288                                 if (!empty($pageSubId)) $this->gEnv->setCurrentPageSubId($pageSubId);
289                         */
290                                 $this->gPage->showPosition(1);                  // ポジションを表示
291                         } else {
292                                 return;
293                         }
294                 } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){           // 表示位置を表示するとき(ウィジェット付き)
295                         // 管理者権限がある場合のみ実行可能
296                         //if ($this->gEnv->isSystemAdmin()){
297                         if ($isSystemAdmin){
298                                 // ポジションの表示画面のアクセスは、すべて管理機能URLで受け付ける
299                                 // ページIDを再設定
300 /*                              $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
301                                 if (empty($pageId)) $pageId = $this->gEnv->getDefaultPageId();          // 値がないときはデフォルトのページIDを設定
302                                 $this->gEnv->setCurrentPageId($pageId);
303                                 $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
304                                 if (!empty($pageSubId)) $this->gEnv->setCurrentPageSubId($pageSubId);
305                                 */
306                                 $this->gPage->showPosition(2);                  // ウィジェット付きポジションを表示
307                         } else {
308                                 return;
309                         }
310                 } else if ($cmd == M3_REQUEST_CMD_GET_WIDGET_INFO){             // ウィジェット各種情報取得(AJAX用)
311                         // ウィジェット情報取得
312                         $this->gPage->getWidgetInfoByAjax($request);
313                         return;
314                 } else if ($cmd == M3_REQUEST_CMD_SHOW_PHPINFO){        // phpinfoの表示
315                         // phpinfo画面を表示
316                         $this->_showPhpinfoPage($request);
317                         return;
318                 } else if ($cmd == M3_REQUEST_CMD_FIND_WIDGET){         // ウィジェットを検索し、前面表示
319                         // 目的のウィジェットのあるページサブIDへ遷移
320                         $this->gPage->redirectToUpdatedPageSubId($request);
321                         return;
322                 } else if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET){         // ウィジェットの単体表示
323                         $createPage = false;            // ウィジェット単体処理モードに設定
324                         $this->gPage->showWidget();     // ウィジェット表示
325                 } else if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){               // ウィジェットの設定管理
326                         $createPage = false;            // ウィジェット単体処理モードに設定
327                         $this->gPage->showWidget();     // ウィジェット表示
328                 } else if ($cmd == M3_REQUEST_CMD_DO_WIDGET){           // ウィジェット単体オペレーション
329                         $createPage = false;            // ウィジェット単体処理モードに設定
330                         
331                         // ウィンドウオープンタイプ指定のときは、テンプレートを表示する
332                         if (!empty($openBy)) $this->gPage->showWidget();        // ウィジェット表示
333                 } else if ($cmd == M3_REQUEST_CMD_RSS){         // RSS配信
334                         $createPage = false;            // ウィジェット単体処理モードに設定
335                 } else if ($cmd == M3_REQUEST_CMD_CSS){         // CSS生成
336                 
337                 } else if ($this->gEnv->isServerConnector()){           // サーバ接続の場合
338                         $createPage = false;            // ウィジェット単体処理モードに設定
339                 }
340
341                 // ################### クライアントへの出力方法の制御 ######################
342                 // ウィジェットIDの取得
343                 $widgetId = $request->trimValueOf(M3_REQUEST_PARAM_WIDGET_ID);
344                 if ($createPage){                               // 通常の画面作成の場合
345                         // 画面のキャッシュデータを取得
346                         $this->gCache->initCache($request);             // キャッシュ機能初期化
347                         $cacheData = $this->gCache->getPageCache($request);
348                         
349                         if (empty($cacheData)){         // キャッシュデータがないときは画面を作成
350                                 // カレントのテンプレートを決定
351                                 $curTemplateId = $this->_defineTemplate($request, $subTemplateId);
352
353                                 // 画面を作成
354                                 $pageData = $this->_createPage($request, $curTemplateId, $subTemplateId);
355                                 
356                                 // 使用した非共通ウィジェットの数をチェック
357                                 $nonSharedWidgetCount = $this->gPage->getNonSharedWidgetCount();
358                                 if ($nonSharedWidgetCount == -1){               // カウントなしの場合
359                                         $this->gCache->setPageCache($request, $pageData);               // キャッシュデータを設定
360                                         echo $pageData;
361                                 } else {
362                                         if ($isSystemAdmin || $nonSharedWidgetCount > 0){
363                                                 $this->gCache->setPageCache($request, $pageData);               // キャッシュデータを設定
364                                                 echo $pageData;
365                                         } else {                // 管理者以外で、非共通のウィジェットが使用されていないページはアクセス不可とする
366                                                 $errMessage = 'ユーザに公開されていないページへのアクセス。';
367                                                 $messageDetail = 'アクセスポイント状態=公開, 要因: グローバルウィジェットのみのページへのアクセスはできません。ページには1つ以上のローカルウィジェットが必要です。';
368                                                 $this->gOpeLog->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2202, 'アクセスをブロックしました。URL: ' . $this->gEnv->getCurrentRequestUri() . ', ' . $messageDetail);
369
370                                                 // アクセス不可ページへ遷移
371                                                 $this->gPage->redirect('?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=_accessdeny');
372                                                 // システム制御モードに変更
373                                                 //$this->gPage->setSystemHandleMode(11/*アクセス不可*/);
374
375                                                 // システム制御画面を表示
376                                                 //$this->_showSystemPage($request, 0/*アクセス不可画面*/);
377                                         }
378                                 }
379                         } else {
380                                 echo $cacheData;
381                         }
382                         
383                         if ($cmd != M3_REQUEST_CMD_CSS){                // 画面出力(CSS生成以外)のとき
384                                 // オプション出力(時間計測等)追加
385                                 echo $this->gPage->getOptionContents($request);
386                         }
387                 } else {                // ウィジェット単体実行モードのとき
388                         // ###################ウィジェット指定で出力の場合####################
389                         // ウィジェット単体を直接実行するインターフェイスで、HTTPヘッダは送信しない。
390                         // 以下のパターンで使用する。
391                         // ・Ajaxを使って、データをやり取りしたい場合
392                         // ・ウィジェット単体での実行(ウィジェットが生成したタグのみ)
393                         // ・ウィジェット単体での実行(HTMLやJavascriptの追加あり)
394                         // ・ウィジェット個別の設定(セキュリティの必要あり)
395
396                         // ################# アクセスチェック ################
397                         // ウィジェット単体オペレーションのときは、ウィジェット情報の単体実行許可があるかどうか判断(管理権限にかかわらず同じ動作)
398                         if ($cmd == M3_REQUEST_CMD_DO_WIDGET ||         // ウィジェット単体実行
399                                 $cmd == M3_REQUEST_CMD_RSS){            // RSS配信
400                                 if (empty($widgetId)){
401                                         $this->gOpeLog->writeUserAccess(__METHOD__, 'ウィジェットIDが設定されていません。', 2200,
402                                                 '実行処理はキャンセルされました。');
403                                         return;
404                                 } else if ($this->_db->getWidgetInfo($widgetId, $row)){                 // ウィジェット情報取得
405                                         if ($cmd == M3_REQUEST_CMD_DO_WIDGET && !$row['wd_enable_operation']){  // ウィジェット単体実行
406                                                 // アクセスエラーのログを残す
407                                                 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
408                                                 
409                                                 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットは単体起動できません。(ウィジェットID: ' . $widgetId . ')', 2200,
410                                                 '実行処理はキャンセルされました。このウィジェットは単体起動できないウィジェットです。単体起動を許可するにはウィジェット情報(_widgets)の単体起動フラグ(wd_enable_operation)がtrueになっている必要があります。');
411                                                 return;
412                                         } else if ($cmd == M3_REQUEST_CMD_RSS && !$row['wd_has_rss']){                          // RSS配信
413                                                 // アクセスエラーのログを残す
414                                                 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
415                                                 
416                                                 $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットはRSS配信できません。(ウィジェットID: ' . $widgetId . ')', 2200,
417                                                 '実行処理はキャンセルされました。このウィジェットはRSS配信できないウィジェットです。RSS配信を許可するにはウィジェット情報(_widgets)のRSS配信フラグ(wd_has_rss)がtrueになっている必要があります。');
418                                                 return;
419                                         }
420                                 } else {
421                                         $this->gOpeLog->writeUserAccess(__METHOD__, 'このウィジェットは実行許可がありません。(ウィジェットID: ' . $widgetId . ')', 2200,
422                                                 '実行処理はキャンセルされました。ウィジェット情報(_widgets)が見つかりません。');
423                                         return;
424                                 }
425                         }
426                         
427                         // 管理権限がない場合は、ウィジェットのページへの配置状況からアクセス権限をチェックする
428                         if (!$isSystemManageUser && !$this->gAccess->isValidAdminKey() && !$this->_db->canAccessWidget($widgetId)){
429                                 // アクセスエラーのログを残す
430                                 $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
431                                 
432                                 $this->gOpeLog->writeUserAccess(__METHOD__, 'ウィジェットへの不正なアクセスを検出しました。(ウィジェットID: ' . $widgetId . ')', 2200,
433                                                 '実行処理はキャンセルされました。このウィジェットは一般ユーザに公開されているページ上に存在しないため単体実行できません。');
434                                 return;
435                         }
436                         
437                         // ################# パラメータチェック ################
438                         if (!$isSystemManageUser && !$this->gAccess->isValidAdminKey() && $this->gEnv->isServerConnector()){            // サーバ接続の場合
439                                 // クエリーパラメータはウィジェットIDのみ正常とする
440                                 $params = $this->gRequest->getQueryArray();
441                                 $paramCount = count($params);
442                                 if (!($paramCount == 1 && !empty($params[M3_REQUEST_PARAM_WIDGET_ID]))){
443                                         // アクセスエラーのログを残す
444                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd, self::ERR_MESSAGE_ACCESS_DENY);
445                                 
446                                         $this->gOpeLog->writeUserAccess(__METHOD__, 'サーバ接続アクセスポイントへの不正なアクセスを検出しました。', 2200,
447                                                         '実行処理はキャンセルされました。URLのクエリー部が不正です。URL=' . $this->gEnv->getCurrentRequestUri());
448                                         return;
449                                 }
450                         }
451
452                         // 画面表示する場合はテンプレートを設定。画面に表示しない場合はテンプレートが必要ない。
453                         if ($this->gPage->getShowWidget()){
454                                 // 管理用テンプレートに固定
455                                 //$curTemplate = $this->_defineTemplate($request);
456                                 $curTemplate = $this->gSystem->defaultAdminTemplateId();
457
458                                 // カレントのテンプレートIDを設定
459                                 $this->gEnv->setCurrentTemplateId($curTemplate);
460                         }
461                         
462                         // ################### バッファリング開始 ######################
463                         // ob_end_flush()までの出力をバッファリングする
464                         ob_start();
465                         
466                         // サブクラスの前処理を実行
467                         if (method_exists($this, '_preBuffer')) $this->_preBuffer($request);
468                 
469                         // 作業中のウィジェットIDを設定
470                         $this->gEnv->setCurrentWidgetId($widgetId);
471                         
472                         if ($this->gEnv->isServerConnector()){          // サーバ接続の場合
473                                 // ウィジェット用のHTMLヘッダを出力
474                                 $this->gPage->startWidgetXml($cmd);
475
476                                 // 指定のウィジェットを実行
477                                 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
478
479                                 if (file_exists($widgetIndexFile)){
480                                         // 実行のログを残す
481                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
482
483                                         require_once($widgetIndexFile);
484                                 } else {
485                                         echo 'file not found: ' . $widgetIndexFile;
486                                 }
487                         
488                                 // ウィジェット用のタグを閉じる
489                                 $this->gPage->endWidgetXml($cmd);
490                         } else if ($cmd == M3_REQUEST_CMD_RSS){         // RSS配信のとき
491                                 ob_start();// バッファ作成
492                                 
493                                 // ウィジェット用のHTMLヘッダを出力
494                                 $this->gPage->startWidgetRss($cmd);
495                                 
496                                 // 指定のウィジェットを実行
497                                 $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
498
499                                 if (file_exists($widgetIndexFile)){
500                                         // ウィジェット定義ID、ページ定義のシリアル番号を取得
501                                         $configId = 0;          // 定義ID
502                                         $serial = 0;            // シリアル番号
503                                         if ($this->_db->getPageDefOnPageByWidgetId($this->gEnv->getCurrentPageId(), $this->gEnv->getCurrentPageSubId(), $widgetId, $row)){
504                                                 $configId = $row['pd_config_id'];               // 定義ID
505                                                 $serial = $row['pd_serial'];            // シリアル番号
506                                         }
507
508                                         // ウィジェット定義IDを設定
509                                         $this->gEnv->setCurrentWidgetConfigId($configId);
510                         
511                                         // ページ定義のシリアル番号を設定
512                                         $this->gEnv->setCurrentPageDefSerial($serial);
513                                 
514                                         // 実行のログを残す
515                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
516
517                                         require_once($widgetIndexFile);
518                                         
519                                         // ウィジェット定義IDを解除
520                                         $this->gEnv->setCurrentWidgetConfigId('');
521                                 
522                                         // ページ定義のシリアル番号を解除
523                                         $this->gEnv->setCurrentPageDefSerial(0);
524                                 } else {
525                                         echo 'file not found: ' . $widgetIndexFile;
526                                 }
527                         
528                                 // 現在のバッファ内容を取得し、バッファを破棄
529                                 $content = ob_get_contents();
530                                 ob_end_clean();
531                                 
532                                 // ウィジェット用のタグを閉じる
533                                 $this->gPage->endWidgetRss($cmd, $content);
534                         } else {                // RSS配信以外のとき
535                                 ob_start();// バッファ作成
536                                                         
537                                 // ウィジェット用のHTMLヘッダを出力
538                                 $this->gPage->startWidget($cmd);
539                                 
540                                 // 指定のウィジェットを実行
541                                 if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){              // ウィジェット設定のとき
542                                         $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/admin/index.php';                // 管理用画面
543                                 } else {
544                                         $widgetIndexFile = $this->gEnv->getWidgetsPath() . '/' . $widgetId . '/index.php';
545                                 }
546                                 if (file_exists($widgetIndexFile)){
547                                         // ウィジェット定義ID、ページ定義のシリアル番号を取得
548                                         $configId = 0;          // 定義ID
549                                         $serial = 0;            // シリアル番号
550                                         if ($this->_db->getPageDefOnPageByWidgetId($this->gEnv->getCurrentPageId(), $this->gEnv->getCurrentPageSubId(), $widgetId, $row)){
551                                                 $configId = $row['pd_config_id'];               // 定義ID
552                                                 $serial = $row['pd_serial'];            // シリアル番号
553                                         }
554
555                                         // ウィジェット定義IDを設定
556                                         $this->gEnv->setCurrentWidgetConfigId($configId);
557                         
558                                         // ページ定義のシリアル番号を設定
559                                         $this->gEnv->setCurrentPageDefSerial($serial);
560                                         
561                                         // 実行のログを残す
562                                         $this->_db->writeWidgetLog($widgetId, 1/*単体実行*/, $cmd);
563
564                                         require_once($widgetIndexFile);
565                                         
566                                         // ウィジェット定義IDを解除
567                                         $this->gEnv->setCurrentWidgetConfigId('');
568                                 
569                                         // ページ定義のシリアル番号を解除
570                                         $this->gEnv->setCurrentPageDefSerial(0);
571                                 } else {
572                                         echo 'file not found: ' . $widgetIndexFile;
573                                 }
574                         
575                                 // 現在のバッファ内容を取得し、バッファを破棄
576                                 $content = ob_get_contents();
577                                 ob_end_clean();
578                                 
579                                 // ウィジェット用のタグを閉じる
580                                 $this->gPage->endWidget($cmd, $content);
581                         }
582                 
583                         // 作業中のウィジェットIDを解除
584                         $this->gEnv->setCurrentWidgetId('');
585                         
586                         // サブクラスの後処理の呼び出し
587                         if (method_exists($this, '_postBuffer')) $this->_postBuffer($request);
588                         
589                         if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET ||               // ウィジェットの単体表示
590                                 $cmd == M3_REQUEST_CMD_CONFIG_WIDGET ||         // ウィジェット設定のとき
591                                 ($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy))){         // ウィンドウオープンタイプ指定でウィジェット単体実行のとき
592                                 
593                                 // 現在の出力内容を取得し、一旦内容をクリア
594                                 $srcContents = ob_get_contents();
595                                 ob_clean();
596                                 
597                                 // 追加変換処理。HTMLヘッダ出力する。
598                                 $destContents = $this->gPage->lateLaunchWidget($request, $srcContents);
599                                 
600                                 echo $destContents;
601                         }
602                         
603                         // ページ作成終了処理(HTTPヘッダ出力)
604                         $this->gPage->endPage($request);
605
606                         if ($cmd != M3_REQUEST_CMD_RSS){                // 画面出力(RSS配信以外)のとき
607                                 // オプション出力(時間計測等)追加
608                                 echo $this->gPage->getOptionContents($request);
609                         }
610
611                         // バッファ内容を送信(クライアントへの送信完了)
612                         ob_end_flush();
613                 }
614                 if (!defined('M3_STATE_IN_INSTALL')){           // インストールモード以外のとき
615                         // #################### アクセスログ記録 #######################
616                         // DBが使用可能であれば、アクセスログのユーザを登録
617                         if ($this->gEnv->canUseDb()) $this->gAccess->accessLogUser();
618                 }
619
620                 // 終了ログ出力
621                 //$this->gLog->info(__METHOD__, 'フレーム作成終了');
622         }
623         /**
624          * 画面を作成
625          *
626          * @param RequestManager $request               HTTPリクエスト処理クラス
627          * @param string $curTemplate                   テンプレートID
628          * @param string $subTemplateId                 サブページID
629          * @return string                                               画面出力
630          */
631         function _createPage($request, $curTemplate, $subTemplateId = '')
632         {
633                 $defaultIndexFile = 'index.php';                        // テンプレートの起動ファイル
634                 
635                 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);               // 実行コマンドを取得
636                 
637                 // カレントのテンプレートIDを設定
638                 $this->gEnv->setCurrentTemplateId($curTemplate, $subTemplateId);
639
640                 // テンプレート情報を取得
641                 $convType = 0;          // 変換処理タイプ(0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
642                 if ($this->gEnv->getIsMobileSite()){
643                         $convType = -1;         // 携帯サイト用変換
644                 } else {
645                         // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
646                         $convType = $this->gEnv->getCurrentTemplateType();
647                 }
648
649                 // バッファリングの準備
650                 if (method_exists($this, '_prepareBuffer')) $this->_prepareBuffer($request);
651         
652                 // ################### バッファリング開始 ######################
653                 // ob_end_flush()までの出力をバッファリングする
654                 if ($convType == -1){// 携帯用サイトの場合は出力エンコーディングを変更
655                         $mobileEncoding = $this->gEnv->getMobileEncoding();             // 携帯用エンコーディングを取得
656                         mb_http_output($mobileEncoding);
657                         ob_start("mb_output_handler"); // 出力のバッファリング開始
658                 } else {
659                         ob_start();
660                 }
661
662                 // サブクラスの前処理を実行
663                 if (method_exists($this, '_preBuffer')) $this->_preBuffer($request);
664         
665                 if ($convType == 100){          // WordPressテンプレートのとき
666                         // WordPress用定義値
667                         define('WPINC', 'wp-includes');
668                         define('ABSPATH', $this->gEnv->getWordpressRootPath() . '/' );
669                         define('TEMPLATEPATH', $this->gEnv->getTemplatesPath() . '/' . $curTemplate);
670                         define('STYLESHEETPATH', $this->gEnv->getTemplatesPath() . '/' . $curTemplate);         // 子テンプレートを使用している場合は子テンプレートを示す。デフォルトはテンプレートを示す。
671                         define('WP_CONTENT_DIR', ABSPATH . 'wp-content');
672                         define('WP_LANG_DIR', WP_CONTENT_DIR . '/languages');
673                         define('WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins');
674                         define('WP_CONTENT_URL', '/wp-content');                                // 定義自体は必要であるが使用しないのでダミー値で定義
675                         define('WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins');   // 定義自体は必要であるが使用しないのでダミー値で定義
676                         
677                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/load.php');
678                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/default-constants.php');               // デフォルト値取得
679                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/plugin.php');
680 //wp_initial_constants();
681 //wp_set_lang_dir();
682
683                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/functions.php');
684                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/default-filters.php');
685                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/l10n.php');
686                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/class-wp.php');
687                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/class-wp-walker.php');
688                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/class-wp-query.php');
689 //                      require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/class-walker-nav-menu.php');
690 //                      require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/class-wp-dependency.php');
691                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/class-wp-post.php');                   // コンテンツAPIマネージャーからWP_Post型でデータを取得
692
693                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/query.php');
694                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/pluggable.php');
695                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/post.php');
696                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/user.php');
697                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/widgets.php');
698                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/http.php');
699                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/kses.php');
700                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/script-loader.php');
701                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/theme.php');
702                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/template.php');
703                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/link-template.php');
704                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/category-template.php');
705                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/post-template.php');
706                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/post-thumbnail-template.php');
707                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/comment-template.php');
708                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/author-template.php');
709                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/nav-menu-template.php');
710                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/nav-menu.php');
711                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/general-template.php');
712                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/cache.php');
713                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/shortcodes.php');
714                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/formatting.php');
715                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/post-formats.php');
716                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/taxonomy.php');
717                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/media.php');
718                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/embed.php');
719 //                      require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/option.php');
720                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/pomo/translations.php');
721                         require_once($this->gEnv->getWordpressRootPath() . '/wp-includes/pomo/mo.php');
722
723                         // テンプレート内のファイルを読み込む
724                         if ( file_exists(TEMPLATEPATH . '/functions.php')) include(TEMPLATEPATH . '/functions.php');
725                 
726                         // Magic3用インターフェイス
727                         require_once($this->gEnv->getWordpressRootPath() . '/contentApi.php');// コンテンツ取得用API
728                         require_once($this->gEnv->getWordpressRootPath() . '/wpInit.php');              // 初期値設定
729                         
730
731                         // ##### データ初期化 #####
732                         wp_initial_constants();                 // 定義値取得
733                         m3WpInit();                                             // Magic3用インターフェイス初期化。$GLOBALS['m3WpOptions']を初期化し、get_option()はここから使用可能にする。
734
735                         // プラグイン初期化
736                         $GLOBALS['wp_plugin_paths'] = array();                  // $wp_plugin_pathsは未使用?
737                         foreach (wp_get_active_and_valid_plugins() as $plugin) {// プラグインロード
738                                 wp_register_plugin_realpath($plugin);
739                                 include_once($plugin);
740                         }
741                         unset($plugin);
742
743                         // WordPressメインオブジェクト作成
744                         $GLOBALS['locale'] = $this->gEnv->getCurrentLanguage();
745                         $GLOBALS['wp'] = new WP();
746                         $GLOBALS['wp_the_query'] = new WP_Query();
747                         $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
748                         $GLOBALS['gContentApi'] = new contentApi();                     // Magic3コンテンツアクセスクラス
749                         
750                         // 初期処理
751                         do_action('setup_theme');
752                         load_default_textdomain();
753                         do_action('after_setup_theme');
754                         do_action('wp_loaded');
755                         wp();
756                         
757                         // ##### 起動ページを設定 #####
758                         // URLパラメータからコンテンツ形式を取得し、ページを選択
759                         $params = $this->gRequest->getQueryArray();
760                         $paramCount = count($params);
761                         reset($params);
762                         $firstKey = key($params);
763 //                      $firstValue = $params[$firstKey];
764                         
765                         $contentType = $GLOBALS['gContentApi']->getContentType();
766                         switch ($contentType){
767                         case M3_VIEW_TYPE_CONTENT:              // 汎用コンテンツ
768                                 if ($firstKey == M3_REQUEST_PARAM_CONTENT_ID || $firstKey == M3_REQUEST_PARAM_CONTENT_ID_SHORT){        // コンテンツIDのとき
769                                         $defaultIndexFile = get_page_template();                // 固定ページテンプレート
770                                         
771                                         // コンテンツID設定
772                                         $firstValue = $this->gRequest->trimValueOf($firstKey);
773                                         $GLOBALS['gContentApi']->setContentId($firstValue);
774                                 }
775                                 break;
776                         case M3_VIEW_TYPE_PRODUCT:      // 製品
777                                 break;
778                         case M3_VIEW_TYPE_BBS:  // BBS
779                                 break;
780                         case M3_VIEW_TYPE_BLOG: // ブログ
781 //                              if ($firstKey == M3_REQUEST_PARAM_BLOG_ID || $firstKey == M3_REQUEST_PARAM_BLOG_ID_SHORT ||                     // ブログIDのとき
782 //                                      $firstKey == M3_REQUEST_PARAM_BLOG_ENTRY_ID || $firstKey == M3_REQUEST_PARAM_BLOG_ENTRY_ID_SHORT){              // ブログ記事IDのとき
783                                 if ($firstKey == M3_REQUEST_PARAM_BLOG_ENTRY_ID || $firstKey == M3_REQUEST_PARAM_BLOG_ENTRY_ID_SHORT){          // ブログ記事IDのとき
784                                         $defaultIndexFile = get_single_template();              // 記事詳細テンプレート
785                                         
786                                         // コンテンツID設定
787                                         $firstValue = $this->gRequest->trimValueOf($firstKey);
788                                         $GLOBALS['gContentApi']->setContentId($firstValue);
789                                 }
790                                 break;
791                         case M3_VIEW_TYPE_WIKI: // Wiki
792                                 break;
793                         case M3_VIEW_TYPE_USER: // ユーザ作成コンテンツ
794                                 break;
795                         case M3_VIEW_TYPE_EVENT:        // イベント
796                                 break;
797                         case M3_VIEW_TYPE_PHOTO:        // フォトギャラリー
798                                 break;
799                         }
800                 } else if ($convType >= 1){             // Joomla!v1.5,v2.5テンプレートのとき
801                         global $mainframe;
802                         require_once($this->gEnv->getJoomlaRootPath() . '/mosDef.php');// Joomla定義読み込み
803                         require_once($this->gEnv->getJoomlaRootPath() . '/JParameter.php');
804                         require_once($this->gEnv->getJoomlaRootPath() . '/JRender.php');
805                                                 
806                         // 設定ファイルの読み込み
807                         //$params = array();
808                         $paramFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplate . '/params.ini';
809                         if (is_readable($paramFile)){
810                                 $content = file_get_contents($paramFile);
811                                 $params = new JParameter($content);
812                         } else {
813                                 $params = new JParameter();
814                         }
815                         // テンプレートヘッダ画像上のテキスト設定(Joomla!テンプレート2.5以降)
816                         $params->set('siteTitle',               $this->gEnv->getSiteName());            // サイト名
817                         $params->set('siteSlogan',              $this->gSystem->getSiteDef(M3_TB_FIELD_SITE_SLOGAN));           // サイトスローガン
818                         
819                         // Joomla!テンプレート共通の設定
820                         define('_JEXEC', 1);
821                                                 
822                         // Joomla!v1.5用の設定
823                         define('JPATH_BASE', dirname(__FILE__));
824                         define('JPATH_SITE', $this->gEnv->getSystemRootPath());
825                         define('JPATH_PLUGINS', $this->gEnv->getJoomlaRootPath() . '/class/plugins');                   // プラグインパス
826 //                      define('JPATH_THEMES', $this->gEnv->getTemplatesPath());                                                                // テンプレートパス             ## テンプレート内でエラーが発生するのでここでは定義しない(2015/10/13)
827                         define('DS', DIRECTORY_SEPARATOR);
828                         $this->language = $this->gEnv->getCurrentLanguage();
829                         $this->template = $curTemplate;
830                         //$this->baseurl  = $this->gEnv->getRootUrl();
831                         $this->baseurl          = $this->gEnv->getRootUrlByCurrentPage();
832                         $this->direction = 'ltr';
833                         $this->params   = $params;
834                         
835                         // サブテンプレート用の設定
836                         if ($this->gEnv->getCurrentTemplateGenerator() == self::TEMPLATE_GENERATOR_THEMLER){            // Themlerテンプレートの場合はサブテンプレート用のパラメータを設定
837                                 // JRequest経由でレンダー側にサブテンプレートIDを渡す
838                                 if (!empty($subTemplateId)) JRequest::injectSetVar('file_template_name', $subTemplateId);
839
840                                 // サブテンプレートIDの渡し方は以下の方法もある(Themlerテンプレート1.39以降はこちらが有効)
841                                 // サブテンプレートIDを埋め込む
842                                 if (!empty($subTemplateId)) $this->setBuffer('<!--TEMPLATE ' . $subTemplateId . ' /-->', 'component');
843                         }
844                         
845                         // 現在のJoomla!ドキュメントを設定
846                         $this->gEnv->setJoomlaDocument($this);
847                 } else {                        // デフォルト(Joomla!v1.0テンプレート)テンプレートのとき(PC用および携帯用)
848                         // Joomla!テンプレート共通の設定
849                         define('_JEXEC', 1);
850                         
851                         // Joomlaテンプレート用定義
852                         global $mosConfig_absolute_path;
853                         global $mosConfig_live_site;
854                         global $mosConfig_sitename;
855                         global $mosConfig_favicon;
856                         global $mosConfig_sef;
857                         global $cur_template;
858                         global $mainframe;
859                         require_once($this->gEnv->getJoomlaRootPath() . '/mosDef.php');// Joomla定義読み込み
860                         require_once($this->gEnv->getJoomlaRootPath() . '/mosFunc.php');
861                         require_once($this->gEnv->getJoomlaRootPath() . '/includes/sef.php');
862                 }
863
864                 // ################### テンプレート読み込み ###################
865                 // テンプレートのポジションタグからウィジェットが実行される
866                 //$templateIndexFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplate . '/index.php';
867                 $templateIndexFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplate . '/' . $defaultIndexFile;
868                 if (file_exists($templateIndexFile)){
869                         require_once($templateIndexFile);
870                 } else {                // テンプレートが存在しないとき
871                         if ($this->gEnv->isSystemManageUser()){         // システム管理ユーザのとき
872                                 echo 'template not found error: ' . $curTemplate;
873                         } else {
874                                 // 一般向けにはメンテナンス画面を表示
875                                 $this->gPage->setSystemHandleMode(10/*サイト非公開中*/);
876                                 $this->_showSystemPage($request, 2/*サイト非公開画面*/);// システム制御画面を表示
877                                                 
878                                 // 運用ログに記録(一度だけ出力したい)
879                                 //$this->gOpeLog->writeFatal(__METHOD__, 'テンプレートが存在しません。メンテナンス画面を表示します。(テンプレートID=' . $curTemplate . ')', 1100);
880                                 return;
881                         }
882                 }
883
884                 // サブクラスの後処理の呼び出し
885                 if (method_exists($this, '_postBuffer')) $this->_postBuffer($request);
886
887                 // 現在の出力内容を取得し、一旦内容をクリア
888                 $srcContents = ob_get_contents();
889                 ob_clean();
890
891                 // Joomla!タグの変換処理(ウィジェット実行)
892                 if ($convType >= 1){            // Joomla!v1.5,v2.5テンプレートのとき
893                         $srcContents = $this->gPage->launchWidgetByJoomlaTag($srcContents, $convType);
894                 }
895         
896                 // 遅延実行ウィジェットの出力を埋め込む。HTMLヘッダ出力する。
897                 $destContents = $this->gPage->lateLaunchWidget($request, $srcContents);
898
899                 // 携帯インターフェイスのときのときは、手動変換後、バイナリコード(絵文字等)を埋め込む
900                 if ($convType == -1){                   // 携帯アクセスポイントの場合
901                         // 出力するコードに変換
902                         $destContents = mb_convert_encoding($destContents, $mobileEncoding, M3_ENCODING);
903         
904                         // コンテンツ変換メソッドがある場合は実行
905                         if (method_exists($this, '_convContents')){
906                                 $destContents = $this->_convContents($destContents);// 絵文字埋め込み処理等
907                         }
908                 }
909                 
910                 // ##### CSS生成の場合は、すべてのウィジェット実行後出力を削除する #####
911                 if ($cmd == M3_REQUEST_CMD_CSS) $destContents = '';             // CSS生成のとき
912
913                 // ページ作成終了処理(HTTPヘッダ出力)
914                 $destContents .= $this->gPage->endPage($request, true/*出力を取得*/);              // 最終HTMLを追加
915                 if ($this->gPage->isRedirect()) return '';// リダイレクトの場合ob_end_clean()を実行すると、ログインできないことがあるのでここで終了(2011/11/11)
916                 
917                 // バッファを破棄
918                 //ob_end_flush();
919                 ob_end_clean();
920
921                 // 送信データを返す
922                 return $destContents;
923         }
924         /**
925          * テンプレートを決定
926          *
927          * @param RequestManager $request       HTTPリクエスト処理クラス
928          * @param string $subTemplateId         テンプレートIDが取得できるときはサブページIDが返る
929          * @return string                                       テンプレート名
930          */
931         function _defineTemplate($request, &$subTemplateId)
932         {
933                 // ########### テンプレートID(ディレクトリ名)を設定 ############
934                 // テンプレートIDの指定の方法は2パターン
935                 //  1.サブクラスで固定に指定
936                 //  2.コンテンツからの指定
937                 //  3.セッションに保持
938                 // テンプレートIDの優先順位
939                 //  1.サブクラスの_setTemplate()で固定設定にしている場合の固定値
940                 //  2.セッションに持っている値
941                 //  3.DBのデフォルト値
942                 $curTemplate = '';
943                 $subTemplateId = '';
944                 $isSystemManageUser = $this->gEnv->isSystemManageUser();                // システム運用可能かどうか
945                 $useSubClassDefine = true;                      // サブクラスでの定義を使用するかどうか
946                 
947                 // テンプレート変更のときは、セッションのテンプレートIDを変更
948                 $cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);               // 実行コマンドを取得
949                 if ($cmd == M3_REQUEST_CMD_CHANGE_TEMPLATE){
950                         // テンプレートIDをセッションに残す場合
951                         if ($this->gSystem->useTemplateIdInSession()){          // セッションに保存する場合
952                                 $request->setSessionValue(M3_SESSION_CURRENT_TEMPLATE, $request->trimValueOf(M3_SYSTEM_TAG_CHANGE_TEMPLATE));
953                         }
954                 }
955
956                 // サブクラスでテンプレートIDを指定している場合はそちらを使用
957                 $templateDefined = false;               // テンプレート固定かどうか
958                 if ($useSubClassDefine){
959                         $tmplStr = trim($this->_setTemplate($request));
960                         if (strlen($tmplStr) > 0){
961                                 $curTemplate = $tmplStr;
962                                 $templateDefined = true;                // テンプレート固定かどうか
963                         }
964                 }
965
966                 // セッションにあるときは、セッションの値を使用(携帯でないとき)
967                 $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
968                 if (empty($curTemplate)){
969                         if ($cmd == M3_REQUEST_CMD_SHOW_POSITION ||                             // 表示位置を表示するとき
970                                 $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){      // 表示位置を表示するとき(ウィジェット付き)
971                                 // URLの引数として、ページIDとページサブIDが指定されてくる
972                                 // URLの引数のテンプレートを優先し、引数で指定されていなければ、ページ用個別のテンプレートを取得する
973                                 
974                                 // URLの引数でテンプレートIDが指定されている場合は設定
975                                 $templateId = $request->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID);              // テンプレートIDを取得
976                                 if (!empty($templateId)) $curTemplate = $templateId;
977                                         
978                                 // ページ用個別に設定されたテンプレートがある場合は取得
979                                 if (empty($curTemplate)){
980                                         $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
981                                         $line = $this->gPage->getPageInfo($pageId, $pageSubId);
982                                         if (!empty($line)){
983                                                 $pageTemplateId = $line['pn_template_id'];
984                                                 $subTemplateId = $line['pn_sub_template_id'];           // サブテンプレートID
985                                         }
986                                         if (!empty($pageTemplateId)) $curTemplate = $pageTemplateId;
987                                 }
988                                 
989                                 // 取得できなければデフォルトを取得
990                                 if (empty($curTemplate)){
991                                         if ($pageId == $this->gEnv->getDefaultPageId()){                // 通常サイトのとき
992                                                 $curTemplate = $this->gSystem->defaultTemplateId();
993                                                 $subTemplateId = $this->gSystem->defaultSubTemplateId();
994                                         } else if ($pageId == $this->gEnv->getDefaultMobilePageId()){           // 携帯サイトのとき
995                                                 $curTemplate = $this->gSystem->defaultMobileTemplateId();               // 携帯用デフォルトテンプレート
996                                         } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){               // スマートフォン用サイトのとき
997                                                 $curTemplate = $this->gSystem->defaultSmartphoneTemplateId();           // スマートフォン用デフォルトテンプレート
998                                         } else if ($pageId == $this->gEnv->getDefaultAdminPageId() ||           // 管理サイトのとき
999                                                                 $pageId == $this->gEnv->getDefaultRegistPageId()){              // 登録サイトのとき
1000                                                 $curTemplate = $this->gSystem->defaultAdminTemplateId();
1001                                         } else if (empty($pageId)){                     // ページIDが指定されていないときは、ウィジェットを表示しないテンプレートのみの表示
1002                                                 // URLの引数でテンプレートIDが指定されている場合は設定
1003         //                                      $templateId = $request->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID);              // テンプレートIDを取得
1004         //                                      if (!empty($templateId)) $curTemplate = $templateId;
1005                                         }
1006                                 }
1007                         } else {
1008                                 // ページ用のテンプレートがあるときは優先
1009                                 $pageTemplateId = $this->gPage->getTemplateIdFromCurrentPageInfo($subTemplateId);
1010                                 if (!empty($pageTemplateId)) $curTemplate = $pageTemplateId;
1011
1012                                 // テンプレートIDをセッションから取得
1013                                 if (empty($curTemplate) && !$isSystemManageUser){                       // システム運用者はセッション値を使用できない
1014                                         if ($this->gSystem->useTemplateIdInSession()){          // セッションに保存する場合
1015                                                 if (!$this->gEnv->getIsMobileSite() && !$this->gEnv->getIsSmartphoneSite()){
1016                                                         $curTemplate = $request->getSessionValue(M3_SESSION_CURRENT_TEMPLATE);// 携帯サイト、スマートフォンサイトでないときはセッション値を取得
1017                                                 }
1018                                         }
1019                                 }
1020                                 
1021                                 // オプションのテンプレートがある場合はオプションを優先
1022                                 $optionTemplate = $this->gPage->getOptionTemplateId();
1023                                 if (!empty($optionTemplate)){
1024                                         $curTemplate = $optionTemplate;
1025                                         $templateDefined = true;                // テンプレート固定かどうか
1026                                 }
1027                                 
1028                                 // セッションにないときはデフォルトを取得
1029                                 if (empty($curTemplate)){
1030                                         if ($this->gEnv->getIsMobileSite()){// 携帯用サイトの場合
1031                                                 $curTemplate = $this->gSystem->defaultMobileTemplateId();               // 携帯用デフォルトテンプレート
1032                                         } else if ($this->gEnv->getIsSmartphoneSite()){// スマートフォン用サイトの場合
1033                                                 $curTemplate = $this->gSystem->defaultSmartphoneTemplateId();           // スマートフォン用デフォルトテンプレート
1034                                         } else {
1035                                                 $curTemplate = $this->gSystem->defaultTemplateId();
1036                                                 $subTemplateId = $this->gSystem->defaultSubTemplateId();
1037                                         }
1038                                 }
1039                         }
1040                 }
1041
1042                 if (empty($curTemplate)){
1043                         // テンプレートが1つもみつからないときは、管理用テンプレートを使用
1044                         $curTemplate = $this->gSystem->defaultAdminTemplateId();
1045                         echo 'template not found. viewing by administration template. [' . $curTemplate . ']';
1046                 } else {        // セッションにテンプレートIDを保存
1047                         // テンプレートIDをセッションに残す場合
1048 /*                      if ($this->gSystem->useTemplateIdInSession()){          // セッションに保存する場合
1049                                 if ($cmd == M3_REQUEST_CMD_SHOW_POSITION ||                             // 表示位置を表示するとき
1050                                         $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){      // 表示位置を表示するとき(ウィジェット付き)
1051                                 } else {
1052                                         if (!$this->gEnv->getIsMobileSite() && !$this->gEnv->getIsSmartphoneSite() && !$templateDefined){               // PC用画面でサブクラス固定でないとき場合は保存
1053                                                 $request->setSessionValue(M3_SESSION_CURRENT_TEMPLATE, $curTemplate);
1054                                         }
1055                                 }
1056                         }*/
1057                 }
1058                 return $curTemplate;
1059         }
1060         /**
1061          * サイト公開制御
1062          *
1063          * @param RequestManager $request               HTTPリクエスト処理クラス
1064          * @return bool                                                 サイトにアクセスできるかどうか
1065          */
1066         function _accessSite($request)
1067         {
1068                 // サイトの公開状況を取得
1069                 $isOpen = $this->gSystem->siteInPublic();
1070                 if ($isOpen){
1071                         // PC用サイト、携帯用サイト、スマートフォン用サイトの公開状況をチェック
1072                         if ($this->gEnv->getIsPcSite()){
1073                                 if ($this->gSystem->sitePcInPublic()) return true;
1074                         } else if ($this->gEnv->getIsMobileSite()){
1075                                 if ($this->gSystem->siteMobileInPublic()) return true;
1076                         } else if ($this->gEnv->getIsSmartphoneSite()){
1077                                 if ($this->gSystem->siteSmartphoneInPublic()) return true;
1078                         }
1079                         return false;
1080                 } else {
1081                         // 例外とするIPアドレスをチェック
1082                         $ip = $this->gSystem->getSystemConfig(self::SITE_ACCESS_EXCEPTION_IP);
1083                         if (!empty($ip) && $ip = $request->trimServerValueOf('REMOTE_ADDR')){
1084                                 return true;
1085                         } else {
1086                                 return false;
1087                         }
1088                 }
1089         }
1090         /**
1091          * システム制御画面表示
1092          *
1093          * @param RequestManager $request               HTTPリクエスト処理クラス
1094          * @param int $type                                             画面タイプ(0=アクセス不可、1=ログイン画面、2=サイト非公開画面)
1095          * @return なし
1096          */
1097         function _showSystemPage($request, $type)
1098         {
1099                 // ページIDを設定
1100                 $pageId = 'admin_index';                // 管理画面を表示
1101                 $this->gEnv->setCurrentPageId($pageId);                                                         // ここでデフォルトページサブIDが再設定される
1102                 $this->gEnv->setCurrentPageSubId($this->gEnv->getDefaultPageSubId());// デフォルトページサブIDをカレントにする
1103                 
1104                 // テンプレートの設定
1105                 // DBで設定されている値を取得し、なければ管理用デフォルトテンプレートを使用
1106                 if ($this->gEnv->getIsMobileSite()){            // 携帯用サイトのアクセスの場合
1107                         $curTemplateId = self::M_ADMIN_TEMPLATE;        // 携帯管理画面用テンプレート
1108                 } else {                        // 携帯以外のサイトへのアクセスの場合
1109                         if ($type == 1){                        // ログインはデフォルトの管理画面テンプレートに固定
1110                                 $curTemplateId = $this->gSystem->defaultAdminTemplateId();
1111                         } else {
1112                                 $curTemplateId = $this->gSystem->getSystemConfig(self::CONFIG_KEY_MSG_TEMPLATE);
1113                                 if (empty($curTemplateId)){
1114                                         $curTemplateId = self::SYSTEM_TEMPLATE;// システム画面用テンプレート
1115                                 } else {
1116                                         // テンプレートの存在チェック
1117                                         $templateIndexFile = $this->gEnv->getTemplatesPath() . '/' . $curTemplateId . '/index.php';
1118                                         if (!file_exists($templateIndexFile)) $curTemplateId = self::SYSTEM_TEMPLATE;// システム画面用テンプレート
1119                                 }
1120                         }
1121                 }
1122
1123                 // 画面を作成
1124                 $pageData = $this->_createPage($request, $curTemplateId);
1125                 echo $pageData;
1126         }
1127         /**
1128          * phpinfo画面表示
1129          *
1130          * @param RequestManager $request               HTTPリクエスト処理クラス
1131          * @return なし
1132          */
1133         function _showPhpinfoPage($request)
1134         {
1135                 // ################### バッファリング開始 ######################
1136                 // ob_end_flush()までの出力をバッファリングする
1137                 ob_start();
1138                 
1139                 phpinfo();
1140                 
1141                 // バッファ内容を送信(クライアントへの送信完了)
1142                 ob_end_flush();
1143         }
1144         /**
1145          * 以下、Joomla!v1.5テンプレート専用
1146          */
1147         /**
1148          * ウィジェット数を取得
1149          *
1150          * @param string $pos           ポジション
1151          * @return int                          ウィジェット数
1152          */
1153         function countModules($pos)
1154         {
1155                 $count = $this->gPage->getWidgetsCount($pos);
1156                 return $count;
1157         }
1158         function getBuffer($type = null, $name = null, $attribs = array())
1159         {
1160                 if (isset($this->joomlaBufArray[$type])){
1161                         return $this->joomlaBufArray[$type];
1162                 } else {
1163                         return '';
1164                 }
1165         }
1166         function setBuffer($contents, $type, $name = null)
1167         {
1168                 $this->joomlaBufArray[$type] = $contents;
1169                 return;
1170         }
1171         /**
1172          * 出力タイプ取得
1173          *
1174          * @return string                               出力タイプ
1175          */
1176         function getType()
1177         {
1178                 return 'html';
1179         }
1180         /**
1181          * HTMLヘッダ情報取得
1182          *
1183          * @return array                                ヘッダ情報
1184          */
1185         function getHeadData()
1186         {
1187                 $data = array();
1188                 /*$data['title']                = $this->title;
1189                 $data['description']= $this->description;
1190                 $data['link']           = $this->link;
1191                 $data['metaTags']       = $this->_metaTags;
1192                 $data['links']          = $this->_links;
1193                 $data['styleSheets']= $this->_styleSheets;
1194                 $data['style']          = $this->_style;
1195                 $data['scripts']        = $this->_scripts;
1196                 $data['script']         = $this->_script;
1197                 $data['custom']         = $this->_custom;*/
1198                 return $data;
1199         }
1200         /**
1201          * BASEタグ設定用
1202          *
1203          * @return string                               ベースパス
1204          */
1205         function getBase()
1206         {
1207                 return '';
1208         }
1209          /**
1210          * Adds a linked script to the page
1211          *
1212          * @param       string  $url            URL to the linked script
1213          * @param       string  $type           Type of script. Defaults to 'text/javascript'
1214          * @access   public
1215          */
1216         function addScript($url, $type="text/javascript") {
1217                 $this->_scripts[$url] = $type;
1218         }
1219         /**
1220          * Adds a script to the page
1221          *
1222          * @access   public
1223          * @param       string  $content   Script
1224          * @param       string  $type   Scripting mime (defaults to 'text/javascript')
1225          * @return   void
1226          */
1227         function addScriptDeclaration($content, $type = 'text/javascript')
1228         {
1229                 if (!isset($this->_script[strtolower($type)])) {
1230                         $this->_script[strtolower($type)] = $content;
1231                 } else {
1232                         $this->_script[strtolower($type)] .= chr(13).$content;
1233                 }
1234         }
1235 }
1236 ?>