OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / admin_main / include / container / admin_mainSmenudefWidgetContainer.php
1 <?php
2 /**
3  * コンテナクラス
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
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
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/admin_mainBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/admin_mainDb.php');
18
19 class admin_mainSmenudefWidgetContainer extends admin_mainBaseWidgetContainer
20 {
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_';                            // 多言語対応名前ヘッダ
46         
47         /**
48          * コンストラクタ
49          */
50         function __construct()
51         {
52                 // 親クラスを呼び出す
53                 parent::__construct();
54                 
55                 // DBオブジェクト作成
56                 $this->db = new admin_mainDb();
57                 
58                 // メニュー項目タイプ
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'));       // セパレータ
63                 
64                 // ##### 多言語対応用データ作成 #####
65                 $this->isMultiLang = $this->gEnv->isMultiLanguageSite();                        // 多言語対応画面かどうか
66                 $this->availableLangRows = array();
67                 $this->availableLangArray = array();
68                 $ret = $this->db->getAvailableLang($rows);                              // 利用可能な言語を取得
69                 if ($ret){
70                         for ($i = 0; $i < count($rows); $i++){
71                                 $langId = $rows[$i]['ln_id'];
72                                 $this->availableLangArray[$langId] = $rows[$i];
73                         }
74                         $this->availableLangRows = $rows;
75                 }
76         }
77         /**
78          * テンプレートファイルを設定
79          *
80          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
81          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
82          *
83          * @param RequestManager $request               HTTPリクエスト処理クラス
84          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
85          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
86          */
87         function _setTemplate($request, &$param)
88         {
89                 $task = $request->trimValueOf('task');
90                 
91                 if ($task == 'smenudef_detail'){                // 詳細画面
92                         return 'smenudef_detail.tmpl.html';
93                 } else {                        // 一覧画面
94                         return 'smenudef.tmpl.html';
95                 }
96         }
97         /**
98          * ヘルプデータを設定
99          *
100          * ヘルプの設定を行う場合はヘルプIDを返す。
101          * ヘルプデータの読み込むディレクトリは「自ウィジェットディレクトリ/include/help」に固定。
102          *
103          * @param RequestManager $request               HTTPリクエスト処理クラス
104          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
105          * @return string                                               ヘルプID。ヘルプデータはファイル名「help_[ヘルプID].php」で作成。ヘルプを使用しない場合は空文字列「''」を返す。
106          */
107         function _setHelp($request, &$param)
108         {       
109                 return 'menudef';
110         }
111         /**
112          * テンプレートにデータ埋め込む
113          *
114          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
115          *
116          * @param RequestManager $request               HTTPリクエスト処理クラス
117          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
118          * @param                                                               なし
119          */
120         function _assign($request, &$param)
121         {
122                 $localeText = array();
123                 $task = $request->trimValueOf('task');
124                 
125                 if ($task == 'smenudef_detail'){        // 詳細画面
126                         $this->createDetail($request);
127                         
128                         // テキストをローカライズ
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');     // 新規追加
155                 } else {                        // 一覧画面
156                         $this->createList($request);
157                         
158                         // テキストをローカライズ
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.');            // マウスドラッグで項目の表示順を変更できます
175                 }
176                 $this->setLocaleText($localeText);
177         }
178         /**
179          * 一覧画面作成
180          *
181          * @param RequestManager $request               HTTPリクエスト処理クラス
182          * @param                                                               なし
183          */
184         function createList($request)
185         {
186                 $userId         = $this->gEnv->getCurrentUserId();
187                 $langId = $this->gEnv->getCurrentLanguage();            // 表示言語を取得
188                 
189                 $fixedMode = $request->trimValueOf('fixed_mode');               // メニュー定義IDが固定かどうか
190                 if ($fixedMode == ''){          // 値が設定されていないときは設定
191                         if ($request->trimValueOf('menuid') == ''){
192                                 $fixedMode = '0';
193                         } else {
194                                 $fixedMode = '1';               // 固定
195                         }
196                 }
197                 $this->menuId = $request->trimValueOf('menuid');                // 現在選択中のメニュータイプ
198                 if ($this->menuId == '') $this->menuId = self::MAIN_MENU_ID;            // デフォルトは通常のメニュー
199
200                 // メニューの端末タイプを取得
201                 $this->menuDeviceType = 0;      // メニューの端末タイプ
202                 $ret = $this->db->getMenuId($this->menuId, $row);
203                 if ($ret) $this->menuDeviceType = $row['mn_device_type'];
204                 
205                 // コンテンツタイプを取得
206                 switch ($this->menuDeviceType){
207                         case 0:                 // PC用
208                         default:
209                                 $contType = self::CONTENT_TYPE_PC;                      // 汎用コンテンツのコンテンツタイプ
210                                 break;
211                         case 1:                 // 携帯用
212                                 $contType = self::CONTENT_TYPE_MOBILE;                  // 汎用コンテンツのコンテンツタイプ
213                                 break;
214                         case 2:                 // スマートフォン用
215                                 $contType = self::CONTENT_TYPE_SMARTPHONE;                      // 汎用コンテンツのコンテンツタイプ
216                                 break;
217                 }
218                 
219                 $act = $request->trimValueOf('act');
220                 if ($act == 'updatemenu'){              // メニュー項目順の更新のとき
221                         $menuitems = $request->trimValueOf('menuitems');
222                         if (!empty($menuitems)){
223                                 $menuItemNoArray = explode(',', $menuitems);
224                         
225                                 // メニューの並び順を変更
226                                 $this->db->orderMenuItems($this->menuId, 0/*1階層目*/, true/*表示項目のみ*/, $menuItemNoArray);
227                         }
228                         $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU);          // キャッシュをクリア
229                         $this->gPage->updateParentWindow();// 親ウィンドウを更新
230                 } else if ($act == 'delete'){           // メニュー項目の削除
231                         $listedItem = explode(',', $request->trimValueOf('seriallist'));
232                         $delItems = array();
233                         for ($i = 0; $i < count($listedItem); $i++){
234                                 // 項目がチェックされているかを取得
235                                 $itemName = 'item' . $i . '_selected';
236                                 $itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
237                                 
238                                 if ($itemValue){                // チェック項目
239                                         $delItems[] = $listedItem[$i];
240                                 }
241                         }
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.'));          // データを削除しました
247                                 } else {
248                                         //$this->setAppErrorMsg('データ削除に失敗しました');
249                                         $this->setAppErrorMsg($this->_('Failed in deleting menu item.'));               // データ削除に失敗しました
250                                 }
251                         }
252                         $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU);          // キャッシュをクリア
253                         $this->gPage->updateParentWindow();// 親ウィンドウを更新
254                 }
255                 // 一覧の表示タイプを設定
256                 if ($this->isMultiLang){                // 多言語対応の場合
257                         $this->tmpl->setAttribute('show_multilang', 'visibility', 'visible');
258                 } else {
259                         $this->tmpl->setAttribute('show_singlelang', 'visibility', 'visible');
260                 }
261                 
262                 // メニューID選択メニュー作成
263                 $this->db->getMenuIdList(array($this, 'menuIdListLoop'));
264                 
265                 // メニュー項目一覧を作成
266                 $this->createMenuList($this->menuId);
267                 
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の選択可否
272                 
273                 // コンテンツ編集用ウィジェット
274                 switch ($contType){
275                         case self::CONTENT_TYPE_PC:                     // PC用
276                         default:
277                                 $contentEditWidget = self::CONTENT_WIDGET_ID_PC;
278                                 break;
279                         case self::CONTENT_TYPE_MOBILE:                 // 携帯用
280                                 $contentEditWidget = self::CONTENT_WIDGET_ID_MOBILE;
281                                 break;
282                         case self::CONTENT_TYPE_SMARTPHONE:                     // スマートフォン用
283                                 $contentEditWidget = self::CONTENT_WIDGET_ID_SMARTPHONE;
284                                 break;
285                 }
286         
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が固定かどうか
291         }
292         /**
293          * 詳細画面作成
294          *
295          * @param RequestManager $request               HTTPリクエスト処理クラス
296          * @param                                                               なし
297          */
298         function createDetail($request)
299         {
300                 $userId         = $this->gEnv->getCurrentUserId();
301                 $langId = $this->gEnv->getCurrentLanguage();            // 表示言語を取得
302                 
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
309                 
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);// マクロ変換
321                 
322                 // 多言語入力を取得
323                 if ($this->isMultiLang){                // 多言語対応の場合
324                         $nameLangArray = array();               // 多言語対応文字列
325                         for ($i = 0; $i < count($this->availableLangRows); $i++){
326                                 $inputLangId = $this->availableLangRows[$i]['ln_id'];
327
328                                 $itemName = self::ITEM_NAME_HEAD . $inputLangId;
329                                 $itemValue = $request->trimValueOf($itemName);
330                                 if (!empty($itemValue)) $nameLangArray[$inputLangId] = $itemValue;
331                         }
332                         // デフォルト言語を追加
333                         if (!empty($name)) $nameLangArray[$this->gEnv->getDefaultLanguage()] = $name;
334                 }
335                 
336                 $this->menuDeviceType = 0;      // メニューの端末タイプ
337                 $ret = $this->db->getMenuId($this->menuId, $row);
338                 if ($ret) $this->menuDeviceType = $row['mn_device_type'];
339                 
340                 // コンテンツタイプを取得
341                 switch ($this->menuDeviceType){
342                         case 0:                 // PC用
343                         default:
344                                 $contType = self::CONTENT_TYPE_PC;                      // 汎用コンテンツのコンテンツタイプ
345                                 break;
346                         case 1:                 // 携帯用
347                                 $contType = self::CONTENT_TYPE_MOBILE;                  // 汎用コンテンツのコンテンツタイプ
348                                 break;
349                         case 2:                 // スマートフォン用
350                                 $contType = self::CONTENT_TYPE_SMARTPHONE;                      // 汎用コンテンツのコンテンツタイプ
351                                 break;
352                 }
353
354                 $reloadData = false;            // データの再読み込み
355                 if ($act == 'add'){// 新規追加
356                         // 入力チェック
357                         $this->checkInput($name, $this->_('Name'));             // 名前
358                         $this->checkInput($this->menuId, $this->_('Menu ID'));  // メニューID
359                         //$this->checkInput($url, 'リンク先');
360
361                         // エラーなしの場合は、データを登録
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];
373                                                 }
374                                         }
375                                 }
376                                 
377                                 // ##### 格納用の名前を作成 #####
378                                 if ($this->isMultiLang){                // 多言語対応の場合
379                                         $nameLangStr = $this->serializeLangArray($nameLangArray);
380                                 } else {
381                                         $nameLangStr = $name;
382                                 }
383                                 $ret = $this->db->addMenuItem($this->menuId, 0, $nameLangStr, $desc, 0/*項目順は自動設定*/, $this->menuItemType, $linkType, $url, $visible, $newId, $linkContentType, $linkContentId);
384                                 if ($ret){
385                                         //$this->setGuidanceMsg('データを追加しました');
386                                         $this->setGuidanceMsg($this->_('Menu item added.'));    // データを追加しました
387                                         
388                                         $this->serialNo = $newId;               // メニュー項目IDを更新
389                                         $reloadData = true;             // データの再読み込み
390                                 } else {
391                                         //$this->setAppErrorMsg('データ追加に失敗しました');
392                                         $this->setAppErrorMsg($this->_('Failed in adding menu item.')); // データ追加に失敗しました
393                                 }
394                                 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU);          // キャッシュをクリア
395                                 $this->gPage->updateParentWindow();// 親ウィンドウを更新
396                         }
397                 } else if ($act == 'update'){           // 項目更新の場合
398                         // 入力チェック
399                         $this->checkInput($name, $this->_('Name'));             // 名前
400                         //$this->checkInput($url, 'リンク先');
401
402                         // エラーなしの場合は、データを更新
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];
414                                                 }
415                                         }
416                                 }
417                                 
418                                 // ##### 格納用の名前を作成 #####
419                                 if ($this->isMultiLang){                // 多言語対応の場合
420                                         $nameLangStr = $this->serializeLangArray($nameLangArray);
421                                 } else {
422                                         $nameLangStr = $name;
423                                 }
424                                 $ret = $this->db->updateMenuItem($this->serialNo, $nameLangStr, $desc, $this->menuItemType, $linkType, $url, $visible, $linkContentType, $linkContentId);
425                                 if ($ret){
426                                         //$this->setGuidanceMsg('データを更新しました');
427                                         $this->setGuidanceMsg($this->_('Menu item updated.'));          // データを更新しました
428                                         
429                                         $reloadData = true;             // データの再読み込み
430                                 } else {
431                                         //$this->setAppErrorMsg('データ更新に失敗しました');
432                                         $this->setAppErrorMsg($this->_('Failed in updating menu item.'));               // データ更新に失敗しました
433                                 }
434                                 $this->gCache->clearCacheByWidgetType(self::WIDGET_TYPE_MENU);          // キャッシュをクリア
435                                 $this->gPage->updateParentWindow();// 親ウィンドウを更新
436                         }
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.'));          // データを削除しました
442                         } else {
443                                 //$this->setAppErrorMsg('データ削除に失敗しました');
444                                 $this->setAppErrorMsg($this->_('Failed in deleting menu item.'));               // データ削除に失敗しました
445                         }
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'){                // 任意設定以外のとき
452                                 $url = '';
453                         } else {
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;
456                         }
457                 } else if ($act == 'getmenu'){          // コンテンツ選択メニュー取得
458                         // コンテンツIDを取得
459                         $contentSerial = $request->trimValueOf('content_serial');
460                         $ret = $this->db->getContentBySerial($contentSerial, $row);
461                         if ($ret) $this->contentId = $row['cn_id'];
462                         
463                         // コンテンツ選択メニューを作成
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);
469                 } else {
470                         $reloadData = true;             // データの再読み込み
471                 }
472                 if ($reloadData){               // データの再読み込み
473                         if (empty($this->serialNo)){            // 新規項目追加のとき
474                                 $name = '';             // 名前
475                                 $linkType = 0;  // リンクタイプ
476                                 $visible = 1;
477                                 $linkContent = 0;               // コンテンツにリンクしてメニュー項目を表示制御するかどうか
478                                 $url = '';      // リンク先
479                         } else {
480                                 $ret = $this->db->getMenuItem($this->serialNo, $row);
481                                 if ($ret){
482                                         // 取得値を設定
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'];     // リンク先
490                                         
491                                         // リンク先を解析
492                                         if ($url == M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END . '/'){           // トップのとき
493                                                 $this->currentPageSubId = '_root';
494                                         } else {
495                                                 // システム以下へのリンクかチェック
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';          // 他サイトへのリンクのとき
499                                         }
500                                         // コンテンツにリンクしてメニュー項目を表示制御するかどうか
501                                         $linkContent = 0;
502                                         if (!empty($row['md_content_type'])) $linkContent = 1;                  // リンクコンテンツが設定されている場合はメニューの表示制御を行う
503                                         
504                                         // ##### 多言語対応用データ作成 #####
505                                         if ($this->isMultiLang){                // 多言語対応の場合
506                                                 $nameLangArray = $this->unserializeLangArray($row['md_name']);
507                                         }
508                                 }
509                         }
510                 }
511                 
512                 // リンク先を実URLに変換
513                 $url = str_replace(M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END, $this->gEnv->getRootUrl(), $url);         // マクロ展開
514
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非表示データ
524
525                         // URLを解析
526                         $ret = $this->gEnv->parseUrl($url, $pageId, $pageSubId, $paramArray);
527                         if ($ret){
528                                 $this->currentPageSubId = $pageSubId;
529
530                                 // ページ情報を取得
531                                 $ret = $this->db->getPageInfo($this->gEnv->getDefaultPageId(), $this->currentPageSubId, $row);
532                                 if ($ret){
533                                         $contentType = $row['pn_content_type'];
534                                 }
535
536                                 // メニューの端末タイプごとのアクセスポイントを取得
537                                 switch ($this->menuDeviceType){
538                                         case 0:                 // PC用
539                                         default:
540                                                 $url = $this->gEnv->getDefaultUrl();
541                                                 break;
542                                         case 1:                 // 携帯用
543                                                 $url = $this->gEnv->getDefaultMobileUrl();
544                                                 break;
545                                         case 2:                 // スマートフォン用
546                                                 $url = $this->gEnv->getDefaultSmartphoneUrl();
547                                                 break;
548                                 }
549                                 
550                                 // 表示データタイプごとの処理
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;
555                                                 break;
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:                         // ユーザ作成コンテンツ
561                                         default:
562                                                 $url .= '?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=' . $this->currentPageSubId;
563                                                 break;
564                                 }
565                         }
566                 }
567                 
568                 // 表示データタイプごとの表示処理
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'));
573                                 break;
574                         case M3_VIEW_TYPE_PRODUCT:                              // 製品
575                                 break;
576                         case M3_VIEW_TYPE_BBS:                                  // BBS
577                                 break;
578                         case M3_VIEW_TYPE_BLOG:                         // ブログ
579                                 break;
580                         case M3_VIEW_TYPE_WIKI:                         // wiki
581                                 break;
582                         case M3_VIEW_TYPE_USER:                         // ユーザ作成コンテンツ
583                                 break;
584                         default:
585                                 break;
586                 }
587                 
588                 // リンク先設定用メニュー
589                 //$this->db->getPageIdList(array($this, 'pageSubIdLoop'), 1);// ウィジェットサブIDメニュー作成
590                 switch ($this->menuDeviceType){
591                         case 0:                 // PC用
592                         default:
593                                 $defaultPageId = $this->gEnv->getDefaultPageId();
594                                 break;
595                         case 1:                 // 携帯用
596                                 $defaultPageId = $this->gEnv->getDefaultMobilePageId();
597                                 break;
598                         case 2:                 // スマートフォン用
599                                 $defaultPageId = $this->gEnv->getDefaultSmartphonePageId();
600                                 break;
601                 }
602                 $this->db->getPageSubIdList($defaultPageId, ''/*言語なし*/, array($this, 'pageSubIdLoop'));
603
604                 // メニュー項目タイプメニュー
605                 $this->createItemTypeMenu();
606                 
607                 // メニューID選択メニュー作成
608                 $this->db->getAllMenuItems($this->menuId, array($this, 'menuIdLoop'));
609                 
610                 // コンテンツ編集用ウィジェット
611                 switch ($contType){
612                         case self::CONTENT_TYPE_PC:                     // PC用
613                         default:
614                                 $contentEditWidget = self::CONTENT_WIDGET_ID_PC;
615                                 break;
616                         case self::CONTENT_TYPE_MOBILE:                 // 携帯用
617                                 $contentEditWidget = self::CONTENT_WIDGET_ID_MOBILE;
618                                 break;
619                         case self::CONTENT_TYPE_SMARTPHONE:                     // スマートフォン用
620                                 $contentEditWidget = self::CONTENT_WIDGET_ID_SMARTPHONE;
621                                 break;
622                 }
623                 
624                 // 多言語用入力エリア作成
625                 if ($this->isMultiLang){                // 多言語対応の場合
626                         // デフォルト言語設定
627                         $this->tmpl->addVar("_widget", "lang", $this->createLangImage($this->gEnv->getDefaultLanguage()));
628                         
629                         // その他の入力欄作成
630                         $this->tmpl->setAttribute('input_lang', 'visibility', 'visible');
631                         $this->createInputLangText($nameLangArray);
632                 }
633
634                 // ### 入力値を再設定 ###
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
640                 $attrStr = '';
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);// コンテンツ表示ウィジェット
644                 // リンクタイプ
645                 switch ($linkType){
646                         case 0:                 // 同ウィンドウで開くリンク
647                                 $this->tmpl->addVar("_widget", "link_type_0", 'selected');
648                                 break;
649                         case 1:                 // 別ウィンドウで開くリンク
650                                 $this->tmpl->addVar("_widget", "link_type_1", 'selected');
651                                 break;
652                 }
653                 // 項目表示、項目利用可否チェックボックス
654                 $visibleStr = '';
655                 if ($visible) $visibleStr = 'checked';
656                 $this->tmpl->addVar("_widget", "sel_item_visible", $visibleStr);
657                 $checked = '';
658                 if (!empty($linkContent)) $checked = 'checked';
659                 $this->tmpl->addVar("_widget", "link_content", $checked);
660                 
661                 // 選択中のシリアル番号、IDを設定
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が固定かどうか
665                 
666                 // ボタンの表示制御
667                 if (empty($this->serialNo)){            // 新規追加項目を選択しているとき
668                         $this->tmpl->setAttribute('add_button', 'visibility', 'visible');// 「新規追加」ボタン
669                 } else {
670                         $this->tmpl->setAttribute('del_button', 'visibility', 'visible');// 「削除」ボタン
671                 }
672         }
673         /**
674          * メニュー一覧作成
675          *
676          * @param string        $menuId         メニューID
677          * @return string               ツリーメニュータグ
678          */
679         function createMenuList($menuId)
680         {
681                 if (!$this->db->getChildMenuItems($menuId, 0, $rows)) return;
682                 
683                 $itemCount = count($rows);
684                 for ($i = 0; $i < $itemCount; $i++){
685                         $row = $rows[$i];
686                         
687                         // デフォルト言語で名前を取得
688                         $name = $this->getDefaultLangString($row['md_name']);
689                         
690                         // 対応言語を取得
691                         $lang = '';
692                         if ($this->isMultiLang){                // 多言語対応の場合
693                                 $lang = $this->createLangImageList($row['md_name']);
694                         }
695                         // メニュー項目表示状態
696                         $visible = '';
697                         if ($row['md_visible']){
698                                 $visible = 'checked';
699                         }
700                         // リンクタイプ
701                         $linkString = '';
702                         switch ($row['md_link_type']){
703                                 case 0:                 // 同ウィンドウで開くリンク
704                                         $linkString = $this->_('Self');         // 同
705                                         break;
706                                 case 1:                 // 別ウィンドウで開くリンク
707                                         $linkString = $this->_('Other');        // 別
708                                         break;
709                         }
710                         // 項目選択のラジオボタンの状態
711                         $serial = $this->convertToDispString($row['md_id']);
712                         $selected = '';
713                         if ($serial == $this->serialNo){
714                                 $selected = 'checked';
715                         }
716         
717                         // リンクURLからコンテンツIDを取得
718                         $linkUrl = $row['md_link_url'];
719                         // システム配下のパスであるかチェック
720                         $contentId = '';
721                         $pos = strpos($linkUrl, M3_TAG_START . M3_TAG_MACRO_ROOT_URL . M3_TAG_END);
722                         if ($pos === false){            // 見つからない場合
723                         } else {
724                                 // コンテンツID取得
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){
731                                                 $contentId = $value;
732                                                 break;
733                                         }
734                                 }
735                         }
736                         // リンク先を実URLに変換
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>';
740
741                         // コンテンツの編集ボタンの有効状態
742                         $enableContentLink = '';
743                         if (empty($contentId)) $enableContentLink = 'disabled';
744         
745                         $itemRow = array(
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')                                // コンテンツを編集
759                         );
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');
765                         } else {
766                                 $this->tmpl->addVars('itemlist', $itemRow);
767                                 $this->tmpl->parseTemplate('itemlist', 'a');
768                         }
769                 
770                         // メニューのプレビュー
771                         if ($row['md_visible']){                // 表示項目のみ追加
772                                 $this->tmpl->addVars('menuitemlist', $itemRow);
773                                 $this->tmpl->parseTemplate('menuitemlist', 'a');
774                                 $this->isExistsPreviewMenuItem = true;          // メニュー項目が存在するかどうか
775                         }
776                         $this->isExistsMenuItem = true;         // メニュー項目が存在するかどうか
777         
778                         // シリアル番号を保存
779                         $this->serialArray[] = $serial;
780                 }
781         }
782         /**
783          * ページID、取得したデータをテンプレートに設定する
784          *
785          * @param int $index                    行番号(0~)
786          * @param array $fetchedRow             フェッチ取得した行
787          * @param object $param                 未使用
788          * @return bool                                 true=処理続行の場合、false=処理終了の場合
789          */
790         function pageIdLoop($index, $fetchedRow, $param)
791         {
792                 $selected = '';
793                 $row = array(
794                         'value'    => $this->convertToDispString($fetchedRow['pg_id']),                 // ページID
795                         'name'     => $this->convertToDispString($fetchedRow['pg_name']),                       // ページ名
796                         'selected' => $selected                                                                                                         // 選択中かどうか
797                 );
798                 $this->tmpl->addVars('main_id_list', $row);
799                 $this->tmpl->parseTemplate('main_id_list', 'a');
800                 return true;
801         }
802         /**
803          * ページサブID、取得したデータをテンプレートに設定する
804          *
805          * @param int $index                    行番号(0~)
806          * @param array $fetchedRow             フェッチ取得した行
807          * @param object $param                 未使用
808          * @return bool                                 true=処理続行の場合、false=処理終了の場合
809          */
810         function pageSubIdLoop($index, $fetchedRow, $param)
811         {
812                 $selected = '';
813                 if ($fetchedRow['pg_id'] == $this->currentPageSubId) $selected = 'selected';    // 現在のページサブID
814                 
815                 $contentType = $fetchedRow['pn_content_type'];
816                 $name = $fetchedRow['pg_id'];
817                 if (!empty($contentType)) $name .= '[' . $contentType . ']';
818                 $name .= ' - ' . $fetchedRow['pg_name'];
819
820                 $row = array(
821                         'value'    => $this->convertToDispString($fetchedRow['pg_id']),                 // ページID
822                         'name'     => $this->convertToDispString($name),                        // ページ名
823                         'selected' => $selected                                                                                                         // 選択中かどうか
824                 );
825                 $this->tmpl->addVars('sub_id_list', $row);
826                 $this->tmpl->parseTemplate('sub_id_list', 'a');
827                 return true;
828         }
829         /**
830          * 取得したデータをテンプレートに設定する
831          *
832          * @param int $index                    行番号(0~)
833          * @param array $fetchedRow             フェッチ取得した行
834          * @param object $param                 未使用
835          * @return bool                                 true=処理続行の場合、false=処理終了の場合
836          */
837         function contentListLoop($index, $fetchedRow, $param)
838         {
839                 $id = $fetchedRow['cn_id'];
840                 $selected = '';
841                 if ($id == $this->contentId) $selected = 'selected';    // 現在のコンテンツID
842                 $row = array(
843                         'value'    => $this->convertToDispString($id),                                                          // コンテンツID
844                         'name'     => $this->convertToDispString($fetchedRow['cn_name']),                       // コンテンツ名
845                         'selected' => $selected                                                                                                         // 選択中かどうか
846                 );
847                 $this->tmpl->addVars('content_list', $row);
848                 $this->tmpl->parseTemplate('content_list', 'a');
849                 
850                 // コンテンツ選択メニューHTML
851                 $this->menuHtml .= '<option value="' . $id . '" ' . $selected . '>' . $this->convertToDispString($fetchedRow['cn_name']) . '</option>';
852                 return true;
853         }
854         /**
855          * 取得したデータをテンプレートに設定する
856          *
857          * @param int $index                    行番号(0~)
858          * @param array $fetchedRow             フェッチ取得した行
859          * @param object $param                 未使用
860          * @return bool                                 true=処理続行の場合、false=処理終了の場合
861          */
862         function menuIdListLoop($index, $fetchedRow, $param)
863         {
864                 $value = $fetchedRow['mn_id'];
865                 $name = $value . ' - ' . $fetchedRow['mn_name'];
866
867                 $selected = '';
868                 if ($value == $this->menuId) $selected = 'selected';
869                 
870                 $row = array(
871                         'value'    => $this->convertToDispString($value),                       // ページID
872                         'name'     => $this->convertToDispString($name),                        // ページ名
873                         'selected' => $selected                                                                                                         // 選択中かどうか
874                 );
875                 $this->tmpl->addVars('menu_id_list', $row);
876                 $this->tmpl->parseTemplate('menu_id_list', 'a');
877                 return true;
878         }
879         /**
880          * メニュー項目タイプ選択メニュー作成
881          *
882          * @return なし
883          */
884         function createItemTypeMenu()
885         {
886                 for ($i = 0; $i < count($this->itemTypeArray); $i++){
887                         $value = $this->itemTypeArray[$i]['value'];
888                         $name = $this->itemTypeArray[$i]['name'];
889                         
890                         $selected = '';
891                         if ($value == $this->menuItemType) $selected = 'selected';
892                         
893                         $row = array(
894                                 'value'    => $value,                   // ページID
895                                 'name'     => $name,                    // ページ名
896                                 'selected' => $selected                                                                                                         // 選択中かどうか
897                         );
898                         $this->tmpl->addVars('item_type_list', $row);
899                         $this->tmpl->parseTemplate('item_type_list', 'a');
900                 }
901         }
902         /**
903          * メニュー項目をテンプレートに設定する
904          *
905          * @param int $index                    行番号(0~)
906          * @param array $fetchedRow             フェッチ取得した行
907          * @param object $param                 未使用
908          * @return bool                                 true=処理続行の場合、false=処理終了の場合
909          */
910         function menuIdLoop($index, $fetchedRow, $param)
911         {
912                 $value = $this->convertToDispString($fetchedRow['md_id']);
913                 $name = $this->getDefaultLangString($fetchedRow['md_name']);
914                 
915                 $selected = '';
916                 if ($value == $this->serialNo) $selected = 'selected';
917                         
918                 $row = array(
919                         'value'    => $value,                   // メニュー項目ID
920                         'name'     => $this->convertToDispString($name),                        // メニュー項目名
921                         'selected' => $selected                                                                                                         // 選択中かどうか
922                 );
923                 $this->tmpl->addVars('menuid_list', $row);
924                 $this->tmpl->parseTemplate('menuid_list', 'a');
925                 return true;
926         }
927         /**
928          * 言語アイコンを作成
929          *
930          * @param string $src           多言語対応文字列
931          * @return string                       言語アイコンタグ
932          */
933         function createLangImageList($src)
934         {
935                 $imageTag = '';
936                 $langArray = $this->unserializeLangArray($src);
937                 $keys = array_keys($langArray);
938                 
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);
942                 }
943                 return $imageTag;
944         }
945         /**
946          * 言語アイコンを作成
947          *
948          * @param string $id            言語ID
949          * @return string                       言語アイコンタグ
950          */
951         function createLangImage($id)
952         {
953                 $langInfo = $this->availableLangArray[$id];
954                 if (!isset($langInfo)) return '';
955                 
956                 if ($this->gEnv->getCurrentLanguage() == 'ja'){ // 日本語の場合
957                         $langName = $langInfo['ln_name'];
958                 } else {
959                         $langName = $langInfo['ln_name_en'];
960                 }
961                 // 言語アイコン
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;
966                 return $imageTag;
967         }
968         /**
969          * 多言語文字列入力エリア作成
970          *
971          * @param array $nameArray      多言語対応文字列
972          * @return なし
973          */
974         function createInputLangText($nameArray)
975         {
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);
980                         
981                         $value = $nameArray[$langId];
982                         $row = array(
983                                 'id'    => $langId,                     // 言語ID
984                                 'value' => $this->convertToDispString($value),                  // 入力値
985                                 'lang'  => $langImage           // 言語画像
986                         );
987                         $this->tmpl->addVars('input_lang', $row);
988                         $this->tmpl->parseTemplate('input_lang', 'a');
989                 }
990         }
991 }
992 ?>