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-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
19 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
21 class LaunchManager extends Core
23 const DEFAULT_RSS_CLASS_PREFIX = 'rss_'; // RSS実行用クラスの先頭文字列
28 function __construct()
31 parent::__construct();
37 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
39 function go($filepath = '')
42 global $gRequestManager;
44 // ルートから$filepathへの相対パスで「FrameContainer.php」の先頭につける
46 // 例) 相対パスが「admin/index.php」のとき「admin_index」
48 $basename = basename($_SERVER["PHP_SELF"], '.php');
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);
57 for ($i = 0; $i < count($pathArray); $i++){
59 $basename .= $pathArray[$i];
61 //$basename .= ucfirst($pathArray[$i]);
62 $basename .= ('_' . $pathArray[$i]);
65 $basename = basename($basename, '.php');
68 // PC用URLかどうかを設定(管理画面はPC用URLとしない)
70 if (strStartsWith($basename, 'admin_')) $isPcSite = false;
71 $gEnvManager->setIsPcSite($isPcSite);
74 if ($basename == basename(M3_FILENAME_SERVER_CONNECTOR, '.php')) $gEnvManager->setIsServerConnector(true);
77 $gEnvManager->setCurrentPageId($basename);
80 $gEnvManager->setAccessPath(str_replace('_', '/', $basename));
82 // ファイル名から、コンテナクラスファイル取り込み
83 require_once($gEnvManager->getContainerPath() . '/' . $basename . 'FrameContainer.php');
86 $class = $basename . 'FrameContainer';
87 $mainContainer = new $class();
88 $mainContainer->process($gRequestManager);
93 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
95 function goWidget($filepath)
98 global $gRequestManager;
99 static $pathArray = array(); // 呼び出し元を保存する
102 $cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
104 $basename = basename($filepath, '.php');
105 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
107 // このメソッドにアクセスしたウィジェットのパスをみて、管理画面へのアクセスかどうかを判断
108 $pathArray = explode(DIRECTORY_SEPARATOR, $filepath);
109 $pathCount = count($pathArray);
110 $accessAdmin = false;
113 $gEnvManager->setIsSubWidget(false); // 通常ウィジェットで起動
115 if ($gEnvManager->getIsMobileSite()){ // 携帯サイトへのアクセスのとき
116 // 管理画面へのアクセスかどうかチェック
117 if ($pathArray[$pathCount -2] == 'admin' && $pathArray[$pathCount -3] == $widgetId){
120 // 携帯用ウィジェットのウィジェットIDは、「m/xxxxxx」の形式
122 $widgetId = str_replace('/', '_', $widgetId);
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」
131 $containerClass = $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
132 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
134 if (file_exists($containerPath)){
135 require_once($containerPath);
137 echo 'file not found error: ' . $containerPath;
140 $widgetContainer = new $containerClass();
141 $widgetContainer->process($gRequestManager);
142 } else { // PC用の画面からのアクセスまたは管理画面へのアクセス
145 if ($pathArray[$pathCount -4] == 'iwidgets' && $pathArray[$pathCount -2] == 'admin'){ // インナーウィジェット管理者画面
147 $widgetId = $pathArray[$pathCount -3]; // インナーウィジェットID
149 } else if ($pathArray[$pathCount -3] == 'iwidgets'){ // インナーウィジェット通常画面
151 $widgetId = $pathArray[$pathCount -2];// インナーウィジェットID
152 } else if ($pathArray[$pathCount -3] == $widgetId && $pathArray[$pathCount -2] == 'admin'){ // PC用ウィジェット管理画面
154 } else if ($pathArray[$pathCount -4] . '/' . $pathArray[$pathCount -3] == $widgetId && $pathArray[$pathCount -2] == 'admin'){ // 携帯用ウィジェット管理画面
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」
163 $containerClass = $widgetId . 'WidgetContainer'; // デフォルトで起動するコンテナクラス名「ウィジェットID + WidgetContainer」
166 $containerClass = str_replace('/', '_', $containerClass);
168 // コンテナクラスが既にロードされているときはエラー
169 // 同じウィジェットが2回以上実行される可能性があるので、ウィジェットIDが同じであればエラーとしない
170 if (class_exists($containerClass)){
171 // 既に起動済みのウィジェットかどうかチェック
172 //if (in_array($filepath, $pathArray)){
174 $widgetContainer = new $containerClass();
175 $widgetContainer->process($gRequestManager);
177 // // 同じウィジェットが起動されていないときは、クラス名のバッテイングでエラー
178 // echo 'class redefined error: ' . $containerClass;
181 // ウィジェットのコンテナクラスファイルを読み込み
182 if ($isIWidget){ // インナーウィジェットの場合
184 $containerPath = dirname(dirname($filepath)) . '/include/container/' . $containerClass . '.php';
186 $containerPath = dirname($filepath) . '/include/container/' . $containerClass . '.php';
189 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
191 if (file_exists($containerPath)){
192 require_once($containerPath);
194 echo 'file not found error: ' . $containerPath;
197 $widgetContainer = new $containerClass();
198 $widgetContainer->process($gRequestManager);
201 $pathArray[] = $filepath;
207 * @param string $task タスク名
208 * @param bool $isAdmin 管理者機能(adminディレクトリ以下)かどうか
209 * @param string $defaultWidgetId カレントウィジェットの実行クラスが取得できない場合のデフォルトウィジェットID
212 function goSubWidget($task, $isAdmin = false, $defaultWidgetId = '')
215 global $gRequestManager;
218 $gEnvManager->setIsSubWidget(true); // サブウィジェットで起動
221 // フォーマット: [ウィジェットID][タスク名]WidgetContainer
222 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
223 $containerClass = '';
224 if ($isAdmin) $containerClass .= 'admin_';
225 $containerClass .= $widgetId . ucfirst($task) . 'WidgetContainer';
228 $containerClass = str_replace('/', '_', $containerClass);
230 // コンテナクラスが既にロードされているときはエラー
231 if (class_exists($containerClass)){
232 echo 'class redefined error2: ' . $containerClass;
235 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php'; // カレントウィジェットのコンテナクラス
236 if (file_exists($containerPath)){
237 require_once($containerPath);
240 $widgetContainer = new $containerClass();
241 $widgetContainer->process($gRequestManager);
243 if (empty($defaultWidgetId)){
244 echo 'file not found error: ' . $containerPath;
245 } else { // デフォルトのウィジェットIDが指定されている場合はデフォルトウィジェットIDで実行
247 $containerClass = '';
248 if ($isAdmin) $containerClass .= 'admin_';
249 $containerClass .= $defaultWidgetId . ucfirst($task) . 'WidgetContainer';
252 $containerClass = str_replace('/', '_', $containerClass);
254 // コンテナクラスが既にロードされているときはエラー
255 if (class_exists($containerClass)){
256 echo 'class redefined error3: ' . $containerClass;
259 $containerPath = $gEnvManager->getWidgetsPath() . '/' . $defaultWidgetId . '/include/container/' . $containerClass . '.php';
260 if (file_exists($containerPath)){
261 require_once($containerPath);
264 $widgetContainer = new $containerClass();
265 $widgetContainer->process($gRequestManager);
267 echo 'file not found error: ' . $containerPath;
275 * ウィジェットインストーラ、アンインストーラを実行
277 * @param int $install インストール種別(0=インストール、1=アンインストール、2=アップデート)
279 function goInstallWidget($install)
282 global $gRequestManager;
285 $widgetId = $gEnvManager->getCurrentWidgetId();// ウィジェットID
286 $containerClass = 'admin_';
287 $containerClass .= $widgetId . 'InstallWidgetContainer';
290 $containerClass = str_replace('/', '_', $containerClass);
292 // コンテナクラスが既にロードされているときはエラー
293 if (class_exists($containerClass)){
294 echo 'class redefined error3: ' . $containerClass;
297 $containerPath = $gEnvManager->getCurrentWidgetContainerPath() . '/' . $containerClass . '.php';
298 if (file_exists($containerPath)){
299 require_once($containerPath);
300 } else { // インストーラが存在しないときは終了
304 $widgetContainer = new $containerClass();
305 $widgetContainer->process($gRequestManager, $install);
311 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
314 function goMobile($filepath = '')
316 $this->_goDevice(1/*携帯用*/, $filepath);
321 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
324 function goSmartphone($filepath = '')
326 $this->_goDevice(2/*スマートフォン用*/, $filepath);
331 * @param int $type 1=携帯用プログラム、2=スマートフォン用プログラム
332 * @param string $filepath 呼び出し元ファイルのフルパス。通常は「__FILE__」。OSによってパスの表現が違うので注意。
335 function _goDevice($type, $filepath)
338 global $gRequestManager;
343 $gEnvManager->setIsMobileSite(true);
346 // スマートフォン用URLのアクセスを設定
347 $gEnvManager->setIsSmartphoneSite(true);
351 // ルートから$filepathへの相対パスで「FrameContainer.php」の先頭につける
353 // 例) 相対パスが「admin/index.php」のとき「admin_index」
354 if ($filepath == ''){
355 $basename = basename($_SERVER["PHP_SELF"], '.php');
358 $path = str_replace(M3_SYSTEM_ROOT_PATH, '', $filepath);
359 $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
360 $path = trim($path, '/');
361 $pathArray = explode('/', $path);
363 for ($i = 0; $i < count($pathArray); $i++){
365 $basename .= $pathArray[$i];
367 //$basename .= ucfirst($pathArray[$i]);
368 $basename .= ('_' . $pathArray[$i]);
371 $basename = basename($basename, '.php');
375 $gEnvManager->setCurrentPageId($basename);
378 $gEnvManager->setAccessPath(str_replace('_', '/', $basename));
380 // ファイル名から、コンテナクラスファイル取り込み
381 require_once($gEnvManager->getContainerPath() . '/' . $basename . 'FrameContainer.php');
384 $class = $basename . 'FrameContainer';
385 $mainContainer = new $class();
386 $mainContainer->process($gRequestManager);