7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
9 * @package Magic3 Framework
10 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11 * @copyright Copyright 2006-2016 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getContainerPath() . '/baseAdminWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/admin_menuDb.php');
19 class admin_menu4WidgetContainer extends BaseAdminWidgetContainer
21 protected $db; // DB接続オブジェクト
22 protected $cssFilePath; // CSSファイル
23 protected $contentMenu; // コンテンツ編集メニュー
24 protected $subContentMenu; // サブコンテンツ編集メニュー
25 protected $useMenu; // メニューを使用するかどうか
26 protected $useCloseButton; // 「閉じる」を使用するかどうか
27 protected $systemType; // システム運用タイプ
28 const DEFAULT_CSS_FILE = '/default.css'; // CSSファイル
29 const WIDGET_CSS_FILE = '/widget.css'; // ウィジェット単体表示用CSS
30 const DEFAULT_NAV_ID = 'admin_menu'; // ナビゲーションメニューID
31 // const DEFAULT_THEME_DIR = '/ui/themes/'; // jQueryUIテーマ格納ディレクトリ
32 // const THEME_CSS_FILE = 'jquery-ui.custom.css'; // テーマファイル
33 // const CF_ADMIN_DEFAULT_THEME = 'admin_default_theme'; // 管理画面用jQueryUIテーマ
34 const HELP_ICON_FILE = '/images/system/help24.gif'; // ヘルプアイコン
35 const TOP_ICON_FILE = '/images/system/home32.png'; // トップ遷移アイコン
36 const TOP_SERVER_ADMIN_ICON_FILE = '/images/system/globe32.png'; // トップ遷移アイコン(サーバ管理運用の場合)
37 const CLOSE_ICON_FILE = '/images/system/close32.png'; // ウィンドウ閉じるアイコン
38 const PREV_ICON_FILE = '/images/system/prev48.png'; // ウィンドウ「前へ」アイコン
39 const NEXT_ICON_FILE = '/images/system/next48.png'; // ウィンドウ「次へ」アイコン
40 const PC_ICON_FILE = '/images/system/device/pc.png'; // PCアイコン
41 const SMARTPHONE_ICON_FILE = '/images/system/device/smartphone.png'; // スマートフォンアイコン
42 const MOBILE_ICON_FILE = '/images/system/device/mobile.png'; // 携帯アイコン
43 const PC_CLOSED_ICON_FILE = '/images/system/device/pc_closed.png'; // PCアイコン(非公開)
44 const SMARTPHONE_CLOSED_ICON_FILE = '/images/system/device/smartphone_closed.png'; // スマートフォンアイコン(非公開)
45 const MOBILE_CLOSED_ICON_FILE = '/images/system/device/mobile_closed.png'; // 携帯アイコン(非公開)
46 const SITE_OPEN_ICON_FILE = '/images/system/site_open24.png'; // アクセスポイント公開
47 const SITE_CLOSE_ICON_FILE = '/images/system/site_close24.png'; // アクセスポイント非公開
48 const LOGOUT_ICON_FILE = '/images/system/logout24.png'; // ログアウトアイコン
49 const CONFIG_ICON_FILE = '/images/system/config24.png'; // ウィジェット設定画面アイコン
50 const MAX_SITENAME_LENGTH = 20; // サイト名の最大文字数
51 const ICON_SIZE = 24; // アイコンサイズ
52 const SITE_ICON_SIZE = 32; // サイトメニューアイコンサイズ
53 const AVATAR_ICON_SIZE = 32; // ユーザアバターアイコンサイズ
54 const HELP_TITLE = 'ヘルプ';
55 const MENU_TITLE_PREVIEW = 'プレビュー';
56 const MENU_TITLE_CONTENT = 'コンテンツ管理'; // コンテンツ編集メニューのタイトル
57 const MENU_TITLE_SUB_CONTENT = '補助コンテンツ管理'; // サブコンテンツ編集メニューのタイトル
58 const UNTITLED_USER_NAME = '名称なしユーザ'; // ユーザ名が設定されていなかった場合の表示名
59 const MAINMENU_INDENT_LEBEL = 4; // メインメニューのインデントレベル
60 const SITEMENU_INDENT_LEBEL = 2; // サイトメニューのインデントレベル
61 const MAINMENU_COL_STYLE = 'col-md-'; // Bootstrapのカラムクラス
62 const MENUBAR_HEIGHT = 60; // メインメニューバーの高さ
63 const SUB_MENUBAR_HEIGHT = 50; // サブメニューバーの高さ
66 const CF_SITE_IN_PUBLIC = 'site_in_public'; // サイト公開状況
67 const CF_SITE_PC_IN_PUBLIC = 'site_pc_in_public'; // PC用サイトの公開状況
68 const CF_SITE_MOBILE_IN_PUBLIC = 'site_mobile_in_public'; // 携帯用サイトの公開状況
69 const CF_SITE_SMARTPHONE_IN_PUBLIC = 'site_smartphone_in_public'; // スマートフォン用サイトの公開状況
70 const CF_SYSTEM_TYPE = 'system_type'; // システム運用タイプ
71 const SYSTEM_TYPE_SERVER_ADMIN = 'serveradmin'; // システム運用タイプ(サーバ管理)
76 function __construct()
79 parent::__construct();
82 $this->db = new admin_menuDB();
87 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
88 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
90 * @param RequestManager $request HTTPリクエスト処理クラス
91 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
92 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
94 function _setTemplate($request, &$param)
96 return 'index.tmpl.html';
101 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
103 * @param RequestManager $request HTTPリクエスト処理クラス
104 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
107 function _assign($request, &$param)
109 // システム制御画面のときはメニューを作成しないで終了
110 if ($this->gPage->getSystemHandleMode() > 0){
114 if (!$this->gEnv->isSystemAdmin()) return; // システム管理者以外の場合は終了
116 $menu = $request->trimValueOf('menu');
117 $openBy = $request->trimValueOf(M3_REQUEST_PARAM_OPEN_BY); // ウィンドウオープンタイプ
118 $pageSubId = $request->trimValueOf(M3_REQUEST_PARAM_PAGE_SUB_ID); // ページIDを取得
119 $act = $request->trimValueOf('act');
121 if ($act == 'opensite'){ // サイト公開制御
122 $deviceType = $request->trimIntValueOf('device', '0');
123 $isOpen = $request->trimIntValueOf('isopen', '0'); // サイトの公開状況
125 $siteInPublic = $this->gSystem->siteInPublic(); // サイト全体の公開状況
126 $sitePcInPublic = $this->gSystem->sitePcInPublic(); // PC用サイトの公開状況
127 $siteMobileInPublic = $this->gSystem->siteMobileInPublic(); // 携帯用サイトの公開状況
128 $siteSmartphoneInPublic = $this->gSystem->siteSmartphoneInPublic(); // スマートフォン用サイトの公開状況
130 switch ($deviceType){
133 if ($siteInPublic){ // 全サイト公開のとき
134 $this->_db->updateSystemConfig(self::CF_SITE_PC_IN_PUBLIC, 1); // PCサイト公開
136 $this->_db->updateSystemConfig(self::CF_SITE_IN_PUBLIC, 1); // サイト運用開始
138 $this->_db->updateSystemConfig(self::CF_SITE_PC_IN_PUBLIC, 1); // PCサイト公開
139 $this->_db->updateSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC, 0); // 携帯サイト公開
140 $this->_db->updateSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC, 0); // スマートフォンサイト公開
143 if ($siteInPublic){ // 全サイト公開のとき
144 $this->_db->updateSystemConfig(self::CF_SITE_PC_IN_PUBLIC, 0); // PCサイト非公開
150 if ($siteInPublic){ // 全サイト公開のとき
151 $this->_db->updateSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC, 1); // 携帯サイト公開
153 $this->_db->updateSystemConfig(self::CF_SITE_IN_PUBLIC, 1); // サイト運用開始
155 $this->_db->updateSystemConfig(self::CF_SITE_PC_IN_PUBLIC, 0); // PCサイト公開
156 $this->_db->updateSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC, 1); // 携帯サイト公開
157 $this->_db->updateSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC, 0); // スマートフォンサイト公開
160 if ($siteInPublic){ // 全サイト公開のとき
161 $this->_db->updateSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC, 0); // 携帯サイト非公開
165 case 2: // スマートフォン用画面のとき
167 if ($siteInPublic){ // 全サイト公開のとき
168 $this->_db->updateSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC, 1); // スマートフォンサイト公開
170 $this->_db->updateSystemConfig(self::CF_SITE_IN_PUBLIC, 1); // サイト運用開始
172 $this->_db->updateSystemConfig(self::CF_SITE_PC_IN_PUBLIC, 0); // PCサイト公開
173 $this->_db->updateSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC, 0); // 携帯サイト公開
174 $this->_db->updateSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC, 1); // スマートフォンサイト公開
177 if ($siteInPublic){ // 全サイト公開のとき
178 $this->_db->updateSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC, 0); // スマートフォンサイト非公開
185 $this->gPage->redirect();
189 $menuStatus = $request->trimValueOf('showmenu');
190 if (!empty($menuStatus)){
191 if ($menuStatus == 'false'){
192 $paramObj->showMenu = 0; // メニューを表示するかどうか
193 } else if ($menuStatus == 'true'){
194 $paramObj->showMenu = 1; // メニューを表示するかどうか
196 $ret = $this->updateWidgetParamObj($paramObj);
199 $this->cssFilePath = $this->getUrl($this->gEnv->getCurrentWidgetCssUrl() . self::DEFAULT_CSS_FILE); // CSSファイル
202 if ($menu == 'off'){ // メニュー非表示指定のとき
203 } else if (!empty($openBy)){ // 別ウィンドウで表示のときは閉じるボタン表示
204 if ($openBy != 'tabs' && $openBy != 'iframe' && $openBy != 'dialog'){ // タブ、インナーフレーム、ダイアログ表示以外
205 $this->useCloseButton = true; // 「閉じる」を使用するかどうか
206 $this->tmpl->setAttribute('closebutton', 'visibility', 'visible');
209 $iconUrl = $this->gEnv->getRootUrl() . self::CLOSE_ICON_FILE;
210 $this->tmpl->addVar("closebutton", "close_image", $this->getUrl($iconUrl));
212 // サーバ指定されている場合はサーバ名を設定
213 $server = $request->trimValueOf(M3_REQUEST_PARAM_SERVER);
214 if (!empty($server)){
216 $ret = $this->_db->getServerById($server, $row);
218 //$serverName = 'サーバ名:' . $row['ts_name'];// サーバ名
219 $serverName = $this->_('Server Name:') . ' ' . $row['ts_name'];// サーバ名
220 $this->tmpl->addVar("closebutton", "server_name", $this->convertToDispString($serverName));
224 } else { // メニュー表示のとき
225 $this->useMenu = true; // メニューを使用するかどうか
226 $this->tmpl->setAttribute('menu', 'visibility', 'visible');
228 // ##### メニューを作成 #####
230 $navId = self::DEFAULT_NAV_ID . '.' . $this->gEnv->getCurrentLanguage();
231 if (!$this->db->getNavItems($navId, 0, $rows)){ // 現在の言語で取得できないときはデフォルト言語で取得
232 $navId = self::DEFAULT_NAV_ID . '.' . $this->gEnv->getDefaultLanguage();
233 if (!$this->db->getNavItems($navId, 0, $rows)){ // デフォルト言語で取得できないときは拡張子なしで取得
234 $navId = self::DEFAULT_NAV_ID;
235 $this->db->getNavItems($navId, 0, $rows);
240 $topMenuCount = count($rows);
242 for ($i = 0; $i < $topMenuCount; $i++){
243 if ($rows[$i]['ni_view_control'] != 0) $columnCount++; // 改行のとき
245 if ($topMenuCount > 0 && $rows[$topMenuCount -1]['ni_view_control'] == 0) $columnCount++;
246 $columnWidth = 12 / $columnCount; // Bootstrapでの幅
247 $menuInner = str_repeat(M3_INDENT_SPACE, self::MAINMENU_INDENT_LEBEL) . '<li class="' . self::MAINMENU_COL_STYLE . $columnWidth . '"><ul>' . M3_NL;
249 for ($i = 0; $i < $topMenuCount; $i++){
250 if ($rows[$i]['ni_view_control'] == 1){ // 改行のとき
251 $menuInner .= str_repeat(M3_INDENT_SPACE, self::MAINMENU_INDENT_LEBEL) . '</ul></li><li class="' . self::MAINMENU_COL_STYLE . $columnWidth . '"><ul>' . M3_NL;
253 $topId = $rows[$i]['ni_id'];
256 $this->db->getNavItems($navId, $topId, $subRows);
260 $title = $rows[$i]['ni_help_title'];
262 $helpText = $this->gInstance->getHelpManager()->createHelpText($title, $rows[$i]['ni_help_body']);
266 $menuInner .= str_repeat(M3_INDENT_SPACE, self::MAINMENU_INDENT_LEBEL + 1);
267 $menuInner .= '<li class="dropdown-header"><span ' . $helpText . '>' . $this->convertToDispString($rows[$i]['ni_name']) . '</span></li>' . M3_NL;
270 if (count($subRows) > 0){
271 for ($l = 0; $l < count($subRows); $l++){
273 $itemType = $subRows[$l]['ni_view_control'];
277 $title = $subRows[$l]['ni_help_title'];
279 $helpText = $this->gInstance->getHelpManager()->createHelpText($title, $subRows[$l]['ni_help_body']);
282 $menuInner .= str_repeat(M3_INDENT_SPACE, self::MAINMENU_INDENT_LEBEL + 2);
287 $menuInner .= '<li><a href="';
288 $menuInner .= $this->getUrl($this->gEnv->getDefaultAdminUrl() . '?task=' . $subRows[$l]['ni_task_id']); // 起動タスクパラメータを設定
289 if (!empty($subRows[$l]['ni_param'])){ // パラメータが存在するときはパラメータを追加
290 $menuInner .= '&' . M3_REQUEST_PARAM_OPERATION_TODO . '=' . urlencode($subRows[$l]['ni_param']);
292 $menuInner .= '" ><span ' . $helpText . '>' . $this->convertToDispString($subRows[$l]['ni_name']) . '</span></a></li>' . M3_NL;
297 $menuInner .= '<li class="divider"></li>' . M3_NL;
302 $menuInner .= str_repeat(' ', 4);
306 $menuInner .= str_repeat(M3_INDENT_SPACE, self::MAINMENU_INDENT_LEBEL) . '</ul></li>' . M3_NL;
307 $this->tmpl->addVar("menu", "menu_inner", $menuInner);
308 $this->tmpl->addVar("menu", "widget_url", $this->getUrl($this->gEnv->getCurrentWidgetRootUrl())); // ウィジェットのルートディレクトリ
310 $this->tmpl->addVar("menu", "top_url", $this->getUrl($this->gEnv->getDefaultAdminUrl())); // トップメニュー画面URL
313 $siteName = $this->gEnv->getSiteName();
314 $siteName = makeTruncStr($siteName, self::MAX_SITENAME_LENGTH);
315 $siteUrl = $this->gEnv->getRootUrl();
316 $this->tmpl->addVar("menu", "site_name", $siteName);
317 $this->tmpl->addVar("menu", "pc_url", $siteUrl);
318 //$this->tmpl->addVar("menu", "site", '<label><a href="#" onclick="previewSite(\'' . $siteUrl . '\');">' . $siteUrl . '</a></label>');
321 $this->systemType = $this->gSystem->getSystemConfig(self::CF_SYSTEM_TYPE); // システム運用タイプ
322 if ($this->systemType == self::SYSTEM_TYPE_SERVER_ADMIN){ // サーバ管理の場合
323 $iconUrl = $this->gEnv->getRootUrl() . self::TOP_SERVER_ADMIN_ICON_FILE;
325 $iconUrl = $this->gEnv->getRootUrl() . self::TOP_ICON_FILE;
327 $iconTitle = $this->_('Top Page'); // トップ画面
328 $imageSize = self::SITE_ICON_SIZE;
329 $iconTag = '<img class="home" src="' . $this->getUrl($iconUrl) . '" width="' . $imageSize . '" height="' . $imageSize . '" border="0" alt="' . $iconTitle . '" />';
330 $this->tmpl->addVar("menu", "top_image", $iconTag);
333 $this->tmpl->addVar("menu", "system", 'Magic3 v' . M3_SYSTEM_VERSION);
334 $this->tmpl->addVar("menu", "official_url", 'http://www.magic3.org');
337 $userId = $this->gEnv->getCurrentUserId();
338 $ret = $this->_db->getLoginUserRecordById($userId, $row);// ユーザ情報取得
340 $userName = $row['lu_name']; // ユーザ名
341 $avatar = $row['lu_avatar']; // アバター
343 if (empty($userName)) $userName = self::UNTITLED_USER_NAME;
344 $this->tmpl->addVar("menu", "user", $this->convertToDispString($userName));
347 $avatarFormat = $this->gInstance->getImageManager()->getDefaultAvatarFormat(); // 画像フォーマット取得
349 $this->gInstance->getImageManager()->parseImageFormat($avatarFormat, $imageType, $imageAttr, $imageSize); // 画像情報取得
350 $avatarUrl = $this->gInstance->getImageManager()->getAvatarUrl($avatar);
351 $iconTitle = 'アバター画像';
352 $imageSize = self::AVATAR_ICON_SIZE;
353 $iconTag = '<img class="avatar" src="' . $this->getUrl($avatarUrl) . '" width="' . $imageSize . '" height="' . $imageSize . '" border="0" alt="' . $iconTitle . '" />';
354 $this->tmpl->addVar("menu", "avatar_img", $iconTag);
357 $loginStatusUrl = '?task=userlist_detail&userid=' . $userId;// ユーザ情報画面URL
358 $this->tmpl->addVar("menu", "user_info_url", $this->convertUrlToHtmlEntity($loginStatusUrl));
359 $iconTitle = 'ログアウト';
360 $iconUrl = $this->gEnv->getRootUrl() . self::LOGOUT_ICON_FILE; // ログアウト
361 $iconTag = '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" />';
362 $this->tmpl->addVar("menu", "logout_img", $iconTag);
365 $this->contentMenu = $this->getContentMenu(); // コンテンツ編集メニュー項目取得
366 $this->subContentMenu = $this->getSubContentMenu(); // サブコンテンツ編集メニュー
369 $siteMenuTag = $this->createSiteMenuTag();
370 $this->tmpl->addVar("menu", "site_menu", $siteMenuTag);
372 // ##### サブメニューバーとパンくずリストを作成 #####
373 $topPos = 0; // コンテンツの開始位置
374 if ($this->useMenu) $topPos = self::MENUBAR_HEIGHT; // コンテンツの開始位置
377 $subNavbarDef = $this->gPage->getAdminSubNavbarDef();
378 if (!empty($subNavbarDef)){
379 $topPos += self::SUB_MENUBAR_HEIGHT; // サブメニューバーの高さ追加
381 $this->tmpl->setAttribute('subnavbar', 'visibility', 'visible');
382 if ($this->useMenu) $this->tmpl->setAttribute('usesubmenubar', 'visibility', 'visible');
385 list($title, $menu) = $this->createSubMenubar($subNavbarDef);
386 $this->tmpl->addVar('subnavbar', 'title', $title);
387 $this->tmpl->addVar('subnavbar', 'menu', $menu);
390 $breadcrumbDef = $this->gPage->getAdminBreadcrumbDef();
391 if (!empty($breadcrumbDef)){
392 $this->tmpl->setAttribute('breadcrumb', 'visibility', 'visible');
393 for ($i = 0; $i < count($breadcrumbDef); $i++){
395 'name' => $this->convertToDispString($breadcrumbDef[$i])
397 $this->tmpl->addVars('breadcrumb_list', $row);
398 $this->tmpl->parseTemplate('breadcrumb_list', 'a');
402 if (!empty($subNavbarDef) || !empty($breadcrumbDef)){
403 $this->tmpl->setAttribute('fixtoppos', 'visibility', 'visible');
404 $this->tmpl->addVar('fixtoppos', 'second_top', $this->convertToDispString($topPos - self::SUB_MENUBAR_HEIGHT));
405 $this->tmpl->addVar('fixtoppos', 'content_top', $this->convertToDispString($topPos)); // コンテンツのトップ位置
409 $this->tmpl->setAttribute('prevnextbutton', 'visibility', 'visible');
410 $iconUrl = $this->gEnv->getRootUrl() . self::PREV_ICON_FILE;
411 $this->tmpl->addVar("prevnextbutton", "prev_image", $this->getUrl($iconUrl));
412 $iconUrl = $this->gEnv->getRootUrl() . self::NEXT_ICON_FILE;
413 $this->tmpl->addVar("prevnextbutton", "next_image", $this->getUrl($iconUrl));
416 $localeText = array();
417 $localeText['msg_logout'] = $this->_('Logout from system?');// ログアウトしますか?
418 // $localeText['label_top'] = $this->_('Top');// トップ
419 $localeText['label_menu'] = $this->_('Menu');// メニュー
420 $localeText['label_user_info'] = $this->_('User Information');// ユーザ情報
421 $localeText['label_logout'] = $this->_('Logout');// ログアウト
422 $localeText['label_close'] = $this->_('Close');// 閉じる
423 $this->setLocaleText($localeText);
426 * CSSファイルをHTMLヘッダ部に設定
428 * CSSファイルをHTMLのheadタグ内に追加出力する。
429 * _assign()よりも後に実行される。
431 * @param RequestManager $request HTTPリクエスト処理クラス
432 * @param object $param 任意使用パラメータ。
433 * @return string CSS文字列。出力しない場合は空文字列を設定。
435 function _addCssFileToHead($request, &$param)
437 if ($this->useMenu){ // メニューを使用するかどうか
438 return $this->cssFilePath;
439 } else if ($this->useCloseButton){ // 「閉じる」を使用するかどうか
440 $this->cssFilePath = $this->getUrl($this->gEnv->getCurrentWidgetCssUrl() . self::WIDGET_CSS_FILE); // ウィジェット単体表示用CSSファイル
441 return $this->cssFilePath;
449 * @return string サイトメニュータグ
451 function createSiteMenuTag()
454 $isOpen = $this->gSystem->siteInPublic();
457 $sitePcInPublic = $this->gSystem->sitePcInPublic(); // PC用サイトの公開状況
458 $siteSmartphoneInPublic = $this->gSystem->siteSmartphoneInPublic(); // スマートフォン用サイトの公開状況
459 $siteMobileInPublic = $this->gSystem->siteMobileInPublic(); // 携帯用サイトの公開状況
462 $isActiveSite = $this->gSystem->getSiteActiveStatus(0); // PC用サイト
464 $isVisibleSite = false; // 公開中かどうか
465 $iconTitle = 'PC用アクセスポイント';
466 if ($isOpen && $sitePcInPublic){
467 $iconUrl = $this->gEnv->getRootUrl() . self::PC_ICON_FILE;
468 $isVisibleSite = true; // 公開中かどうか
470 $iconUrl = $this->gEnv->getRootUrl() . self::PC_CLOSED_ICON_FILE; // サイト非公開
472 $iconTag = str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL) . '<li class="dropdown" >' . M3_NL;
473 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) .
474 '<a href="#" class="dropdown-toggle device_icon" data-toggle="dropdown" data-placement="left" data-container="body" title="' . $iconTitle . '" rel="m3help">';
475 $iconTag .= '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::SITE_ICON_SIZE . '" height="' . self::SITE_ICON_SIZE . '" border="0" alt="' . $iconTitle . '" /><b class="caret"></b></a>' . M3_NL;
476 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) . '<ul class="dropdown-menu">' . M3_NL;
477 $iconTag .= $this->createContentMenu(0, $isVisibleSite); // コンテンツ編集メニュー付加
478 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) . '</ul>'. M3_NL;
479 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL) . '</li>' . M3_NL;
480 $menuTag .= $iconTag;
484 $isActiveSite = $this->gSystem->getSiteActiveStatus(2); // スマートフォン用サイト
486 $iconTitle = 'スマートフォン用アクセスポイント';
487 $isVisibleSite = false; // 公開中かどうか
488 if ($isOpen && $siteSmartphoneInPublic){
489 $iconUrl = $this->gEnv->getRootUrl() . self::SMARTPHONE_ICON_FILE;
490 $isVisibleSite = true; // 公開中かどうか
492 $iconUrl = $this->gEnv->getRootUrl() . self::SMARTPHONE_CLOSED_ICON_FILE;// サイト非公開
494 $iconTag = str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL) . '<li class="dropdown" >' . M3_NL;
495 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) .
496 '<a href="#" class="dropdown-toggle device_icon" data-toggle="dropdown" data-placement="left" data-container="body" title="' . $iconTitle . '" rel="m3help">';
497 $iconTag .= '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::SITE_ICON_SIZE . '" height="' . self::SITE_ICON_SIZE . '" border="0" alt="' . $iconTitle . '" /><b class="caret"></b></a>' . M3_NL;
498 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) . '<ul class="dropdown-menu">' . M3_NL;
499 $iconTag .= $this->createContentMenu(2, $isVisibleSite);// コンテンツ編集メニュー付加
500 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) . '</ul>'. M3_NL;
501 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL) . '</li>' . M3_NL;
502 $menuTag .= $iconTag;
506 $isActiveSite = $this->gSystem->getSiteActiveStatus(1); // 携帯用サイト
508 $iconTitle = '携帯用アクセスポイント';
509 $isVisibleSite = false; // 公開中かどうか
510 if ($isOpen && $siteMobileInPublic){
511 $iconUrl = $this->gEnv->getRootUrl() . self::MOBILE_ICON_FILE;
512 $isVisibleSite = true; // 公開中かどうか
514 $iconUrl = $this->gEnv->getRootUrl() . self::MOBILE_CLOSED_ICON_FILE;// サイト非公開
516 $iconTag = str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL) . '<li class="dropdown" >' . M3_NL;
517 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) .
518 '<a href="#" class="dropdown-toggle device_icon" data-toggle="dropdown" data-placement="left" data-container="body" title="' . $iconTitle . '" rel="m3help">';
519 $iconTag .= '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::SITE_ICON_SIZE . '" height="' . self::SITE_ICON_SIZE . '" border="0" alt="' . $iconTitle . '" /><b class="caret"></b></a>' . M3_NL;
520 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) . '<ul class="dropdown-menu">' . M3_NL;
521 $iconTag .= $this->createContentMenu(1, $isVisibleSite); // コンテンツ編集メニュー付加
522 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 1) . '</ul>'. M3_NL;
523 $iconTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL) . '</li>' . M3_NL;
524 $menuTag .= $iconTag;
531 * @return string メニュー項目データ
533 function getContentMenu()
535 $menuItems = array(array(), array(), array());
536 $pageIdArray = array($this->gEnv->getDefaultPageId(), $this->gEnv->getDefaultMobilePageId(), $this->gEnv->getDefaultSmartphonePageId());
537 /* $contentType = array( M3_VIEW_TYPE_CONTENT, // 汎用コンテンツ
538 M3_VIEW_TYPE_PRODUCT, // 製品
539 M3_VIEW_TYPE_BBS, // BBS
540 M3_VIEW_TYPE_BLOG, // ブログ
541 M3_VIEW_TYPE_WIKI, // Wiki
542 M3_VIEW_TYPE_USER, // ユーザ作成コンテンツ
543 M3_VIEW_TYPE_EVENT, // イベント
544 M3_VIEW_TYPE_PHOTO); // フォトギャラリー*/
545 $contentType = $this->gPage->getMainContentTypes();
546 $ret = $this->db->getEditWidgetOnPage($pageIdArray, $contentType, $rows);
548 $rowCount = count($rows);
549 for ($i = 0; $i < $rowCount; $i++){
551 switch ($row['pd_id']){
552 case $pageIdArray[0]:
556 case $pageIdArray[1]:
559 case $pageIdArray[2]:
563 $menuItems[$index][] = $row;
571 * @return string メニュー項目データ
573 function getSubContentMenu()
575 $menuItems = array(array(), array(), array());
576 $pageIdArray = array($this->gEnv->getDefaultPageId(), $this->gEnv->getDefaultMobilePageId(), $this->gEnv->getDefaultSmartphonePageId());
577 $contentType = $this->gPage->getSubContentTypes();
578 $ret = $this->db->getEditSubWidgetOnPage($pageIdArray, $contentType, $rows);
580 $rowCount = count($rows);
581 for ($i = 0; $i < $rowCount; $i++){
583 switch ($row['pd_id']){
584 case $pageIdArray[0]:
588 case $pageIdArray[1]:
591 case $pageIdArray[2]:
595 $menuItems[$index][] = $row;
603 * @param int $deviceType デバイスタイプ
604 * @param bool $isVisibleSite アクセスポイント公開中かどうか
605 * @return string メニュータグ
607 function createContentMenu($deviceType, $isVisibleSite)
609 static $mainContentTypeArray;
610 static $subContentTypeArray;
611 static $mainFeatureTypeArray;
613 if (!isset($mainContentTypeArray)){
614 $mainContentTypeArray = array();
615 $mainContentTypeInfo = $this->gPage->getMainContentTypeInfo(); // 主要コンテンツタイプ情報
616 for ($i = 0; $i < count($mainContentTypeInfo); $i++){
617 $value = $mainContentTypeInfo[$i]['value'];
618 $name = $mainContentTypeInfo[$i]['name'];
619 $mainContentTypeArray[$value] = $name;
622 if (!isset($subContentTypeArray)){
623 $subContentTypeArray = array();
624 $subContentTypeInfo = $this->gPage->getSubContentTypeInfo(); // 補助コンテンツタイプ情報
625 for ($i = 0; $i < count($subContentTypeInfo); $i++){
626 $value = $subContentTypeInfo[$i]['value'];
627 $name = $subContentTypeInfo[$i]['name'];
628 $subContentTypeArray[$value] = $name;
631 if (!isset($mainFeatureTypeArray)){
632 $mainFeatureTypeArray = array();
633 $mainFeatureTypeInfo = $this->gPage->getMainFeatureTypeInfo(); // 主要機能タイプ情報
634 for ($i = 0; $i < count($mainFeatureTypeInfo); $i++){
635 $value = $mainFeatureTypeInfo[$i]['value'];
636 $name = $mainFeatureTypeInfo[$i]['name'];
637 $mainFeatureTypeArray[$value] = $name;
642 $menu = $this->contentMenu[$deviceType]; // コンテンツ編集メニュー
643 $subMenu = $this->subContentMenu[$deviceType]; // サブコンテンツ編集メニュー
644 // if (empty($menu) && empty($subMenu)) return '';
647 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
649 // $title = '<i class="glyphicon glyphicon-eye-open btn-lg"></i> ' . self::MENU_TITLE_PREVIEW; // アイコン付加
650 $title = self::MENU_TITLE_PREVIEW; // アイコン付加
651 switch ($deviceType){
654 $menuTag .= '<li><a href="#" onclick="m3ShowPreviewWindow(0, \'' . $this->gEnv->getDefaultUrl() . '\');return false;">' . $title . '</a></li>' . M3_NL;
657 $menuTag .= '<li><a href="#" onclick="m3ShowPreviewWindow(1, \'' . $this->gEnv->getDefaultMobileUrl() . '\');return false;">' . $title . '</a></li>' . M3_NL;
659 case 2: // スマートフォン用画面のとき
660 $menuTag .= '<li><a href="#" onclick="m3ShowPreviewWindow(2, \'' . $this->gEnv->getDefaultSmartphoneUrl() . '\');return false;">' . $title . '</a></li>' . M3_NL;
667 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
668 $menuTag .= '<li class="divider"></li>' . M3_NL;
671 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
672 $menuTag .= '<li class="dropdown-header">' . self::MENU_TITLE_CONTENT . '</li>' . M3_NL;
674 for ($i = 0; $i < count($menu); $i++){
675 $widgetId = $menu[$i]['wd_id'];
676 $title = $this->getCurrentLangString($menu[$i]['wd_content_name']); // ウィジェットのコンテンツ名を取得
680 $contentType = $menu[$i]['wd_type'];
681 $title = $mainContentTypeArray[$contentType];
683 if (empty($title)) $title = $menu[$i]['wd_name']; // コンテンツ名が取得できないときはウィジェット名を設定
684 if (empty($title)) continue;
686 $iconTitle = 'ウィジェット設定';
687 $iconUrl = $this->gEnv->getRootUrl() . self::CONFIG_ICON_FILE; // ウィジェット設定アイコン
688 $iconTag = '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" />';
689 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
690 $menuTag .= '<li ><a href="#" onclick="m3ShowConfigWindow(\'' . $widgetId . '\', 0, 0);return false;">' . $iconTag . $this->convertToDispString($title) . '</a></li>' . M3_NL;
695 $subMenu = $this->arrangeSubMenu($subMenu);
696 if (!empty($subMenu)){
698 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
699 $menuTag .= '<li class="divider"></li>' . M3_NL;
702 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
703 $menuTag .= '<li class="dropdown-header">' . self::MENU_TITLE_SUB_CONTENT . '</li>' . M3_NL;
705 for ($i = 0; $i < count($subMenu); $i++){
706 $widgetId = $subMenu[$i]['wd_id'];
707 if ($subMenu[$i]['wd_content_widget_id']) $widgetId = $subMenu[$i]['wd_content_widget_id'];
708 $title = $this->getCurrentLangString($subMenu[$i]['wd_content_name']); // ウィジェットのコンテンツ名を取得
711 // コンテンツ単位でタイトルを取得(主要コンテンツ、補助コンテンツ、主要機能タイプの順に探す)
712 $contentType = $subMenu[$i]['wd_content_type'];
713 $title = $mainContentTypeArray[$contentType];
714 if (empty($title)) $title = $subContentTypeArray[$contentType];
715 if (empty($title)) $title = $mainFeatureTypeArray[$contentType];
717 if (empty($title)) $title = $subMenu[$i]['wd_name']; // サブコンテンツ名が取得できないときはウィジェット名を設定
718 if (empty($title)) continue;
720 $iconTitle = 'ウィジェット設定';
721 $iconUrl = $this->gEnv->getRootUrl() . self::CONFIG_ICON_FILE; // ウィジェット設定アイコン
722 $iconTag = '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" />';
723 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
724 $menuTag .= '<li ><a href="#" onclick="m3ShowConfigWindow(\'' . $widgetId . '\', 0, 0);return false;">' . $iconTag . $this->convertToDispString($title) . '</a></li>' . M3_NL;
728 // サーバ管理でのシステム運用の場合はアクセスポイントの制御項目を表示しない
729 if ($this->systemType == self::SYSTEM_TYPE_SERVER_ADMIN) return $menuTag; // サーバ管理の場合
732 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
733 $menuTag .= '<li class="divider"></li>' . M3_NL;
737 $openSiteMessage = 'アクセスポイントを非公開';
738 $iconTitle = 'アクセスポイントを非公開';
739 $iconUrl = $this->gEnv->getRootUrl() . self::SITE_CLOSE_ICON_FILE;// アクセスポイント非公開
741 $openSiteMessage = 'アクセスポイントを公開';
742 $iconTitle = 'アクセスポイントを公開';
743 $iconUrl = $this->gEnv->getRootUrl() . self::SITE_OPEN_ICON_FILE; // アクセスポイント公開
745 $menuTag .= str_repeat(M3_INDENT_SPACE, self::SITEMENU_INDENT_LEBEL + 2);
746 $menuTag .= '<li><a href="#" onclick="siteOpen(' . $deviceType . ',' . intval(!$isVisibleSite) . ');return false;">';
747 $menuTag .= '<img src="' . $this->getUrl($iconUrl) . '" width="' . self::ICON_SIZE . '" height="' . self::ICON_SIZE . '" border="0" alt="' . $iconTitle . '" />' . $openSiteMessage . '</a></li>' . M3_NL;
751 * サブコンテンツ編集メニュー項目の重複を調整
753 * @param array $menu サブメニュー
754 * @return array 修正済みサブメニュー
756 function arrangeSubMenu($menu)
760 for ($i = 0; $i < count($menu); $i++){
761 $menuRow = $menu[$i];
762 $widgetId = $menu[$i]['wd_id'];
763 if (!empty($menu[$i]['wd_content_widget_id'])) $widgetId = $menu[$i]['wd_content_widget_id'];
764 if (!in_array($widgetId, $widgets)){
765 $destMenu[] = $menuRow;
766 $widgets[] = $widgetId;
774 * @param object $navbarDef メニューバー定義
777 function createSubMenubar($navbarDef)
781 if (!empty($navbarDef->title)){
782 $title = $this->convertToDispString($navbarDef->title);
783 if (!empty($navbarDef->help)) $title = '<span ' . $navbarDef->help . '>' . $title . '</span>';
784 $titleTag = '<div class="navbar-text title">' . $title . '</div>';
789 $baseUrl = $navbarDef->baseurl;
790 $menu = $navbarDef->menu;
791 $menuItemCount = count($menu);
792 for ($i = 0; $i < $menuItemCount; $i++){
793 $menuItem = $menu[$i];
794 $name = $menuItem->name;
795 $tagId = $menuItem->tagid;
796 $active = $menuItem->active;
797 $disabled = $menuItem->disabled;
798 $task = $menuItem->task;
799 $url = $menuItem->url;
800 $help = $menuItem->help;
801 $subMenu = $menuItem->submenu;
803 if (empty($subMenu)){ // サブメニューを持たない場合
805 $buttonType = 'btn-primary';
807 $buttonType = 'btn-success';
809 if ($disabled) $buttonType .= ' disabled'; // 使用可否
810 $tagIdAttr = ''; // タグID
811 if (!empty($tagId)) $tagIdAttr = ' id="' . $tagId . '"';
813 // タスクまたはURLが設定されている場合はリンクを設定
815 $linkUrl = ''; // リンク先
816 if (!empty($task)) $linkUrl = createUrl($baseUrl, 'task=' . $task);
817 if (empty($linkUrl)) $linkUrl = $url;
818 if (!empty($linkUrl)) $event = ' onclick="window.location=\'' . $linkUrl . '\';"';
819 $button = '<button type="button"' . $tagIdAttr . ' class="btn navbar-btn ' . $buttonType . '"' . $event . '>' . $this->convertToDispString($name) . '</button>';
820 if (!empty($help)) $button = '<span ' . $help . '>' . $button . '</span>';
821 $menuTag .= '<li>' . $button . '</li>';
822 } else { // サブメニューがある場合
825 for ($j = 0; $j < count($subMenu); $j++){
826 $subMenuItem = $subMenu[$j];
827 $subName = $subMenuItem->name;
828 $subTagId = $subMenuItem->tagid;
829 $subActive = $subMenuItem->active;
830 $subDisabled = $subMenuItem->disabled;
831 $task = $subMenuItem->task;
832 $url = $subMenuItem->url;
834 $linkUrl = ''; // リンク先
835 if (!empty($task)) $linkUrl = createUrl($baseUrl, 'task=' . $task);
836 if (empty($linkUrl)) $linkUrl = $url;
837 if (empty($linkUrl)) $linkUrl = '#';
839 if ($subDisabled){ // 使用可否
840 $classActive = ' class="disabled"';
842 } else if ($subActive){
843 $classActive = ' class="active"';
844 $active = true; // 親の階層もアクティブにする
846 $tagIdAttr = ''; // タグID
847 if (!empty($subTagId)) $tagIdAttr = ' id="' . $subTagId . '"';
848 $subMenuTag .= '<li' . $tagIdAttr . $classActive . '><a href="' . $this->getUrl($linkUrl) . '">' . $this->convertToDispString($subName) . '</a></li>';
850 $subMenuTag = '<ul class="dropdown-menu" role="menu">' . $subMenuTag . '</ul>';
853 $buttonType = 'btn-primary';
855 $buttonType = 'btn-success';
857 $menuTag .= '<li><a class="btn navbar-btn ' . $buttonType . '" data-toggle="dropdown" href="#" >' . $this->convertToDispString($name) . ' <span class="caret"></span></a>' . $subMenuTag . '</li>';
860 if (!empty($menuTag)) $menuTag = '<ul class="nav navbar-nav">' . $menuTag . '</ul>';
863 $titleTag = $this->gDesign->createSubMenubarTitleTag($navbarDef, 2/*システム画面(共通設定画面等)*/);
866 $menuTag = $this->gDesign->createSubMenubarMenuTag($navbarDef);
868 return array($titleTag, $menuTag);