5 * コンテナ(フレームコンテナ、ウィジェットコンテナ、ウィジェット内サブコンテナ)の起動を行う。
6 * このマネージャーでユーザのアクセス制御は行わない。
10 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
12 * @package Magic3 Framework
13 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
14 * @copyright Copyright 2006-2016 Magic3 Project.
15 * @license http://www.gnu.org/copyleft/gpl.html GPL License
17 * @link http://www.magic3.org
19 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
21 class LaunchManager extends Core
23 private $loadPath; // クラス検索ロード用のパス
24 const DEFAULT_RSS_CLASS_PREFIX = 'rss_'; // RSS実行用クラスの先頭文字列
29 function __construct()
32 parent::__construct();
34 $this->loadPath = array(); // クラス検索ロード用のパス
40 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
42 function go($filepath = '')
45 global $gRequestManager;
47 // ルートから$filepathへの相対パスで「FrameContainer.php」の先頭につける
49 // 例) 相対パスが「admin/index.php」のとき「admin_index」
51 $basename = basename($_SERVER["PHP_SELF"], '.php');
54 $path = str_replace(M3_SYSTEM_ROOT_PATH, '', $filepath);
55 $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
56 $path = trim($path, '/');
57 //$pathArray = split('/', $path);
58 $pathArray = explode('/', $path);
60 for ($i = 0; $i < count($pathArray); $i++){
62 $basename .= $pathArray[$i];
64 //$basename .= ucfirst($pathArray[$i]);
65 $basename .= ('_' . $pathArray[$i]);
68 $basename = basename($basename, '.php');
71 // PC用URLかどうかを設定(管理画面はPC用URLとしない)
73 if (strStartsWith($basename, 'admin_')) $isPcSite = false;
74 $gEnvManager->setIsPcSite($isPcSite);
77 if ($basename == basename(M3_FILENAME_SERVER_CONNECTOR, '.php')) $gEnvManager->setIsServerConnector(true);
80 $gEnvManager->setCurrentPageId($basename);
83 $gEnvManager->setAccessPath(str_replace('_', '/', $basename));
85 // ファイル名から、コンテナクラスファイル取り込み
86 require_once($gEnvManager->getContainerPath() . '/' . $basename . 'FrameContainer.php');
89 $class = $basename . 'FrameContainer';
90 $mainContainer = new $class();
91 $mainContainer->process($gRequestManager);
96 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
98 function goWidget($filepath)
101 global $gRequestManager;
102 static $pathArray = array(); // 呼び出し元を保存する
105 $cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
107 $basename = basename($filepath, '.php');
108 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
110 // このメソッドにアクセスしたウィジェットのパスをみて、管理画面へのアクセスかどうかを判断
111 $pathArray = explode(DIRECTORY_SEPARATOR, $filepath);
112 $pathCount = count($pathArray);
113 $accessAdmin = false;
116 $gEnvManager->setIsSubWidget(false); // 通常ウィジェットで起動
118 if ($gEnvManager->getIsMobileSite()){ // 携帯サイトへのアクセスのとき
119 // 管理画面へのアクセスかどうかチェック
120 if ($pathArray[$pathCount -2] == 'admin' && $pathArray[$pathCount -3] == $widgetId){
123 // 携帯用ウィジェットのウィジェットIDは、「m/xxxxxx」の形式
125 $widgetId = str_replace('/', '_', $widgetId);
128 if ($cmd == M3_REQUEST_CMD_RSS){ // RSS配信のとき
129 $containerClass = self::DEFAULT_RSS_CLASS_PREFIX . $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
130 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
131 } else if ($accessAdmin){
132 $containerClass = 'admin_' . $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「admin_ + ウィジェットID + WidgetContainer」
134 $containerClass = $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
135 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
137 if (file_exists($containerPath)){
138 require_once($containerPath);
140 echo 'file not found error: ' . $containerPath;
143 $widgetContainer = new $containerClass();
144 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
145 $widgetContainer->process($gRequestManager);
146 $gEnvManager->setCurrentWidgetObj(null);
147 } else { // PC用の画面からのアクセスまたは管理画面へのアクセス
150 if ($pathArray[$pathCount -4] == 'iwidgets' && $pathArray[$pathCount -2] == 'admin'){ // インナーウィジェット管理者画面
152 $widgetId = $pathArray[$pathCount -3]; // インナーウィジェットID
154 } else if ($pathArray[$pathCount -3] == 'iwidgets'){ // インナーウィジェット通常画面
156 $widgetId = $pathArray[$pathCount -2];// インナーウィジェットID
157 } else if ($pathArray[$pathCount -3] == $widgetId && $pathArray[$pathCount -2] == 'admin'){ // PC用ウィジェット管理画面
159 } else if ($pathArray[$pathCount -4] . '/' . $pathArray[$pathCount -3] == $widgetId && $pathArray[$pathCount -2] == 'admin'){ // 携帯用ウィジェット管理画面
163 if ($cmd == M3_REQUEST_CMD_RSS){ // RSS配信のとき
164 $containerClass = self::DEFAULT_RSS_CLASS_PREFIX . $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
165 } else if ($accessAdmin){
166 $containerClass = 'admin_' . $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「admin_ + ウィジェットID + WidgetContainer」
168 $containerClass = $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
171 $containerClass = str_replace('/', '_', $containerClass);
173 // コンテナクラスが既にロードされているときはエラー
174 // 同じウィジェットが2回以上実行される可能性があるので、ウィジェットIDが同じであればエラーとしない
175 if (class_exists($containerClass)){
176 // 既に起動済みのウィジェットかどうかチェック
177 //if (in_array($filepath, $pathArray)){
179 $widgetContainer = new $containerClass();
180 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
181 $widgetContainer->process($gRequestManager);
182 $gEnvManager->setCurrentWidgetObj(null);
184 // // 同じウィジェットが起動されていないときは、クラス名のバッテイングでエラー
185 // echo 'class redefined error: ' . $containerClass;
188 // ウィジェットのコンテナクラスファイルを読み込み
189 if ($isIWidget){ // インナーウィジェットの場合
191 $containerPath = dirname(dirname($filepath)) . '/include/container/' . $containerClass . '.php';
193 $containerPath = dirname($filepath) . '/include/container/' . $containerClass . '.php';
196 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
198 if (file_exists($containerPath)){
199 require_once($containerPath);
201 echo 'file not found error: ' . $containerPath;
204 $widgetContainer = new $containerClass();
205 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
206 $widgetContainer->process($gRequestManager);
207 $gEnvManager->setCurrentWidgetObj(null);
210 $pathArray[] = $filepath;
216 * @param string $task タスク名
217 * @param bool $isAdmin 管理者機能(adminディレクトリ以下)かどうか
218 * @param string $defaultWidgetId カレントウィジェットの実行クラスが取得できない場合のデフォルトウィジェットID
221 function goSubWidget($task, $isAdmin = false, $defaultWidgetId = '')
224 global $gRequestManager;
227 $gEnvManager->setIsSubWidget(true); // サブウィジェットで起動
230 // フォーマット: [ウィジェットID][タスク名]WidgetContainer
231 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
232 $containerClass = '';
233 if ($isAdmin) $containerClass .= 'admin_';
234 $containerClass .= $widgetId . ucfirst($task) . 'WidgetContainer';
237 $containerClass = str_replace('/', '_', $containerClass);
239 // コンテナクラスが既にロードされているときはエラー
240 if (class_exists($containerClass)){
241 echo 'class redefined error2: ' . $containerClass;
244 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php'; // カレントウィジェットのコンテナクラス
245 if (file_exists($containerPath)){
246 require_once($containerPath);
249 $widgetContainer = new $containerClass();
250 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
251 $widgetContainer->process($gRequestManager);
252 $gEnvManager->setCurrentWidgetObj(null);
253 } else if (!empty($this->loadPath)){ // クラス検索用パスが設定されているとき
254 require_once($containerClass . '.php');
257 $widgetContainer = new $containerClass();
258 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
259 $widgetContainer->process($gRequestManager);
260 $gEnvManager->setCurrentWidgetObj(null);
262 if (empty($defaultWidgetId)){
263 echo 'file not found error: ' . $containerPath;
264 } else { // デフォルトのウィジェットIDが指定されている場合はデフォルトウィジェットIDで実行
266 $containerClass = '';
267 if ($isAdmin) $containerClass .= 'admin_';
268 $containerClass .= $defaultWidgetId . ucfirst($task) . 'WidgetContainer';
271 $containerClass = str_replace('/', '_', $containerClass);
273 // コンテナクラスが既にロードされているときはエラー
274 if (class_exists($containerClass)){
275 echo 'class redefined error3: ' . $containerClass;
278 $containerPath = $gEnvManager->getWidgetsPath() . '/' . $defaultWidgetId . '/include/container/' . $containerClass . '.php';
279 if (file_exists($containerPath)){
280 require_once($containerPath);
283 $widgetContainer = new $containerClass();
284 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
285 $widgetContainer->process($gRequestManager);
286 $gEnvManager->setCurrentWidgetObj(null);
288 echo 'file not found error: ' . $containerPath;
296 * ウィジェットインストーラ、アンインストーラを実行
298 * @param int $install インストール種別(0=インストール、1=アンインストール、2=アップデート)
300 function goInstallWidget($install)
303 global $gRequestManager;
306 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
307 $containerClass = 'admin_';
308 $containerClass .= $widgetId . 'InstallWidgetContainer';
311 $containerClass = str_replace('/', '_', $containerClass);
313 // コンテナクラスが既にロードされているときはエラー
314 if (class_exists($containerClass)){
315 echo 'class redefined error4: ' . $containerClass;
318 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
319 if (file_exists($containerPath)){
320 require_once($containerPath);
321 } else { // インストーラが存在しないときは終了
325 $widgetContainer = new $containerClass();
326 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
327 $widgetContainer->process($gRequestManager, $install);
328 $gEnvManager->setCurrentWidgetObj(null);
334 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
337 function goJob($filepath)
339 global $gPageManager;
342 $jobType = basename(dirname($filepath));
343 $gPageManager->launchJob($jobType);
348 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
351 function goWidgetJob($filepath)
354 global $gRequestManager;
356 // ##### ウィジェットのジョブを実行 #####
358 $widgetId = $gEnvManager->getCurrentWidgetId();
359 $containerClass = 'admin_';
360 $containerClass .= $widgetId . 'JobWidgetContainer';
363 $containerClass = str_replace('/', '_', $containerClass);
365 // コンテナクラスが既にロードされているときはエラー
366 if (class_exists($containerClass)){
367 echo 'class redefined error5: ' . $containerClass;
370 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
371 if (file_exists($containerPath)){
372 require_once($containerPath);
373 } else { // インストーラが存在しないときは終了
377 $widgetContainer = new $containerClass();
378 $gEnvManager->setCurrentWidgetObj($widgetContainer); // 実行するウィジェットコンテナオブジェクトを登録
379 $widgetContainer->process($gRequestManager);
380 $gEnvManager->setCurrentWidgetObj(null);
386 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
389 function goMobile($filepath = '')
391 $this->_goDevice(1/*携帯用*/, $filepath);
396 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
399 function goSmartphone($filepath = '')
401 $this->_goDevice(2/*スマートフォン用*/, $filepath);
406 * @param int $type 1=携帯用プログラム、2=スマートフォン用プログラム
407 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
410 function _goDevice($type, $filepath)
413 global $gRequestManager;
418 $gEnvManager->setIsMobileSite(true);
421 // スマートフォン用URLのアクセスを設定
422 $gEnvManager->setIsSmartphoneSite(true);
426 // ルートから$filepathへの相対パスで「FrameContainer.php」の先頭につける
428 // 例) 相対パスが「admin/index.php」のとき「admin_index」
429 if ($filepath == ''){
430 $basename = basename($_SERVER["PHP_SELF"], '.php');
433 $path = str_replace(M3_SYSTEM_ROOT_PATH, '', $filepath);
434 $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
435 $path = trim($path, '/');
436 $pathArray = explode('/', $path);
438 for ($i = 0; $i < count($pathArray); $i++){
440 $basename .= $pathArray[$i];
442 //$basename .= ucfirst($pathArray[$i]);
443 $basename .= ('_' . $pathArray[$i]);
446 $basename = basename($basename, '.php');
450 $gEnvManager->setCurrentPageId($basename);
453 $gEnvManager->setAccessPath(str_replace('_', '/', $basename));
455 // ファイル名から、コンテナクラスファイル取り込み
456 require_once($gEnvManager->getContainerPath() . '/' . $basename . 'FrameContainer.php');
459 $class = $basename . 'FrameContainer';
460 $mainContainer = new $class();
461 $mainContainer->process($gRequestManager);
466 * @param string $path 追加パス
469 function addLoadPath($path)
471 if (!empty($path) && !in_array($path, $this->loadPath)){
472 set_include_path(get_include_path() . PATH_SEPARATOR . $path);
473 $this->loadPath[] = $path;