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