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-2012 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: admin_mainSmenudefWidgetContainer.php 4979 2012-06-19 05:53:00Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getCurrentWidgetContainerPath() . '/admin_mainBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/admin_mainDb.php');
19 class admin_mainSmenudefWidgetContainer extends admin_mainBaseWidgetContainer
21 private $db; // DB接続オブジェクト
22 private $serialNo; // 選択中の項目のシリアル番号
23 private $serialArray = array(); // 表示中のシリアル番号
24 private $menuId; // 現在選択中のメニューID
25 private $menuItemType; // メニュー項目タイプ
26 private $menuDeviceType; // メニューの端末タイプ
27 private $currentPageSubId; // 現在のページサブID
28 private $contentId; // 現在のコンテンツID
29 private $isExistsMenuItem; // メニュー項目が存在するかどうか
30 private $isExistsPreviewMenuItem; // プレビューメニュー項目が存在するかどうか
31 private $itemTypeArray; // メニュー項目の種類
32 private $menuHtml; // コンテンツメニュー
33 private $isMultiLang; // 多言語対応画面かどうか
34 private $availableLangRows; // 利用可能な言語
35 private $availableLangArray; // 利用可能な言語
36 const MAIN_MENU_ID = 'main_menu'; // メインメニューID
37 const WIDGET_TYPE_MENU = 'menu'; // メニュー型のウィジェット(キャッシュクリア用)
38 const CONTENT_TYPE_PC = ''; // 汎用コンテンツのコンテンツタイプ(PC用)
39 const CONTENT_TYPE_MOBILE = 'mobile'; // 汎用コンテンツのコンテンツタイプ(携帯用)
40 const CONTENT_TYPE_SMARTPHONE = 'smartphone'; // 汎用コンテンツのコンテンツタイプ(スマートフォン用)
41 const CONTENT_WIDGET_ID_PC = 'default_content'; // コンテンツ編集ウィジェット(PC用)
42 const CONTENT_WIDGET_ID_MOBILE = 'm/content'; // コンテンツ編集ウィジェット(携帯用)
43 const CONTENT_WIDGET_ID_SMARTPHONE = 's/content'; // コンテンツ編集ウィジェット(スマートフォン用)
44 const LANG_ICON_PATH = '/images/system/flag/'; // 言語アイコンパス
45 const ITEM_NAME_HEAD = 'item_name_'; // 多言語対応名前ヘッダ
50 function __construct()
53 parent::__construct();
56 $this->db = new admin_mainDb();
59 $this->itemTypeArray = array( array( 'name' => $this->_('Link'), 'value' => '0'), // リンク
60 array( 'name' => $this->_('Folder'), 'value' => '1'), // フォルダ
61 array( 'name' => $this->_('Text'), 'value' => '2'), // テキスト
62 array( 'name' => $this->_('Separator'), 'value' => '3')); // セパレータ
64 // ##### 多言語対応用データ作成 #####
65 $this->isMultiLang = $this->gEnv->isMultiLanguageSite(); // 多言語対応画面かどうか
66 $this->availableLangRows = array();
67 $this->availableLangArray = array();
68 $ret = $this->db->getAvailableLang($rows); // 利用可能な言語を取得
70 for ($i = 0; $i < count($rows); $i++){
71 $langId = $rows[$i]['ln_id'];
72 $this->availableLangArray[$langId] = $rows[$i];
74 $this->availableLangRows = $rows;
80 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
81 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
83 * @param RequestManager $request HTTPリクエスト処理クラス
84 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
85 * @return string テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
87 function _setTemplate($request, &$param)
89 $task = $request->trimValueOf('task');
91 if ($task == 'smenudef_detail'){ // 詳細画面
92 return 'smenudef_detail.tmpl.html';
94 return 'smenudef.tmpl.html';
100 * ヘルプの設定を行う場合はヘルプIDを返す。
101 * ヘルプデータの読み込むディレクトリは「自ウィジェットディレクトリ/include/help」に固定。
103 * @param RequestManager $request HTTPリクエスト処理クラス
104 * @param object $param 任意使用パラメータ。そのまま_assign()に渡る
105 * @return string ヘルプID。ヘルプデータはファイル名「help_[ヘルプID].php」で作成。ヘルプを使用しない場合は空文字列「''」を返す。
107 function _setHelp($request, &$param)
114 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
116 * @param RequestManager $request HTTPリクエスト処理クラス
117 * @param object $param 任意使用パラメータ。_setTemplate()と共有。
120 function _assign($request, &$param)
122 $localeText = array();
123 $task = $request->trimValueOf('task');
125 if ($task == 'smenudef_detail'){ // 詳細画面
126 $this->createDetail($request);
129 $localeText['msg_add'] = $this->_('Add menu item?'); // 項目を新規追加しますか?
130 $localeText['msg_update'] = $this->_('Update menu item?'); // 項目を更新しますか?
131 $localeText['msg_delete'] = $this->_('Delete menu item?'); // 項目を削除しますか?
132 $localeText['label_menu_item_detail'] = $this->_('Menu Item Detail'); // メニュー項目詳細
133 $localeText['label_go_back'] = $this->_('Go back'); // 戻る
134 $localeText['label_name'] = $this->_('Name'); // 名前
135 $localeText['label_lang'] = $this->_('Language'); // 言語
136 $localeText['label_new'] = $this->_('New'); // 新規
137 $localeText['label_item_type'] = $this->_('Item Type'); // 項目タイプ
138 $localeText['label_link_type'] = $this->_('Link Type'); // 表示方法
139 $localeText['label_link_self'] = $this->_('Open page in the same window'); // 同ウィンドウで表示
140 $localeText['label_link_other'] = $this->_('Open page in the other window'); // 別ウィンドウで表示
141 $localeText['label_select_link'] = $this->_('Select Link Type'); // リンク先を選択
142 $localeText['label_unselected'] = $this->_('Unselected'); // 未選択
143 $localeText['label_link_top'] = $this->_('Top'); // トップ
144 $localeText['label_input'] = $this->_('Input URL'); // URL任意設定
145 $localeText['label_page_id'] = $this->_('Page ID:'); // ページID:
146 $localeText['label_content'] = $this->_('General Contents:'); // 汎用コンテンツ:
147 $localeText['label_url'] = $this->_('URL'); // リンク先URL
148 $localeText['label_item_visible'] = $this->_('Item Control'); // 表示制御
149 $localeText['label_visible'] = $this->_('Visible'); // 公開
150 $localeText['msg_link_to_content'] = $this->_('Cotrol visible status linked to contents.'); // リンク先のコンテンツに連動
151 $localeText['label_desc'] = $this->_('Description'); // 説明
152 $localeText['label_delete'] = $this->_('Delete'); // 削除
153 $localeText['label_update'] = $this->_('Update'); // 更新
154 $localeText['label_add'] = $this->_('Add'); // 新規追加
156 $this->createList($request);
159 $localeText['msg_select_item'] = $this->_('Select menu item to edit.'); // 編集する項目を選択してください
160 $localeText['msg_select_del_item'] = $this->_('Select menu item to delete.'); // 削除する項目を選択してください
161 $localeText['msg_delete_item'] = $this->_('Delete selected item?');// 選択項目を削除しますか?
162 $localeText['label_menu_item_list'] = $this->_('Menu Item List'); // メニュー項目一覧
163 $localeText['label_new'] = $this->_('New'); // 新規
164 $localeText['label_edit'] = $this->_('Edit'); // 編集
165 $localeText['label_delete'] = $this->_('Delete'); // 削除
166 $localeText['label_check'] = $this->_('Select'); // 選択
167 $localeText['label_name'] = $this->_('Name'); // 名前
168 $localeText['label_lang'] = $this->_('Language'); // 言語
169 $localeText['label_url'] = $this->_('Url'); // リンク先URL
170 $localeText['label_link_type'] = $this->_('Link Type'); // 表示方法
171 $localeText['label_visible'] = $this->_('Visible'); // 公開
172 $localeText['label_operation'] = $this->_('Operation'); // 操作
173 $localeText['label_menu_layout'] = $this->_('Menu Layout'); // メニューレイアウト
174 $localeText['msg_change_item_order'] = $this->_('Menu items can be sorted by mouse drag and drop.'); // マウスドラッグで項目の表示順を変更できます
176 $this->setLocaleText($localeText);
181 * @param RequestManager $request HTTPリクエスト処理クラス
184 function createList($request)
186 $userId = $this->gEnv->getCurrentUserId();
187 $langId = $this->gEnv->getCurrentLanguage(); // 表示言語を取得
189 $fixedMode = $request->trimValueOf('fixed_mode'); // メニュー定義IDが固定かどうか
190 if ($fixedMode == ''){ // 値が設定されていないときは設定
191 if ($request->trimValueOf('menuid') == ''){
194 $fixedMode = '1'; // 固定
197 $this->menuId = $request->trimValueOf('menuid'); // 現在選択中のメニュータイプ
198 if ($this->menuId == '') $this->menuId = self::MAIN_MENU_ID; // デフォルトは通常のメニュー
201 $this->menuDeviceType = 0; // メニューの端末タイプ
202 $ret = $this->db->getMenuId($this->menuId, $row);
203 if ($ret) $this->menuDeviceType = $row['mn_device_type'];
206 switch ($this->menuDeviceType){
209 $contType = self::CONTENT_TYPE_PC; // 汎用コンテンツのコンテンツタイプ
212 $contType = self::CONTENT_TYPE_MOBILE; // 汎用コンテンツのコンテンツタイプ
215 $contType = self::CONTENT_TYPE_SMARTPHONE; // 汎用コンテンツのコンテンツタイプ
219 $act = $request->trimValueOf('act');
220 if ($act == 'updatemenu'){ // メニュー項目順の更新のとき
221 $menuitems = $request->trimValueOf('menuitems');
222 if (!empty($menuitems)){
223 $menuItemNoArray = explode(',', $menuitems);
226 $this->db->orderMenuItems($this->menuId, 0/*1階層目*/, true/*表示項目のみ*/, $menuItemNoArray);
228 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU); // キャッシュをクリア
229 $this->gPage->updateParentWindow();// 親ウィンドウを更新
230 } else if ($act == 'delete'){ // メニュー項目の削除
231 $listedItem = explode(',', $request->trimValueOf('seriallist'));
233 for ($i = 0; $i < count($listedItem); $i++){
235 $itemName = 'item' . $i . '_selected';
236 $itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
238 if ($itemValue){ // チェック項目
239 $delItems[] = $listedItem[$i];
242 if (count($delItems) > 0){
243 $ret = $this->db->delMenuItems(implode($delItems, ','));
244 if ($ret){ // データ削除成功のとき
245 //$this->setGuidanceMsg('データを削除しました');
246 $this->setGuidanceMsg($this->_('Menu item deleted.')); // データを削除しました
248 //$this->setAppErrorMsg('データ削除に失敗しました');
249 $this->setAppErrorMsg($this->_('Failed in deleting menu item.')); // データ削除に失敗しました
252 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU); // キャッシュをクリア
253 $this->gPage->updateParentWindow();// 親ウィンドウを更新
256 if ($this->isMultiLang){ // 多言語対応の場合
257 $this->tmpl->setAttribute('show_multilang', 'visibility', 'visible');
259 $this->tmpl->setAttribute('show_singlelang', 'visibility', 'visible');
263 $this->db->getMenuIdList(array($this, 'menuIdListLoop'));
266 $this->createMenuList($this->menuId);
268 // メニュー項目が存在しないときはメニューのプレビューを表示しない
269 if (!$this->isExistsMenuItem) $this->tmpl->setAttribute('itemlist', 'visibility', 'hidden'); // メニュー項目一覧
270 if (!$this->isExistsPreviewMenuItem) $this->tmpl->setAttribute('menuitemlist', 'visibility', 'hidden');// メニュープレビュー
271 if ($fixedMode == '1') $this->tmpl->addVar("_widget", "sel_menu_id_disabled", 'disabled'); // メニューIDの選択可否
275 case self::CONTENT_TYPE_PC: // PC用
277 $contentEditWidget = self::CONTENT_WIDGET_ID_PC;
279 case self::CONTENT_TYPE_MOBILE: // 携帯用
280 $contentEditWidget = self::CONTENT_WIDGET_ID_MOBILE;
282 case self::CONTENT_TYPE_SMARTPHONE: // スマートフォン用
283 $contentEditWidget = self::CONTENT_WIDGET_ID_SMARTPHONE;
287 $this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示項目のシリアル番号を設定
288 $this->tmpl->addVar('_widget', 'content_widget_id', $contentEditWidget);// コンテンツ表示ウィジェット
289 $this->tmpl->addVar('_widget', 'admin_url', $this->getUrl($this->gEnv->getDefaultAdminUrl()));// 管理者URL
290 $this->tmpl->addVar("_widget", "fixed_mode", $fixedMode); // メニュー定義IDが固定かどうか
295 * @param RequestManager $request HTTPリクエスト処理クラス
298 function createDetail($request)
300 $userId = $this->gEnv->getCurrentUserId();
301 $langId = $this->gEnv->getCurrentLanguage(); // 表示言語を取得
303 $fixedMode = $request->trimValueOf('fixed_mode'); // メニュー定義IDが固定かどうか
304 $act = $request->trimValueOf('act');
305 $this->serialNo = $request->trimValueOf('serial'); // 選択項目のシリアル番号
306 $value = $request->trimValueOf('item_sel_menuid');
307 if ($value != '') $this->serialNo = $value; // メニュー項目が選択されている場合はシリアル番号を更新
308 $this->menuId = $request->trimValueOf('menuid'); // 現在選択中のメニューID
310 $name = $request->trimValueOf('item_name');
311 $desc = $request->trimValueOf('item_desc');
312 $this->menuItemType = $request->trimValueOf('item_type');
313 if ($this->menuItemType == '') $this->menuItemType = '0'; // デフォルトの項目タイプは通常リンク
314 $linkType = $request->trimValueOf('item_link_type');
315 $visible = ($request->trimValueOf('item_visible') == 'on') ? 1 : 0; // メニュー項目表示制御チェックボックス
316 $linkContent = ($request->trimValueOf('item_link_content') == 'on') ? 1 : 0; // コンテンツにリンクしてメニュー項目を表示制御するかどうか
317 $this->currentPageSubId = $request->trimValueOf('item_sub_id'); // ページサブID
318 $this->contentId = $request->trimValueOf('item_content_id'); // コンテンツID
319 $url = $request->trimValueOf('item_url'); // 入力URL
320 $url = str_replace($this->gEnv->getRootUrl(), M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, $url);// マクロ変換
323 if ($this->isMultiLang){ // 多言語対応の場合
324 $nameLangArray = array(); // 多言語対応文字列
325 for ($i = 0; $i < count($this->availableLangRows); $i++){
326 $inputLangId = $this->availableLangRows[$i]['ln_id'];
328 $itemName = self::ITEM_NAME_HEAD . $inputLangId;
329 $itemValue = $request->trimValueOf($itemName);
330 if (!empty($itemValue)) $nameLangArray[$inputLangId] = $itemValue;
333 if (!empty($name)) $nameLangArray[$this->gEnv->getDefaultLanguage()] = $name;
336 $this->menuDeviceType = 0; // メニューの端末タイプ
337 $ret = $this->db->getMenuId($this->menuId, $row);
338 if ($ret) $this->menuDeviceType = $row['mn_device_type'];
341 switch ($this->menuDeviceType){
344 $contType = self::CONTENT_TYPE_PC; // 汎用コンテンツのコンテンツタイプ
347 $contType = self::CONTENT_TYPE_MOBILE; // 汎用コンテンツのコンテンツタイプ
350 $contType = self::CONTENT_TYPE_SMARTPHONE; // 汎用コンテンツのコンテンツタイプ
354 $reloadData = false; // データの再読み込み
355 if ($act == 'add'){// 新規追加
357 $this->checkInput($name, $this->_('Name')); // 名前
358 $this->checkInput($this->menuId, $this->_('Menu ID')); // メニューID
359 //$this->checkInput($url, 'リンク先');
362 if ($this->getMsgCount() == 0){
363 // リンク先でメニューの表示制御を行う場合は、リンク先コンテンツタイプ、IDを取得
364 $linkContentType = ''; // コンテンツタイプ
365 $linkContentId = ''; // コンテンツID
366 if (!empty($linkContent)){
367 list($tmp, $queryStr) = explode('?', $url, 2);
368 if (!empty($queryStr)){
369 parse_str($queryStr, $params);
370 if (isset($params[M3_REQUEST_PARAM_CONTENT_ID]) || isset($params[M3_REQUEST_PARAM_CONTENT_ID_SHORT])){
371 $linkContentType = M3_VIEW_TYPE_CONTENT; // 汎用コンテンツ
372 $linkContentId = isset($params[M3_REQUEST_PARAM_CONTENT_ID]) ? $params[M3_REQUEST_PARAM_CONTENT_ID] : $params[M3_REQUEST_PARAM_CONTENT_ID_SHORT];
377 // ##### 格納用の名前を作成 #####
378 if ($this->isMultiLang){ // 多言語対応の場合
379 $nameLangStr = $this->serializeLangArray($nameLangArray);
381 $nameLangStr = $name;
383 $ret = $this->db->addMenuItem($this->menuId, 0, $nameLangStr, $desc, 0/*項目順は自動設定*/, $this->menuItemType, $linkType, $url, $visible, $newId, $linkContentType, $linkContentId);
385 //$this->setGuidanceMsg('データを追加しました');
386 $this->setGuidanceMsg($this->_('Menu item added.')); // データを追加しました
388 $this->serialNo = $newId; // メニュー項目IDを更新
389 $reloadData = true; // データの再読み込み
391 //$this->setAppErrorMsg('データ追加に失敗しました');
392 $this->setAppErrorMsg($this->_('Failed in adding menu item.')); // データ追加に失敗しました
394 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU); // キャッシュをクリア
395 $this->gPage->updateParentWindow();// 親ウィンドウを更新
397 } else if ($act == 'update'){ // 項目更新の場合
399 $this->checkInput($name, $this->_('Name')); // 名前
400 //$this->checkInput($url, 'リンク先');
403 if ($this->getMsgCount() == 0){
404 // リンク先でメニューの表示制御を行う場合は、リンク先コンテンツタイプ、IDを取得
405 $linkContentType = ''; // コンテンツタイプ
406 $linkContentId = ''; // コンテンツID
407 if (!empty($linkContent)){
408 list($tmp, $queryStr) = explode('?', $url, 2);
409 if (!empty($queryStr)){
410 parse_str($queryStr, $params);
411 if (isset($params[M3_REQUEST_PARAM_CONTENT_ID]) || isset($params[M3_REQUEST_PARAM_CONTENT_ID_SHORT])){
412 $linkContentType = M3_VIEW_TYPE_CONTENT; // 汎用コンテンツ
413 $linkContentId = isset($params[M3_REQUEST_PARAM_CONTENT_ID]) ? $params[M3_REQUEST_PARAM_CONTENT_ID] : $params[M3_REQUEST_PARAM_CONTENT_ID_SHORT];
418 // ##### 格納用の名前を作成 #####
419 if ($this->isMultiLang){ // 多言語対応の場合
420 $nameLangStr = $this->serializeLangArray($nameLangArray);
422 $nameLangStr = $name;
424 $ret = $this->db->updateMenuItem($this->serialNo, $nameLangStr, $desc, $this->menuItemType, $linkType, $url, $visible, $linkContentType, $linkContentId);
426 //$this->setGuidanceMsg('データを更新しました');
427 $this->setGuidanceMsg($this->_('Menu item updated.')); // データを更新しました
429 $reloadData = true; // データの再読み込み
431 //$this->setAppErrorMsg('データ更新に失敗しました');
432 $this->setAppErrorMsg($this->_('Failed in updating menu item.')); // データ更新に失敗しました
434 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU); // キャッシュをクリア
435 $this->gPage->updateParentWindow();// 親ウィンドウを更新
437 } else if ($act == 'delete'){ // 項目削除の場合
438 $ret = $this->db->delMenuItems($this->serialNo);
439 if ($ret){ // データ削除成功のとき
440 //$this->setGuidanceMsg('データを削除しました');
441 $this->setGuidanceMsg($this->_('Menu item deleted.')); // データを削除しました
443 //$this->setAppErrorMsg('データ削除に失敗しました');
444 $this->setAppErrorMsg($this->_('Failed in deleting menu item.')); // データ削除に失敗しました
446 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU); // キャッシュをクリア
447 $this->gPage->updateParentWindow();// 親ウィンドウを更新
448 } else if ($act == 'select'){ // ページサブIDを変更
449 if ($this->currentPageSubId == '_root'){
450 $url = M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END . '/';
451 } else if ($this->currentPageSubId == '_other'){ // 任意設定以外のとき
454 $url = $this->gEnv->getDefaultUrl() . '?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=' . $this->currentPageSubId;
455 if (!empty($this->contentId)) $url .= '&' . M3_REQUEST_PARAM_CONTENT_ID . '=' . $this->contentId;
457 } else if ($act == 'getmenu'){ // コンテンツ選択メニュー取得
459 $contentSerial = $request->trimValueOf('content_serial');
460 $ret = $this->db->getContentBySerial($contentSerial, $row);
461 if ($ret) $this->contentId = $row['cn_id'];
464 $this->menuHtml = '<select name="item_content_id" onchange="selectPage();">';
465 $this->menuHtml .= '<option value="">-- 未選択 --</option>';
466 $this->db->getAllContents($langId, $contType, array($this, 'contentListLoop'));
467 $this->menuHtml .= '</select>';
468 $this->gInstance->getAjaxManager()->addData('menu_html', $this->menuHtml);
470 $reloadData = true; // データの再読み込み
472 if ($reloadData){ // データの再読み込み
473 if (empty($this->serialNo)){ // 新規項目追加のとき
475 $linkType = 0; // リンクタイプ
477 $linkContent = 0; // コンテンツにリンクしてメニュー項目を表示制御するかどうか
480 $ret = $this->db->getMenuItem($this->serialNo, $row);
483 $this->serialNo = $row['md_id']; // ID
484 $name = $this->getDefaultLangString($row['md_name']); // 名前
485 $desc = $row['md_description']; // 説明
486 $this->menuItemType = $row['md_type']; // 項目タイプ
487 $linkType = $row['md_link_type']; // リンクタイプ
488 $visible = $row['md_visible'];
489 $url = $row['md_link_url']; // リンク先
492 if ($url == M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END . '/'){ // トップのとき
493 $this->currentPageSubId = '_root';
496 $testUrl = str_replace(M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, $this->gEnv->getRootUrl(), $url); // マクロ展開
497 $ret = $this->gEnv->parseUrl($testUrl, $pageId, $pageSubId, $paramArray);
498 if (!$ret) $this->currentPageSubId = '_other'; // 他サイトへのリンクのとき
500 // コンテンツにリンクしてメニュー項目を表示制御するかどうか
502 if (!empty($row['md_content_type'])) $linkContent = 1; // リンクコンテンツが設定されている場合はメニューの表示制御を行う
504 // ##### 多言語対応用データ作成 #####
505 if ($this->isMultiLang){ // 多言語対応の場合
506 $nameLangArray = $this->unserializeLangArray($row['md_name']);
513 $url = str_replace(M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, $this->gEnv->getRootUrl(), $url); // マクロ展開
515 $contentType = ''; // コンテンツタイプ(ページ属性)
516 if ($this->currentPageSubId == '_root'){
517 $this->tmpl->setAttribute('input_no_url', 'visibility', 'visible');// URL非表示データ
518 $this->tmpl->addVar('_widget', 'root_selected', 'selected'); // ページサブID選択
519 } else if ($this->currentPageSubId == '_other'){
520 $this->tmpl->setAttribute('input_url', 'visibility', 'visible');// URL入力エリア表示
521 $this->tmpl->addVar('_widget', 'other_selected', 'selected'); // ページサブID選択
522 } else { // ルート、任意設定以外のとき
523 $this->tmpl->setAttribute('input_no_url', 'visibility', 'visible');// URL非表示データ
526 $ret = $this->gEnv->parseUrl($url, $pageId, $pageSubId, $paramArray);
528 $this->currentPageSubId = $pageSubId;
531 $ret = $this->db->getPageInfo($this->gEnv->getDefaultPageId(), $this->currentPageSubId, $row);
533 $contentType = $row['pn_content_type'];
536 // メニューの端末タイプごとのアクセスポイントを取得
537 switch ($this->menuDeviceType){
540 $url = $this->gEnv->getDefaultUrl();
543 $url = $this->gEnv->getDefaultMobileUrl();
546 $url = $this->gEnv->getDefaultSmartphoneUrl();
551 switch ($contentType){
552 case M3_VIEW_TYPE_CONTENT: // 汎用コンテンツ
553 $this->contentId = $paramArray[M3_REQUEST_PARAM_CONTENT_ID];
554 $url .= '?' . M3_REQUEST_PARAM_CONTENT_ID . '=' . $this->contentId;
556 case M3_VIEW_TYPE_PRODUCT: // 製品
557 case M3_VIEW_TYPE_BBS: // BBS
558 case M3_VIEW_TYPE_BLOG: // ブログ
559 case M3_VIEW_TYPE_WIKI: // wiki
560 case M3_VIEW_TYPE_USER: // ユーザ作成コンテンツ
562 $url .= '?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=' . $this->currentPageSubId;
569 switch ($contentType){
570 case M3_VIEW_TYPE_CONTENT: // 汎用コンテンツ
571 $this->tmpl->setAttribute('sel_content', 'visibility', 'visible');// コンテンツ選択メニュー表示
572 $this->db->getAllContents($langId, $contType, array($this, 'contentListLoop'));
574 case M3_VIEW_TYPE_PRODUCT: // 製品
576 case M3_VIEW_TYPE_BBS: // BBS
578 case M3_VIEW_TYPE_BLOG: // ブログ
580 case M3_VIEW_TYPE_WIKI: // wiki
582 case M3_VIEW_TYPE_USER: // ユーザ作成コンテンツ
589 //$this->db->getPageIdList(array($this, 'pageSubIdLoop'), 1);// ウィジェットサブIDメニュー作成
590 switch ($this->menuDeviceType){
593 $defaultPageId = $this->gEnv->getDefaultPageId();
596 $defaultPageId = $this->gEnv->getDefaultMobilePageId();
599 $defaultPageId = $this->gEnv->getDefaultSmartphonePageId();
602 $this->db->getPageSubIdList($defaultPageId, ''/*言語なし*/, array($this, 'pageSubIdLoop'));
605 $this->createItemTypeMenu();
608 $this->db->getAllMenuItems($this->menuId, array($this, 'menuIdLoop'));
612 case self::CONTENT_TYPE_PC: // PC用
614 $contentEditWidget = self::CONTENT_WIDGET_ID_PC;
616 case self::CONTENT_TYPE_MOBILE: // 携帯用
617 $contentEditWidget = self::CONTENT_WIDGET_ID_MOBILE;
619 case self::CONTENT_TYPE_SMARTPHONE: // スマートフォン用
620 $contentEditWidget = self::CONTENT_WIDGET_ID_SMARTPHONE;
625 if ($this->isMultiLang){ // 多言語対応の場合
627 $this->tmpl->addVar("_widget", "lang", $this->createLangImage($this->gEnv->getDefaultLanguage()));
630 $this->tmpl->setAttribute('input_lang', 'visibility', 'visible');
631 $this->createInputLangText($nameLangArray);
635 $this->tmpl->addVar("_widget", "sel_item_name", $name); // 名前
636 $this->tmpl->addVar("_widget", "desc", $desc); // 説明
637 $this->tmpl->addVar("_widget", "sel_url", $url); // 表示するURL
638 $this->tmpl->addVar("input_url", "sel_url", $url); // 表示するURL
639 $this->tmpl->addVar("input_no_url", "sel_url", $url); // 表示するURL
641 if (!empty($contentType)) $attrStr = $this->_('Page Attribute:') . ' ' . $contentType; // ページ属性:
642 $this->tmpl->addVar("_widget", "attr", $attrStr); // ページ属性
643 $this->tmpl->addVar('_widget', 'content_widget_id', $contentEditWidget);// コンテンツ表示ウィジェット
646 case 0: // 同ウィンドウで開くリンク
647 $this->tmpl->addVar("_widget", "link_type_0", 'selected');
649 case 1: // 別ウィンドウで開くリンク
650 $this->tmpl->addVar("_widget", "link_type_1", 'selected');
653 // 項目表示、項目利用可否チェックボックス
655 if ($visible) $visibleStr = 'checked';
656 $this->tmpl->addVar("_widget", "sel_item_visible", $visibleStr);
658 if (!empty($linkContent)) $checked = 'checked';
659 $this->tmpl->addVar("_widget", "link_content", $checked);
662 $this->tmpl->addVar("_widget", "serial", $this->serialNo);
663 $this->tmpl->addVar("_widget", "menu_id", $this->menuId); // メニューID
664 $this->tmpl->addVar("_widget", "fixed_mode", $fixedMode); // メニュー定義IDが固定かどうか
667 if (empty($this->serialNo)){ // 新規追加項目を選択しているとき
668 $this->tmpl->setAttribute('add_button', 'visibility', 'visible');// 「新規追加」ボタン
670 $this->tmpl->setAttribute('del_button', 'visibility', 'visible');// 「削除」ボタン
676 * @param string $menuId メニューID
677 * @return string ツリーメニュータグ
679 function createMenuList($menuId)
681 if (!$this->db->getChildMenuItems($menuId, 0, $rows)) return;
683 $itemCount = count($rows);
684 for ($i = 0; $i < $itemCount; $i++){
688 $name = $this->getDefaultLangString($row['md_name']);
692 if ($this->isMultiLang){ // 多言語対応の場合
693 $lang = $this->createLangImageList($row['md_name']);
697 if ($row['md_visible']){
698 $visible = 'checked';
702 switch ($row['md_link_type']){
703 case 0: // 同ウィンドウで開くリンク
704 $linkString = $this->_('Self'); // 同
706 case 1: // 別ウィンドウで開くリンク
707 $linkString = $this->_('Other'); // 別
711 $serial = $this->convertToDispString($row['md_id']);
713 if ($serial == $this->serialNo){
714 $selected = 'checked';
717 // リンクURLからコンテンツIDを取得
718 $linkUrl = $row['md_link_url'];
721 $pos = strpos($linkUrl, M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END);
722 if ($pos === false){ // 見つからない場合
725 list($path, $param) = explode("?", $linkUrl);
726 $params = explode("&", $param);
727 $count = count($params);
728 for ($j = 0; $j < $count; $j++){
729 list($key, $value) = explode('=', $params[$j]);
730 if ($key == M3_REQUEST_PARAM_CONTENT_ID){
737 $linkUrlStr = str_replace(M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, '...', $linkUrl); // 表示テキスト
738 $linkUrl = str_replace(M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, $this->gEnv->getRootUrl(), $linkUrl); // マクロ展開
739 $linkUrlStr = '<a href="#" onclick="showUrl(\'' . $linkUrl . '\');">' . $this->convertToDispString($linkUrlStr) . '</a>';
742 $enableContentLink = '';
743 if (empty($contentId)) $enableContentLink = 'disabled';
746 'index' => $i, // 行番号
747 'serial' => $serial, // シリアル番号
748 'id' => $this->convertToDispString($row['md_id']), // ID
749 'name' => $this->convertToDispString($name), // 名前
750 'lang' => $lang, // 言語
751 'item_type' => $iconTag, // メニュー項目タイプアイコン
752 'link_type' => $linkString, // リンクタイプ
753 'link_str' => $linkUrlStr, // リンクURL
754 'content_id' => $contentId, // コンテンツID
755 'enable_content' => $enableContentLink, // コンテンツの編集ボタンの有効状態
756 'visible' => $visible, // メニュー項目表示制御
757 'selected' => $selected, // 項目選択用ラジオボタン
758 'label_edit_content' => $this->_('Edit Content') // コンテンツを編集
760 // $this->tmpl->addVars('itemlist', $itemRow);
761 // $this->tmpl->parseTemplate('itemlist', 'a');
762 if ($this->isMultiLang){ // 多言語対応のとき
763 $this->tmpl->addVars('itemlist2', $itemRow);
764 $this->tmpl->parseTemplate('itemlist2', 'a');
766 $this->tmpl->addVars('itemlist', $itemRow);
767 $this->tmpl->parseTemplate('itemlist', 'a');
771 if ($row['md_visible']){ // 表示項目のみ追加
772 $this->tmpl->addVars('menuitemlist', $itemRow);
773 $this->tmpl->parseTemplate('menuitemlist', 'a');
774 $this->isExistsPreviewMenuItem = true; // メニュー項目が存在するかどうか
776 $this->isExistsMenuItem = true; // メニュー項目が存在するかどうか
779 $this->serialArray[] = $serial;
783 * ページID、取得したデータをテンプレートに設定する
785 * @param int $index 行番号(0~)
786 * @param array $fetchedRow フェッチ取得した行
787 * @param object $param 未使用
788 * @return bool true=処理続行の場合、false=処理終了の場合
790 function pageIdLoop($index, $fetchedRow, $param)
794 'value' => $this->convertToDispString($fetchedRow['pg_id']), // ページID
795 'name' => $this->convertToDispString($fetchedRow['pg_name']), // ページ名
796 'selected' => $selected // 選択中かどうか
798 $this->tmpl->addVars('main_id_list', $row);
799 $this->tmpl->parseTemplate('main_id_list', 'a');
803 * ページサブID、取得したデータをテンプレートに設定する
805 * @param int $index 行番号(0~)
806 * @param array $fetchedRow フェッチ取得した行
807 * @param object $param 未使用
808 * @return bool true=処理続行の場合、false=処理終了の場合
810 function pageSubIdLoop($index, $fetchedRow, $param)
813 if ($fetchedRow['pg_id'] == $this->currentPageSubId) $selected = 'selected'; // 現在のページサブID
815 $contentType = $fetchedRow['pn_content_type'];
816 $name = $fetchedRow['pg_id'];
817 if (!empty($contentType)) $name .= '[' . $contentType . ']';
818 $name .= ' - ' . $fetchedRow['pg_name'];
821 'value' => $this->convertToDispString($fetchedRow['pg_id']), // ページID
822 'name' => $this->convertToDispString($name), // ページ名
823 'selected' => $selected // 選択中かどうか
825 $this->tmpl->addVars('sub_id_list', $row);
826 $this->tmpl->parseTemplate('sub_id_list', 'a');
830 * 取得したデータをテンプレートに設定する
832 * @param int $index 行番号(0~)
833 * @param array $fetchedRow フェッチ取得した行
834 * @param object $param 未使用
835 * @return bool true=処理続行の場合、false=処理終了の場合
837 function contentListLoop($index, $fetchedRow, $param)
839 $id = $fetchedRow['cn_id'];
841 if ($id == $this->contentId) $selected = 'selected'; // 現在のコンテンツID
843 'value' => $this->convertToDispString($id), // コンテンツID
844 'name' => $this->convertToDispString($fetchedRow['cn_name']), // コンテンツ名
845 'selected' => $selected // 選択中かどうか
847 $this->tmpl->addVars('content_list', $row);
848 $this->tmpl->parseTemplate('content_list', 'a');
851 $this->menuHtml .= '<option value="' . $id . '" ' . $selected . '>' . $this->convertToDispString($fetchedRow['cn_name']) . '</option>';
855 * 取得したデータをテンプレートに設定する
857 * @param int $index 行番号(0~)
858 * @param array $fetchedRow フェッチ取得した行
859 * @param object $param 未使用
860 * @return bool true=処理続行の場合、false=処理終了の場合
862 function menuIdListLoop($index, $fetchedRow, $param)
864 $value = $fetchedRow['mn_id'];
865 $name = $value . ' - ' . $fetchedRow['mn_name'];
868 if ($value == $this->menuId) $selected = 'selected';
871 'value' => $this->convertToDispString($value), // ページID
872 'name' => $this->convertToDispString($name), // ページ名
873 'selected' => $selected // 選択中かどうか
875 $this->tmpl->addVars('menu_id_list', $row);
876 $this->tmpl->parseTemplate('menu_id_list', 'a');
884 function createItemTypeMenu()
886 for ($i = 0; $i < count($this->itemTypeArray); $i++){
887 $value = $this->itemTypeArray[$i]['value'];
888 $name = $this->itemTypeArray[$i]['name'];
891 if ($value == $this->menuItemType) $selected = 'selected';
894 'value' => $value, // ページID
895 'name' => $name, // ページ名
896 'selected' => $selected // 選択中かどうか
898 $this->tmpl->addVars('item_type_list', $row);
899 $this->tmpl->parseTemplate('item_type_list', 'a');
905 * @param int $index 行番号(0~)
906 * @param array $fetchedRow フェッチ取得した行
907 * @param object $param 未使用
908 * @return bool true=処理続行の場合、false=処理終了の場合
910 function menuIdLoop($index, $fetchedRow, $param)
912 $value = $this->convertToDispString($fetchedRow['md_id']);
913 $name = $this->getDefaultLangString($fetchedRow['md_name']);
916 if ($value == $this->serialNo) $selected = 'selected';
919 'value' => $value, // メニュー項目ID
920 'name' => $this->convertToDispString($name), // メニュー項目名
921 'selected' => $selected // 選択中かどうか
923 $this->tmpl->addVars('menuid_list', $row);
924 $this->tmpl->parseTemplate('menuid_list', 'a');
930 * @param string $src 多言語対応文字列
931 * @return string 言語アイコンタグ
933 function createLangImageList($src)
936 $langArray = $this->unserializeLangArray($src);
937 $keys = array_keys($langArray);
939 for ($i = 0; $i < count($this->availableLangRows); $i++){
940 $langId = $this->availableLangRows[$i]['ln_id'];
941 if (in_array($langId, $keys)) $imageTag .= $this->createLangImage($langId);
948 * @param string $id 言語ID
949 * @return string 言語アイコンタグ
951 function createLangImage($id)
953 $langInfo = $this->availableLangArray[$id];
954 if (!isset($langInfo)) return '';
956 if ($this->gEnv->getCurrentLanguage() == 'ja'){ // 日本語の場合
957 $langName = $langInfo['ln_name'];
959 $langName = $langInfo['ln_name_en'];
962 $iconTitle = $langName;
963 $iconUrl = $this->gEnv->getRootUrl() . self::LANG_ICON_PATH . $langInfo['ln_image_filename']; // 画像ファイル
964 $iconTag = '<img src="' . $this->getUrl($iconUrl) . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
965 $imageTag .= $iconTag;
971 * @param array $nameArray 多言語対応文字列
974 function createInputLangText($nameArray)
976 for ($i = 0; $i < count($this->availableLangRows); $i++){
977 $langId = $this->availableLangRows[$i]['ln_id'];
978 if ($langId == $this->gEnv->getDefaultLanguage()) continue; // デフォルト言語は除く
979 $langImage = $this->createLangImage($langId);
981 $value = $nameArray[$langId];
983 'id' => $langId, // 言語ID
984 'value' => $this->convertToDispString($value), // 入力値
985 'lang' => $langImage // 言語画像
987 $this->tmpl->addVars('input_lang', $row);
988 $this->tmpl->parseTemplate('input_lang', 'a');