OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / include / manager / launchManager.php
1 <?php
2 /**
3  * 起動制御マネージャー
4  *
5  * コンテナ(フレームコンテナ、ウィジェットコンテナ、ウィジェット内サブコンテナ)の起動を行う。
6  * このマネージャーでユーザのアクセス制御は行わない。
7  *
8  * PHP versions 5
9  *
10  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
11  *
12  * @package    Magic3 Framework
13  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
14  * @copyright  Copyright 2006-2010 Magic3 Project.
15  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
16  * @version    SVN: $Id: launchManager.php 4964 2012-06-13 12:22:28Z fishbone $
17  * @link       http://www.magic3.org
18  */
19 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
20
21 class LaunchManager extends Core
22 {
23         const DEFAULT_RSS_CLASS_PREFIX = 'rss_';                // RSS実行用クラスの先頭文字列
24         
25         /**
26          * コンストラクタ
27          */
28         function __construct()
29         {
30                 // 親クラスを呼び出す
31                 parent::__construct();
32         }
33
34         /**
35          * プログラムを実行
36          *
37          * @param string $filepath              呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
38          */
39         function go($filepath = '')
40         {
41                 global $gEnvManager;
42                 global $gRequestManager;
43
44                 // ルートから$filepathへの相対パスで「FrameContainer.php」の先頭につける
45                 // サフィックスを作成する
46                 // 例) 相対パスが「admin/index.php」のとき「admin_index」
47                 if ($filepath == ''){
48                         $basename = basename($_SERVER["PHP_SELF"], '.php');
49                 } else {
50                         // ルートまでのパスを削除
51                         $path = str_replace(M3_SYSTEM_ROOT_PATH, '', $filepath);
52                         $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
53                         $path = trim($path, '/');
54                         //$pathArray = split('/', $path);
55                         $pathArray = explode('/', $path);
56                         $basename = '';
57                         for ($i = 0; $i < count($pathArray); $i++){
58                                 if ($i == 0){
59                                         $basename .= $pathArray[$i];
60                                 } else {
61                                         //$basename .= ucfirst($pathArray[$i]);
62                                         $basename .= ('_' . $pathArray[$i]);
63                                 }
64                         }
65                         $basename = basename($basename, '.php');
66                 }
67                 
68                 // PC用URLかどうかを設定(管理画面はPC用URLとしない)
69                 $isPcSite = true;
70                 if (strStartsWith($basename, 'admin_')) $isPcSite = false;
71                 $gEnvManager->setIsPcSite($isPcSite);
72                 
73                 // サーバ接続かどうかを設定
74                 if ($basename == basename(M3_FILENAME_SERVER_CONNECTOR, '.php')) $gEnvManager->setIsServerConnector(true);
75                 
76                 // ページIDを設定
77                 $gEnvManager->setCurrentPageId($basename);
78
79                 // アクセスポイントを設定
80                 $gEnvManager->setAccessPath(str_replace('_', '/', $basename));
81                 
82                 // ファイル名から、コンテナクラスファイル取り込み
83                 require_once($gEnvManager->getContainerPath() . '/' . $basename . 'FrameContainer.php');
84                 
85                 // コンテナクラスを起動
86                 $class = $basename . 'FrameContainer';
87                 $mainContainer = new $class();
88                 $mainContainer->process($gRequestManager);
89         }
90         /**
91          * ウィジェットプログラムを実行
92          *
93          * @param string $filepath              呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
94          */
95         function goWidget($filepath)
96         {
97                 global $gEnvManager;
98                 global $gRequestManager;
99                 static $pathArray = array();            // 呼び出し元を保存する
100
101                 // 実行コマンドを取得
102                 $cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
103                 
104                 $basename = basename($filepath, '.php');
105                 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
106                 
107                 // このメソッドにアクセスしたウィジェットのパスをみて、管理画面へのアクセスかどうかを判断
108                 $pathArray = explode(DIRECTORY_SEPARATOR, $filepath);
109                 $pathCount = count($pathArray);
110                 $accessAdmin = false;
111                 
112                 // ウィジェットの種別を設定
113                 $gEnvManager->setIsSubWidget(false);                    // 通常ウィジェットで起動
114                 
115                 if ($gEnvManager->getIsMobileSite()){           // 携帯サイトへのアクセスのとき
116                         // 管理画面へのアクセスかどうかチェック
117                         if ($pathArray[$pathCount -2] == 'admin' && $pathArray[$pathCount -3] == $widgetId){
118                                 $accessAdmin = true;
119                         }
120                         // 携帯用ウィジェットのウィジェットIDは、「m/xxxxxx」の形式
121                         // ウィジェットIDを変換
122                         $widgetId = str_replace('/', '_', $widgetId);
123                         
124                         // コンテナクラス名作成
125                         if ($cmd == M3_REQUEST_CMD_RSS){                // RSS配信のとき
126                                 $containerClass = self::DEFAULT_RSS_CLASS_PREFIX . $widgetId . 'WidgetContainer';               // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
127                                 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
128                         } else if ($accessAdmin){
129                                 $containerClass = 'admin_' . $widgetId . 'WidgetContainer';             // デフォルトで起動するコンテナクラス名「admin_ + ウィジェットID + WidgetContainer」
130                         } else {
131                                 $containerClass = $widgetId . 'WidgetContainer';                // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
132                                 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
133                         }
134                         if (file_exists($containerPath)){
135                                 require_once($containerPath);
136                         } else {
137                                 echo 'file not found error: ' . $containerPath;
138                         }
139                         // コンテナクラスを起動
140                         $widgetContainer = new $containerClass();
141                         $widgetContainer->process($gRequestManager);
142                 } else {                        // PC用の画面からのアクセスまたは管理画面へのアクセス
143                         // インナーウィジェットのチェック
144                         $isIWidget = false;
145                         if ($pathArray[$pathCount -4] == 'iwidgets' && $pathArray[$pathCount -2] == 'admin'){           // インナーウィジェット管理者画面
146                                 $isIWidget = true;
147                                 $widgetId = $pathArray[$pathCount -3];          // インナーウィジェットID
148                                 $accessAdmin = true;
149                         } else if ($pathArray[$pathCount -3] == 'iwidgets'){    // インナーウィジェット通常画面
150                                 $isIWidget = true;
151                                 $widgetId = $pathArray[$pathCount -2];// インナーウィジェットID
152                         } else if ($pathArray[$pathCount -3] == $widgetId && $pathArray[$pathCount -2] == 'admin'){             // PC用ウィジェット管理画面
153                                 $accessAdmin = true;
154                         } else if ($pathArray[$pathCount -4] . '/' . $pathArray[$pathCount -3] == $widgetId && $pathArray[$pathCount -2] == 'admin'){           // 携帯用ウィジェット管理画面
155                                 $accessAdmin = true;
156                         }
157                         // コンテナクラス名作成
158                         if ($cmd == M3_REQUEST_CMD_RSS){                // RSS配信のとき
159                                 $containerClass = self::DEFAULT_RSS_CLASS_PREFIX . $widgetId . 'WidgetContainer';               // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
160                         } else if ($accessAdmin){
161                                 $containerClass = 'admin_' . $widgetId . 'WidgetContainer';             // デフォルトで起動するコンテナクラス名「admin_ + ウィジェットID + WidgetContainer」
162                         } else {
163                                 $containerClass = $widgetId . 'WidgetContainer';                // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
164                         }
165                         // コンテナクラス名修正
166                         $containerClass = str_replace('/', '_', $containerClass);
167                                         
168                         // コンテナクラスが既にロードされているときはエラー
169                         // 同じウィジェットが2回以上実行される可能性があるので、ウィジェットIDが同じであればエラーとしない
170                         if (class_exists($containerClass)){
171                                 // 既に起動済みのウィジェットかどうかチェック
172                                 //if (in_array($filepath, $pathArray)){
173                                         // 同じウィジェットの場合は起動
174                                         $widgetContainer = new $containerClass();
175                                         $widgetContainer->process($gRequestManager);
176         //                      } else {
177         //                              // 同じウィジェットが起動されていないときは、クラス名のバッテイングでエラー
178         //                              echo 'class redefined error: ' . $containerClass;
179         //                      }
180                         } else {
181                                 // ウィジェットのコンテナクラスファイルを読み込み
182                                 if ($isIWidget){                // インナーウィジェットの場合
183                                         if ($accessAdmin){
184                                                 $containerPath = dirname(dirname($filepath)) . '/include/container/' . $containerClass . '.php';
185                                         } else {
186                                                 $containerPath = dirname($filepath) . '/include/container/' . $containerClass . '.php';
187                                         }
188                                 } else {
189                                         $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
190                                 }
191                                 if (file_exists($containerPath)){
192                                         require_once($containerPath);
193                                 } else {
194                                         echo 'file not found error: ' . $containerPath;
195                                 }
196                                 // コンテナクラスを起動
197                                 $widgetContainer = new $containerClass();
198                                 $widgetContainer->process($gRequestManager);
199                         }
200                         // 呼び出し元ファイルパスの保存
201                         $pathArray[] = $filepath;
202                 }
203         }
204         /**
205          * ウィジェットプログラム(サブ)を実行
206          *
207          * @param string $task          タスク名
208          * @param bool $isAdmin         管理者機能(adminディレクトリ以下)かどうか
209          * @param string $defaultWidgetId       カレントウィジェットの実行クラスが取得できない場合のデフォルトウィジェットID
210          * @return なし
211          */
212         function goSubWidget($task, $isAdmin = false, $defaultWidgetId = '')
213         {
214                 global $gEnvManager;
215                 global $gRequestManager;
216                 
217                 // ウィジェットの種別を設定
218                 $gEnvManager->setIsSubWidget(true);                     // サブウィジェットで起動
219                 
220                 // コンテナクラス名作成
221                 // フォーマット: [ウィジェットID][タスク名]WidgetContainer
222                 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
223                 $containerClass = '';
224                 if ($isAdmin) $containerClass .= 'admin_';
225                 $containerClass .= $widgetId . ucfirst($task) . 'WidgetContainer';
226
227                 // コンテナクラス名修正
228                 $containerClass = str_replace('/', '_', $containerClass);
229                 
230                 // コンテナクラスが既にロードされているときはエラー
231                 if (class_exists($containerClass)){
232                         echo 'class redefined error2: ' . $containerClass;
233                 } else {
234                         // コンテナクラスファイル取り込み
235                         $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';        // カレントウィジェットのコンテナクラス
236                         if (file_exists($containerPath)){
237                                 require_once($containerPath);
238                                 
239                                 // コンテナクラスを起動
240                                 $widgetContainer = new $containerClass();
241                                 $widgetContainer->process($gRequestManager);
242                         } else {
243                                 if (empty($defaultWidgetId)){
244                                         echo 'file not found error: ' . $containerPath;
245                                 } else {                // デフォルトのウィジェットIDが指定されている場合はデフォルトウィジェットIDで実行
246                                         // コンテナクラス名作成
247                                         $containerClass = '';
248                                         if ($isAdmin) $containerClass .= 'admin_';
249                                         $containerClass .= $defaultWidgetId . ucfirst($task) . 'WidgetContainer';
250
251                                         // コンテナクラス名修正
252                                         $containerClass = str_replace('/', '_', $containerClass);
253                                         
254                                         // コンテナクラスが既にロードされているときはエラー
255                                         if (class_exists($containerClass)){
256                                                 echo 'class redefined error3: ' . $containerClass;
257                                         } else {
258                                                 // コンテナクラスファイル取り込み
259                                                 $containerPath = $gEnvManager->getWidgetsPath() . '/' . $defaultWidgetId . '/include/container/' . $containerClass . '.php';
260                                                 if (file_exists($containerPath)){
261                                                         require_once($containerPath);
262                                 
263                                                         // コンテナクラスを起動
264                                                         $widgetContainer = new $containerClass();
265                                                         $widgetContainer->process($gRequestManager);
266                                                 } else {
267                                                         echo 'file not found error: ' . $containerPath;
268                                                 }
269                                         }
270                                 }
271                         }
272                 }
273         }
274         /**
275          * ウィジェットインストーラ、アンインストーラを実行
276          *
277          * @param int $install                                  インストール種別(0=インストール、1=アンインストール、2=アップデート)
278          */
279         function goInstallWidget($install)
280         {
281                 global $gEnvManager;
282                 global $gRequestManager;
283                 
284                 // コンテナクラス名作成
285                 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
286                 $containerClass = 'admin_';
287                 $containerClass .= $widgetId . 'InstallWidgetContainer';
288
289                 // コンテナクラス名修正
290                 $containerClass = str_replace('/', '_', $containerClass);
291                 
292                 // コンテナクラスが既にロードされているときはエラー
293                 if (class_exists($containerClass)){
294                         echo 'class redefined error3: ' . $containerClass;
295                 } else {
296                         // コンテナクラスファイル取り込み
297                         $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
298                         if (file_exists($containerPath)){
299                                 require_once($containerPath);
300                         } else {                // インストーラが存在しないときは終了
301                                 return;
302                         }
303                         // コンテナクラスを起動
304                         $widgetContainer = new $containerClass();
305                         $widgetContainer->process($gRequestManager, $install);
306                 }
307         }
308         /**
309          * 携帯用プログラムを実行
310          *
311          * @param string $filepath              呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
312          * @return                                              なし
313          */
314         function goMobile($filepath = '')
315         {
316                 $this->_goDevice(1/*携帯用*/, $filepath);
317         }
318         /**
319          * スマートフォン用プログラムを実行
320          *
321          * @param string $filepath              呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
322          * @return                                              なし
323          */
324         function goSmartphone($filepath = '')
325         {
326                 $this->_goDevice(2/*スマートフォン用*/, $filepath);
327         }
328         /**
329          * 各種デバイス用プログラムを実行
330          *
331          * @param int $type                             1=携帯用プログラム、2=スマートフォン用プログラム
332          * @param string $filepath              呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
333          * @return                                              なし
334          */
335         function _goDevice($type, $filepath)
336         {
337                 global $gEnvManager;
338                 global $gRequestManager;
339
340                 switch ($type){
341                         case 1:
342                                 // 携帯用URLへのアクセスを設定
343                                 $gEnvManager->setIsMobileSite(true);
344                                 break;
345                         case 2:
346                                 // スマートフォン用URLのアクセスを設定
347                                 $gEnvManager->setIsSmartphoneSite(true);
348                                 break;
349                 }
350                 
351                 // ルートから$filepathへの相対パスで「FrameContainer.php」の先頭につける
352                 // サフィックスを作成する
353                 // 例) 相対パスが「admin/index.php」のとき「admin_index」
354                 if ($filepath == ''){
355                         $basename = basename($_SERVER["PHP_SELF"], '.php');
356                 } else {
357                         // ルートまでのパスを削除
358                         $path = str_replace(M3_SYSTEM_ROOT_PATH, '', $filepath);
359                         $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
360                         $path = trim($path, '/');
361                         $pathArray = explode('/', $path);
362                         $basename = '';
363                         for ($i = 0; $i < count($pathArray); $i++){
364                                 if ($i == 0){
365                                         $basename .= $pathArray[$i];
366                                 } else {
367                                         //$basename .= ucfirst($pathArray[$i]);
368                                         $basename .= ('_' . $pathArray[$i]);
369                                 }
370                         }
371                         $basename = basename($basename, '.php');
372                 }
373                 
374                 // ページIDを設定
375                 $gEnvManager->setCurrentPageId($basename);
376
377                 // アクセスポイントを設定
378                 $gEnvManager->setAccessPath(str_replace('_', '/', $basename));
379                 
380                 // ファイル名から、コンテナクラスファイル取り込み
381                 require_once($gEnvManager->getContainerPath() . '/' . $basename . 'FrameContainer.php');
382                 
383                 // コンテナクラスを起動
384                 $class = $basename . 'FrameContainer';
385                 $mainContainer = new $class();
386                 $mainContainer->process($gRequestManager);
387         }
388 }
389 ?>