OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / admin_main / include / db / admin_mainDb.php
1 <?php
2 /**
3  * DBクラス
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-2013 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: admin_mainDb.php 5941 2013-04-17 23:17:57Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
17 require_once($gEnvManager->getIncludePath() . '/common/userInfo.php');          // ユーザ情報クラス
18
19 class admin_mainDb extends BaseDb
20 {       
21         private $now;           // 現在日時
22         private $userId;                // ログイン中のユーザ
23         private $maxNo;         // 最大管理番号
24 //      const CF_DEFAULT_TEMPLATE                       = 'default_template';                   // システム定義値取得用キー(PC用デフォルトテンプレート)
25 //      const CF_DEFAULT_TEMPLATE_MOBILE        = 'mobile_default_template';    // システム定義値取得用キー(携帯用デフォルトテンプレート)
26         
27         // 取得値
28         const CAN_DETAIL_CONFIG = 'permit_detail_config';                               // 詳細設定が可能かどうか
29                 
30         /**
31          * システム定義値を取得
32          *
33          * @param string $key           キーとなる項目値
34          * @return string $value        値
35          */
36         function getSystemConfig($key)
37         {
38                 $retValue = '';
39                 $queryStr = 'SELECT sc_value FROM _system_config ';
40                 $queryStr .=  'WHERE sc_id  = ?';
41                 $ret = $this->selectRecord($queryStr, array($key), $row);
42                 if ($ret) $retValue = $row['sc_value'];
43                 return $retValue;
44         }
45         /**
46          * システム定義値を更新
47          *
48          * @param string $key           キーとなる項目値
49          * @param string $value         値
50          * @return                                      true = 正常、false=異常
51          */
52         function updateSystemConfig($key, $value)
53         {
54                 // トランザクションスタート
55                 $this->startTransaction();
56                 
57                 $queryStr = 'SELECT sc_value FROM _system_config ';
58                 $queryStr .=  'WHERE sc_id  = ?';
59                 $ret = $this->selectRecord($queryStr, array($key), $row);
60                 if ($ret){
61                         $queryStr  = 'UPDATE _system_config ';
62                         $queryStr .=   'SET sc_value = ? ';
63                         $queryStr .=   'WHERE sc_id = ?';
64                         $ret = $this->execStatement($queryStr, array($value, $key));                    
65                 } else {
66                         $queryStr = 'INSERT INTO _system_config (';
67                         $queryStr .=  'sc_id, ';
68                         $queryStr .=  'sc_value ';
69                         $queryStr .=  ') VALUES (';
70                         $queryStr .=  '?, ?';
71                         $queryStr .=  ')';
72                         $ret = $this->execStatement($queryStr, array($key, $value));    
73                 }
74                 // トランザクション終了
75                 $ret = $this->endTransaction();
76                 return $ret;
77         }
78         /**
79          * サイト定義値を更新
80          *
81          * @param string $lang          言語
82          * @param string $key           キーとなる項目値
83          * @param string $value         値
84          * @param int $user                     ユーザID
85          * @return                                      true = 正常、false=異常
86          */
87         function updateSiteDef($lang, $key, $value)
88         {
89                 $now = date("Y/m/d H:i:s");     // 現在日時
90                 $user = $this->gEnv->getCurrentUserId();        // 現在のユーザ
91                 
92                 // トランザクション開始
93                 $this->startTransaction();
94                 
95                 // 指定のレコードの履歴インデックス取得
96                 $historyIndex = 0;              // 履歴番号
97                 $queryStr  = 'SELECT * FROM _site_def ';
98                 $queryStr .=   'WHERE sd_id = ? ';
99                 $queryStr .=     'AND sd_language_id = ? ';
100                 $queryStr .=  'ORDER BY sd_history_index desc ';
101                 $ret = $this->selectRecord($queryStr, array($key, $lang), $row);
102                 if ($ret){
103                         $historyIndex = $row['sd_history_index'] + 1;
104                 
105                         // レコードが削除されていない場合は削除
106                         if (!$row['sd_deleted']){
107                                 // 古いレコードを削除
108                                 $queryStr  = 'UPDATE _site_def ';
109                                 $queryStr .=   'SET sd_deleted = true, ';       // 削除
110                                 $queryStr .=     'sd_update_user_id = ?, ';
111                                 $queryStr .=     'sd_update_dt = ? ';
112                                 $queryStr .=   'WHERE sd_serial = ?';
113                                 $ret = $this->execStatement($queryStr, array($user, $now, $row['sd_serial']));
114                                 if (!$ret) return false;
115                         }
116                 }
117                 
118                 // 新規レコード追加
119                 $queryStr = 'INSERT INTO _site_def ';
120                 $queryStr .=  '(';
121                 $queryStr .=  'sd_id, ';
122                 $queryStr .=  'sd_language_id, ';
123                 $queryStr .=  'sd_history_index, ';
124                 $queryStr .=  'sd_value, ';
125                 $queryStr .=  'sd_create_user_id, ';
126                 $queryStr .=  'sd_create_dt) ';
127                 $queryStr .=  'VALUES ';
128                 $queryStr .=  '(?, ?, ?, ?, ?, ?)';
129                 $ret =$this->execStatement($queryStr, array($key, $lang, $historyIndex, $value, $user, $now));
130                         
131                 // トランザクション確定
132                 $ret = $this->endTransaction();
133                 return $ret;
134         }
135         /**
136          * サイト定義値を取得
137          *
138          * @param string $lang          言語
139          * @param string $key           キーとなる項目値
140          * @return string                       値
141          */
142         function getSiteDef($lang, $key)
143         {
144                 $queryStr  = 'SELECT * FROM _site_def ';
145                 $queryStr .=   'WHERE sd_deleted = false ';
146                 $queryStr .=     'AND sd_id = ? ';
147                 $queryStr .=     'AND sd_language_id = ? ';
148                 $ret = $this->selectRecord($queryStr, array($key, $lang), $row);
149                 if ($ret){
150                         return $row['sd_value'];
151                 } else {
152                         return '';
153                 }
154         }
155         /**
156          * システムの詳細設定が可能かどうか
157          *
158          * @return bool                                 true=可能、false=不可
159          */
160         function canDetailConfig()
161         {
162                 $retValue = $this->getSystemConfig(self::CAN_DETAIL_CONFIG);
163                 return $retValue;
164         }
165         /**
166          * ウィジェットリスト取得
167          *
168          * @param int      $type                テンプレートのタイプ(0=PC用、1=携帯用、2=スマートフォン)
169          * @param function $callback    コールバック関数
170          * @return                                              なし
171          */
172         function getAllWidgetList($type, $callback)
173         {
174                 // wd_device_typeは後で追加したため、wd_mobileを残しておく
175                 $queryStr  = 'SELECT * FROM _widgets ';
176                 $queryStr .=  'WHERE wd_deleted = false ';// 削除されていない
177                 $params = array();
178                 switch ($type){
179                         case 0:         // PC用テンプレート
180                         case 2:         // スマートフォン用テンプレート
181                         default:
182                                 $queryStr .=    'AND wd_mobile = false ';               // 携帯用以外
183                                 $queryStr .=    'AND wd_device_type = ? '; $params[] = $type;
184                                 break;
185                         case 1:         // 携帯用のとき
186                                 $queryStr .=    'AND wd_mobile = true ';                // 携帯用
187                                 break;
188                 }
189                 $queryStr .=  'ORDER BY wd_id';
190                 $this->selectLoop($queryStr, $params, $callback);
191         }
192         /**
193          * 管理メニュー項目用ウィジェットリスト(管理画面ありでPC携帯両方)取得
194          *
195          * @param function $callback    コールバック関数
196          * @return                                              なし
197          */
198         function getAvailableWidgetListForEditMenu($callback)
199         {
200                 $queryStr  = 'select * from _widgets ';
201                 $queryStr .=   'where wd_deleted = false ';// 削除されていない
202                 $queryStr .=     'and wd_available = true ';            // メニューから選択可能なもの
203                 $queryStr .=     'and wd_has_admin = true ';            // 管理機能あり
204                 $queryStr .=   'order by wd_sort_order,wd_id';
205                 $this->selectLoop($queryStr, array(), $callback);
206         }
207         /**
208          * ウィジェットリスト(メニューから選択可能なもの)取得
209          *
210          * @param function $callback    コールバック関数
211          * @return                                              なし
212          */
213         /*function getAvailableWidgetList($callback)
214         {
215                 $queryStr  = 'select * from _widgets ';
216                 $queryStr .=   'where wd_deleted = false ';// 削除されていない
217                 $queryStr .=     'and wd_available = true ';            // メニューから選択可能なもの
218                 $queryStr .=     'and wd_mobile = false ';              // 携帯用ウィジェット以外
219                 $queryStr .=   'order by wd_id';
220                 $this->selectLoop($queryStr, array(), $callback);
221         }*/
222         /**
223          * 携帯用のウィジェットリスト(メニューから選択可能なもの)取得
224          *
225          * @param function $callback    コールバック関数
226          * @return                                              なし
227          */
228         /*function getAvailableMobileWidgetList($callback)
229         {
230                 $queryStr  = 'select * from _widgets ';
231                 $queryStr .=   'where wd_deleted = false ';// 削除されていない
232                 $queryStr .=     'and wd_available = true ';            // メニューから選択可能なもの
233                 $queryStr .=     'and wd_mobile = true ';               // 携帯用ウィジェット
234                 $queryStr .=   'order by wd_id';
235                 $this->selectLoop($queryStr, array(), $callback);
236         }*/
237         /**
238          * ウィジェットIDリスト取得
239          *
240          * @param array  $rows                  取得レコード
241          * @return                                              true=取得、false=取得せず
242          */
243         function getAllWidgetIdList(&$rows)
244         {
245                 $queryStr = 'select * from _widgets ';
246                 $queryStr .=  'where wd_deleted = false ';// 削除されていない
247                 $queryStr .=  'order by wd_id';
248                 
249                 $retValue = $this->selectRecords($queryStr, array(), $rows);
250                 return $retValue;
251         }
252         /**
253          * ウィジェットIDの存在チェック
254          *
255          * @param string  $id                   ウィジェットID
256          * @return bool                                 true=存在する、false=存在しない
257          */
258         function isExistsWidgetId($id)
259         {
260                 $queryStr = 'SELECT * FROM _widgets ';
261                 $queryStr .=  'WHERE wd_deleted = false ';// 削除されていない
262                 $queryStr .=  'AND wd_id = ? ';
263                 return $this->isRecordExists($queryStr, array($id));
264         }
265         /**
266          * ウィジェットの追加
267          *
268          * @param string  $id                           ウィジェットID
269          * @param string  $name                         ウィジェット名
270          * @param int     $deviceType   端末タイプ(0=PC用、1=携帯用、2=スマートフォン)
271          * @param bool    $readScripts          スクリプトディレクトリを自動読み込みするかどうか
272          * @param bool    $readCss                      cssディレクトリを自動読み込みするかどうか
273          * @param bool    $hasAdmin                     管理画面があるかどうか
274          * @return                                                      なし
275          */
276         function addNewWidget($id, $name, $deviceType = 0, $readScripts = false, $readCss = false, $hasAdmin = false)
277         {
278                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
279                 $now = date("Y/m/d H:i:s");     // 現在日時
280                 $historyIndex = 0;
281                 $mobile = 0;                            // 携帯端末かどうか
282                 if ($deviceType == 1) $mobile = 1;
283                 
284                 // トランザクション開始
285                 $this->startTransaction();
286                 
287                 // 同じIDが登録済みかどうかチェック
288                 $queryStr = 'select * from _widgets ';
289                 $queryStr .=  'where wd_id = ? ';
290                 $queryStr .=  'order by wd_history_index desc ';
291                 $ret = $this->selectRecord($queryStr, array($id), $row);
292                 if ($ret){
293                         if (!$row['wd_deleted']){               // レコードが削除されていなければ、削除
294                                 // 古いレコードを削除
295                                 $queryStr  = 'UPDATE _widgets ';
296                                 $queryStr .=   'SET wd_deleted = true, ';       // 削除
297                                 $queryStr .=     'wd_update_user_id = ?, ';
298                                 $queryStr .=     'wd_update_dt = ? ';
299                                 $queryStr .=   'WHERE wd_serial = ?';
300                                 $this->execStatement($queryStr, array($userId, $now, $row['wd_serial']));
301                         }
302                         $historyIndex = $row['wd_history_index'] + 1;
303                 }
304
305                 $queryStr = 'INSERT INTO _widgets ';
306                 $queryStr .=  '(wd_id, wd_history_index, wd_name, wd_device_type, wd_mobile, wd_read_scripts, wd_read_css, wd_has_admin, wd_create_user_id, wd_create_dt) ';
307                 $queryStr .=  'VALUES ';
308                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, now())';
309                 $this->execStatement($queryStr, array($id, $historyIndex, $name, intval($deviceType), intval($mobile), intval($readScripts), intval($readCss), intval($hasAdmin), $userId));
310                 
311                 // トランザクション確定
312                 $ret = $this->endTransaction();
313         }
314         /**
315          * ウィジェットの更新
316          *
317          * @param int $serial                   シリアル番号
318          * @param string  $name                 ウィジェット名
319          * @param bool $available               利用可能かどうか
320          * @param bool $active  ウィジェット実行可能かどうか
321          * @return bool                                 true=成功、false=失敗
322          */
323         function updateWidget($serial, $name, $available, $active)
324         {
325                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
326                 $now = date("Y/m/d H:i:s");     // 現在日時
327                 $updateFields = array();        // 更新するフィールド名
328                 $boolFields = array();          // boolタイプのフィールド名
329                 $updateFields[] = 'wd_language';                        // 対応言語ID(「,」区切りで複数指定可)
330                 $updateFields[] = 'wd_name';                            // ウィジェット名称
331                 $updateFields[] = 'wd_type';                            // ウィジェット種別(content=コンテンツ表示)
332                 $updateFields[] = 'wd_version';                         // バージョン文字列
333                 $updateFields[] = 'wd_fingerprint';                     // ソースコードレベルでウィジェットを識別するためのID
334                 $updateFields[] = 'wd_group_id';                        // ウィジェットグループ(管理用)
335                 $updateFields[] = 'wd_compatible_id';           // 互換ウィジェットID
336                 $updateFields[] = 'wd_joomla_class';            // Joomla!テンプレート用のクラス名
337                 $updateFields[] = 'wd_suffix';                          // HTMLタグのクラス名に付けるサフィックス文字列
338                 $updateFields[] = 'wd_params';                          // 各種パラメータ
339                 $updateFields[] = 'wd_author';                          // 作者名
340                 $updateFields[] = 'wd_copyright';                       // 著作権
341                 $updateFields[] = 'wd_license';                         // ライセンス
342                 $updateFields[] = 'wd_official_level';          // 公認レベル(0=非公認、1=準公認、10=正規公認)
343                 $updateFields[] = 'wd_status';                          // 状態(0=通常,1=テスト中,-1=廃止予定,-10=廃止)
344                 $updateFields[] = 'wd_cache_type';                      // キャッシュタイプ(0=不可、1=可、2=非ログイン時可, 3=ページキャッシュのみ可)
345                 $updateFields[] = 'wd_cache_lifetime';          // キャッシュの保持時間(分)
346                 $updateFields[] = 'wd_view_control_type';       // 表示出力の制御タイプ(-1=固定、0=可変、1=ウィジェットパラメータ可変、2=URLパラメータ可変)
347                 $updateFields[] = 'wd_description';                     // 説明
348                 $updateFields[] = 'wd_url';                                     // 取得先URL
349                 $updateFields[] = 'wd_add_script_lib';          // 追加する共通スクリプトライブラリ(ライブラリ名で指定、「,」区切りで複数指定可)
350                 $updateFields[] = 'wd_add_scripts';                     // 追加スクリプトファイル(相対パス表記、「,」区切りで複数指定可)
351                 $updateFields[] = 'wd_add_css';                         // 追加CSSファイル(相対パス表記、「,」区切りで複数指定可)
352                 $updateFields[] = 'wd_add_script_lib_a';        // (管理機能用)追加する共通スクリプトライブラリ(ライブラリ名で指定、「,」区切りで複数指定可)
353                 $updateFields[] = 'wd_add_scripts_a';           // (管理機能用)追加スクリプトファイル(相対パス表記、「,」区切りで複数指定可)
354                 $updateFields[] = 'wd_add_css_a';                       // (管理機能用)追加CSSファイル(相対パス表記、「,」区切りで複数指定可)
355                 $updateFields[] = 'wd_device_type';                     // 端末タイプ(0=PC、1=携帯、2=スマートフォン)
356                 $updateFields[] = 'wd_mobile'; $boolFields[] = 'wd_mobile';     // 携帯対応かどうか
357                 $updateFields[] = 'wd_show_name'; $boolFields[] = 'wd_show_name';                       // ウィジェット名称を表示するかどうか
358                 $updateFields[] = 'wd_read_scripts'; $boolFields[] = 'wd_read_scripts';         // スクリプトディレクトリを自動読み込みするかどうか
359                 $updateFields[] = 'wd_read_css'; $boolFields[] = 'wd_read_css';                 // cssディレクトリを自動読み込みするかどうか
360                 $updateFields[] = 'wd_use_ajax'; $boolFields[] = 'wd_use_ajax';                 // Ajax共通ライブラリを読み込むかどうか
361                 $updateFields[] = 'wd_active'; $boolFields[] = 'wd_active';                             // 一般ユーザが実行可能かどうか
362                 $updateFields[] = 'wd_available'; $boolFields[] = 'wd_available';                       // メニューから選択可能かどうか
363                 $updateFields[] = 'wd_editable'; $boolFields[] = 'wd_editable';                 // データ編集可能かどうか
364                 $updateFields[] = 'wd_has_admin'; $boolFields[] = 'wd_has_admin';                       // 管理画面があるかどうか
365                 $updateFields[] = 'wd_has_log'; $boolFields[] = 'wd_has_log';                           // ログ参照画面があるかどうか
366                 $updateFields[] = 'wd_enable_operation'; $boolFields[] = 'wd_enable_operation'; // 単体起動可能かどうか
367                 $updateFields[] = 'wd_use_instance_def'; $boolFields[] = 'wd_use_instance_def'; // インスタンス定義が必要かどうか
368                 $updateFields[] = 'wd_initialized'; $boolFields[] = 'wd_initialized';                   // 初期化完了かどうか
369                 $updateFields[] = 'wd_use_cache'; $boolFields[] = 'wd_use_cache';                       // キャッシュ機能を使用するかどうか
370                 $updateFields[] = 'wd_has_rss'; $boolFields[] = 'wd_has_rss';                           // RSS機能があるかどうか
371                 $updateFields[] = 'wd_sort_order';                      // ソート順
372                 $updateFields[] = 'wd_launch_index';            // 遅延実行制御が必要な場合の実行順(0=未設定、0以上=実行順)
373                 $updateFields[] = 'wd_install_dt';                      // インストール日時
374                 $updateFields[] = 'wd_index_file';                      // 起動クラスのファイル名
375                 $updateFields[] = 'wd_index_class';                     // 起動クラス名
376                 $updateFields[] = 'wd_admin_file';                      // 管理機能起動クラスのファイル名
377                 $updateFields[] = 'wd_admin_class';                     // 管理機能起動クラス名
378                 $updateFields[] = 'wd_db';                                      // 対応DB種(mysql,pgsql等を「,」区切りで指定)
379                 $updateFields[] = 'wd_table_access_type';       // テーブルのアクセス範囲(0=テーブル未使用、1=共通テーブルのみ、2=独自テーブル)
380
381                 // トランザクション開始
382                 $this->startTransaction();
383                 
384                 // 指定のシリアルNoのレコードが削除状態でないかチェック
385                 $historyIndex = 0;              // 履歴番号
386                 $queryStr  = 'select * from _widgets ';
387                 $queryStr .=   'where wd_serial = ? ';
388                 $ret = $this->selectRecord($queryStr, array($serial), $row);
389                 if ($ret){              // 既に登録レコードがあるとき
390                         if ($row['wd_deleted']){                // レコードが削除されていれば終了
391                                 $this->endTransaction();
392                                 return false;
393                         }
394                         $historyIndex = $row['wd_history_index'] + 1;
395                 } else {                // 存在しない場合は終了
396                         $this->endTransaction();
397                         return false;
398                 }
399                 
400                 // 古いレコードを削除
401                 $queryStr  = 'UPDATE _widgets ';
402                 $queryStr .=   'SET wd_deleted = true, ';       // 削除
403                 $queryStr .=     'wd_update_user_id = ?, ';
404                 $queryStr .=     'wd_update_dt = ? ';
405                 $queryStr .=   'WHERE wd_serial = ?';
406                 $this->execStatement($queryStr, array($userId, $now, $serial));
407                 
408                 // ##### データ更新処理 #####
409                 // 呼び出しパラメータから取得値
410                 $newParams = array();
411                 $newParams['wd_name'] = $name;
412                 $newParams['wd_available'] = intval($available);
413                 $newParams['wd_active'] = intval($active);
414                 $keys = array_keys($newParams);// キーを取得
415                 
416                 // クエリー作成
417                 $queryStr  = 'INSERT INTO _widgets (';
418                 $queryStr .=   'wd_id, ';
419                 $queryStr .=   'wd_history_index, ';
420                 $valueStr = '(?, ?, ';
421                 $values = array($row['wd_id'], $historyIndex);
422                 // 呼び出しパラメータから取得値を連結
423                 for ($i = 0; $i < count($keys); $i++){
424                         $queryStr .= $keys[$i] . ', ';
425                         $valueStr .= '?, ';
426                         $values[] = $newParams[$keys[$i]];
427                 }
428                 
429                 // 更新値を設定
430                 if ($this->getDbType() == M3_DB_TYPE_PGSQL){// PostgreSQLの場合
431                         for ($i = 0; $i < count($updateFields); $i++){
432                                 $fieldName = $updateFields[$i];
433                                 if (!in_array($fieldName, $keys)){              // フィールドがないとき
434                                         $queryStr .= $fieldName . ', ';
435                                         $valueStr .= '?, ';
436                                         if (in_array($fieldName, $boolFields)){
437                                                 $values[] = intval($row[$fieldName]);
438                                         } else {
439                                                 $values[] = $row[$fieldName];
440                                         }
441                                 }
442                         }
443                 } else {
444                         for ($i = 0; $i < count($updateFields); $i++){
445                                 $fieldName = $updateFields[$i];
446                                 if (!in_array($fieldName, $keys)){              // フィールドがないとき
447                                         $queryStr .= $fieldName . ', ';
448                                         $valueStr .= '?, ';
449                                         $values[] = $row[$fieldName];
450                                 }
451                         }
452                 }
453
454                 // レコードを追加
455                 $queryStr .= 'wd_create_user_id, wd_create_dt) ';
456                 $valueStr .= '?, ?)';
457                 $values = array_merge($values, array($userId, $now));
458                 $queryStr .=  'VALUES ';
459                 $queryStr .=  $valueStr;
460                 $this->execStatement($queryStr, $values);
461
462                 // トランザクション確定
463                 $ret = $this->endTransaction();
464                 return $ret;
465         }
466         /**
467          * ウィジェットの削除
468          *
469          * @param string  $serial               シリアル番号
470          * @return                                              true=成功、false=失敗
471          */
472         function deleteWidget($serial)
473         {
474                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
475                 $now = date("Y/m/d H:i:s");     // 現在日時
476                 
477                 // トランザクション開始
478                 $this->startTransaction();
479                 
480                 // 指定のシリアルNoのレコードが削除状態でないかチェック
481                 $queryStr  = 'select * from _widgets ';
482                 $queryStr .=   'WHERE wd_serial = ? ';
483                 $queryStr .=    'and wd_deleted = false';
484                 $ret = $this->selectRecord($queryStr, array($serial), $row);
485                 if (!$ret){             // 登録レコードがないとき
486                         $this->endTransaction();
487                         return false;
488                 }
489                 
490                 // 古いレコードを削除
491                 $queryStr  = 'UPDATE _widgets ';
492                 $queryStr .=   'SET wd_deleted = true, ';       // 削除
493                 $queryStr .=     'wd_update_user_id = ?, ';
494                 $queryStr .=     'wd_update_dt = ? ';
495                 $queryStr .=   'WHERE wd_serial = ?';
496                 $this->execStatement($queryStr, array($userId, $now, $serial));
497                 
498                 // トランザクション確定
499                 $ret = $this->endTransaction();
500                 return $ret;            
501         }
502         /**
503          * ウィジェットの取得
504          *
505          * @param string  $serial               シリアル番号
506          * @param array $row                    取得データ
507          * @return                                              true=正常、false=異常
508          */
509         function getWidget($serial, &$row)
510         {
511                 $queryStr  = 'select * from _widgets ';
512                 $queryStr .=   'where wd_serial = ? ';
513                 $ret = $this->selectRecord($queryStr, array($serial), $row);
514                 return $ret;
515         }
516         /**
517          * ウィジェットの初期化状態を取得
518          *
519          * @param string  $id                           ウィジェットID
520          * @return bool                                         true=初期済み、false=未初期化
521          */
522         function isWidgetInitialized($id)
523         {
524                 $queryStr = 'SELECT * from _widgets ';
525                 $queryStr .=  'WHERE wd_deleted = false ';// 削除されていない
526                 $queryStr .=  'AND wd_id = ?';
527                 $ret = $this->selectRecord($queryStr, array($id), $row);
528                 if ($ret && $row['wd_initialized']){
529                         return true;
530                 } else {
531                         return false;
532                 }
533         }
534         /**
535          * ウィジェットの初期化状態を更新
536          *
537          * @param string  $id                           ウィジェットID
538          * @param bool $init                            初期化状態
539          * @return bool                                         true=成功、false=失敗
540          */
541         function updateIsWidgetInitialized($id, $init)
542         {
543                 $now = date("Y/m/d H:i:s");     // 現在日時
544                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
545                 
546                 // トランザクション開始
547                 $this->startTransaction();
548                 
549                 $queryStr = 'SELECT * from _widgets ';
550                 $queryStr .=  'WHERE wd_deleted = false ';// 削除されていない
551                 $queryStr .=  'AND wd_id = ?';
552                 $ret = $this->selectRecord($queryStr, array($id), $row);
553                 if (!$ret){             // 登録レコードがないとき
554                         $this->endTransaction();
555                         return false;
556                 }
557                 
558                 // レコードを更新
559                 $queryStr  = 'UPDATE _widgets ';
560                 $queryStr .=   'SET wd_initialized = ?, ';      // 初期化状態
561                 $queryStr .=     'wd_update_user_id = ?, ';
562                 $queryStr .=     'wd_update_dt = ? ';
563                 $queryStr .=   'WHERE wd_serial = ?';
564                 $this->execStatement($queryStr, array(intval($init), $userId, $now, $row['wd_serial']));
565                 
566                 // トランザクション確定
567                 $ret = $this->endTransaction();
568                 return $ret;
569         }
570         /**
571          * ページIDのリストを取得
572          *
573          * @param function $callback    コールバック関数
574          * @param int $type                             リストの種別
575          * @param int $filter                   データのフィルタリング(-1=PC携帯スマートフォンに関係なく取得、0=PC用のみ、1=携帯用のみ、2=スマートフォン用のみ)
576          * @return                                              なし
577          */
578         function getPageIdList($callback, $type, $filter = -1)
579         {
580                 $params = array($type);
581                 $queryStr = 'SELECT * FROM _page_id ';
582                 $queryStr .=  'WHERE pg_type = ? ';
583                 if ($filter != -1){
584                         // pg_device_typeは後で追加したため、pg_mobileを残しておく
585                         if ($filter != 1){                      // 携帯以外のとき
586                                 $queryStr .=    'AND pg_device_type = ? '; $params[] = $filter;
587                         }
588
589                         $queryStr .=  'AND pg_mobile = ? ';
590                         $mobile = 0;
591                         if ($filter == 1) $mobile = 1;                  // 携帯のとき
592                         $params[] = $mobile;
593                 }
594                 $queryStr .=  'ORDER BY pg_priority';
595                 $this->selectLoop($queryStr, $params, $callback);
596         }
597         /**
598          * ページIDのリストを取得
599          *
600          * @param int $type                             リストの種別(0=ページメインID,1=ページサブID)
601          * @param string $pageId                ページID
602          * @param array $row                    取得データ
603          * @return bool                                 true=成功、false=失敗
604          */
605         function getPageIdRecord($type, $pageId, &$row)
606         {
607                 $queryStr = 'SELECT * FROM _page_id ';
608                 $queryStr .=  'WHERE pg_type = ? ';
609                 $queryStr .=  'AND pg_id = ?';
610                 return $this->selectRecord($queryStr, array($type, $pageId), $row);
611         }
612         /**
613          * ページIDのリストを取得
614          *
615          * @param int $type                             リストの種別(0=ページメインID,1=ページサブID)
616          * @param array $row                    取得データ
617          * @return bool                                 true=成功、false=失敗
618          */
619         function getPageIdRecords($type, &$row)
620         {
621                 $queryStr = 'select * from _page_id ';
622                 $queryStr .=  'where pg_type = ? ';
623                 $queryStr .=  'order by pg_priority';
624                 return $this->selectRecords($queryStr, array($type), $row);
625         }
626         /**
627          * サブページIDのリストを取得
628          *
629          * @param string $pageId                ページID
630          * @param string $langId                言語ID
631          * @param function $callback    コールバック関数
632          * @return                                              なし
633          */
634         function getPageSubIdList($pageId, $langId, $callback)
635         {
636                 //$queryStr = 'SELECT * FROM _page_info RIGHT JOIN _page_id ON pn_sub_id = pg_id AND pg_type = 1 AND pn_deleted = false AND pn_id = ? ';
637                 $queryStr = 'SELECT * FROM _page_info RIGHT JOIN _page_id ON pn_sub_id = pg_id AND pg_type = 1 AND pn_deleted = false AND pn_id = ? AND pn_language_id = ? ';// 2010/2/23更新
638                 $queryStr .=  'WHERE (pn_deleted IS NULL ';
639                 $queryStr .=    'AND pg_type = 1) ';            // サブページID
640                 $queryStr .=    'OR pn_deleted = false ';
641                 $queryStr .=  'ORDER BY pg_priority';
642                 $this->selectLoop($queryStr, array($pageId, $langId), $callback);
643         }
644         /**
645          * ウィジェットが配置されているページサブIDのリストを取得
646          *
647          * @param string $pageId                ページID
648          * @param function $callback    コールバック関数
649          * @param int    $setId                 定義セットID
650          * @return                                              なし
651          */
652         function getPageSubIdListWithWidget($pageId, $callback, $setId = 0)
653         {
654                 $queryStr  = 'SELECT DISTINCT pg_id, pg_name, pn_content_type FROM _page_def LEFT JOIN _page_id ON pd_sub_id = pg_id AND pg_type = 1 ';// ページサブID
655                 $queryStr .= 'LEFT JOIN _page_info ON pd_id = pn_id AND pd_sub_id = pn_sub_id AND pn_deleted = false AND pn_language_id = \'\' ';
656                 $queryStr .=   'WHERE pd_id = ? ';
657                 $queryStr .=     'AND pd_sub_id != \'\' ';      // 共通でないウィジェットが配置されている
658                 $queryStr .=     'AND pd_set_id = ? ';
659                 $queryStr .=     'AND pg_visible = true ';      // 外部公開可能なページ
660                 $queryStr .=     'AND pg_active = true ';       // 外部公開可能なページ
661                 $queryStr .=   'ORDER BY pg_priority';
662                 $this->selectLoop($queryStr, array($pageId, $setId), $callback);
663         }
664         /**
665          * ページ情報の取得
666          *
667          * @param string $pageId                ページID
668          * @param string $pageSubId             ページサブID
669          * @param array $row                    取得データ
670          * @param string $langId                言語ID
671          * @return                                              true=正常、false=異常
672          */
673         function getPageInfo($pageId, $pageSubId, &$row, $langId = '')
674         {
675                 $queryStr = 'SELECT * FROM _page_info RIGHT JOIN _page_id ON pn_sub_id = pg_id AND pg_type = 1 AND pn_deleted = false AND pn_id = ? AND pn_language_id = ? ';// 2010/2/23更新
676                 $queryStr .=  'WHERE (pn_deleted IS NULL ';
677                 $queryStr .=    'AND pg_type = 1 AND pg_id = ?) ';              // サブページID
678                 $queryStr .=    'OR (pn_deleted = false ';
679                 $queryStr .=    'AND pn_sub_id = ?) ';          // サブページID
680                 $ret = $this->selectRecord($queryStr, array($pageId, $langId, $pageSubId, $pageSubId), $row);
681                 return $ret;
682         }
683         /**
684          * ページ情報を更新
685          *
686          * @param string $pageId                ページID
687          * @param string $pageSubId             ページサブID
688          * @param string $contentType   コンテンツタイプ
689          * @param string $template              テンプレートID
690          * @param int $authType                 アクセス制御タイプ(0=管理者のみ、1=制限なし、2=ログインユーザ)
691          * @param bool $ssl                             SSLを使用するかどうか
692          * @param bool $userLimited             ユーザ制限するかどうか
693          * @return                                      true = 正常、false=異常
694          */
695         function updatePageInfo($pageId, $pageSubId, $contentType='', $template='', $authType=0, $ssl = false, $userLimited = false)
696         {
697                 $now = date("Y/m/d H:i:s");     // 現在日時
698                 $user = $this->gEnv->getCurrentUserId();        // 現在のユーザ
699                 $metaTitle = '';
700                 $metaDesc = '';
701                 $metaKeyword = '';
702                 
703                 // トランザクション開始
704                 $this->startTransaction();
705                 
706                 // コンテンツタイプが指定されている場合は、他のデータのコンテンツタイプをクリア
707                 if (!empty($contentType)){
708                         $queryStr  = 'UPDATE _page_info ';
709                         $queryStr .=   'SET pn_content_type = \'\', ';          // コンテンツタイプをクリア
710                         $queryStr .=     'pn_update_user_id = ?, ';
711                         $queryStr .=     'pn_update_dt = ? ';
712                         $queryStr .=   'WHERE pn_deleted = false ';
713                         $queryStr .=     'AND pn_id = ? ';                                      // ページID
714                         $queryStr .=     'AND pn_content_type = ? ';            // コンテンツタイプ
715                         $queryStr .=     'AND pn_language_id = ? ';             // 言語ID(2010/2/23追加)
716                         $this->execStatement($queryStr, array($user, $now, $pageId, $contentType, ''/*言語なし*/));
717                 }
718                 
719                 // 指定のレコードの履歴インデックス取得
720                 $historyIndex = 0;              // 履歴番号
721                 $queryStr  = 'SELECT * FROM _page_info ';
722                 $queryStr .=   'WHERE pn_id = ? ';
723                 $queryStr .=     'AND pn_sub_id = ? ';
724                 $queryStr .=     'AND pn_language_id = ? ';             // 言語ID(2010/2/23追加)
725                 $queryStr .=  'ORDER BY pn_history_index DESC ';
726                 $ret = $this->selectRecord($queryStr, array($pageId, $pageSubId, ''/*言語なし*/), $row);
727                 if ($ret){
728                         $historyIndex = $row['pn_history_index'] + 1;
729                         $metaTitle = $row['pn_meta_title'];
730                         $metaDesc = $row['pn_meta_description'];
731                         $metaKeyword = $row['pn_meta_keywords'];
732                 
733                         // レコードが削除されていない場合は削除
734                         if (!$row['pn_deleted']){
735                                 // 古いレコードを削除
736                                 $queryStr  = 'UPDATE _page_info ';
737                                 $queryStr .=   'SET pn_deleted = true, ';       // 削除
738                                 $queryStr .=     'pn_update_user_id = ?, ';
739                                 $queryStr .=     'pn_update_dt = ? ';
740                                 $queryStr .=   'WHERE pn_serial = ?';
741                                 $ret = $this->execStatement($queryStr, array($user, $now, $row['pn_serial']));
742                                 if (!$ret){
743                                         $this->endTransaction();
744                                         return false;
745                                 }
746                         }
747                 }
748                 
749                 // 新規レコード追加
750                 $queryStr = 'INSERT INTO _page_info ';
751                 $queryStr .=  '(';
752                 $queryStr .=  'pn_id, ';
753                 $queryStr .=  'pn_sub_id, ';
754                 $queryStr .=  'pn_language_id, ';// 言語ID(2010/2/23追加)
755                 $queryStr .=  'pn_history_index, ';
756                 $queryStr .=  'pn_template_id, ';
757                 $queryStr .=  'pn_meta_title, ';
758                 $queryStr .=  'pn_meta_description, ';
759                 $queryStr .=  'pn_meta_keywords, ';
760                 $queryStr .=  'pn_content_type, ';
761                 $queryStr .=  'pn_auth_type, ';
762                 $queryStr .=  'pn_use_ssl, ';
763                 $queryStr .=  'pn_user_limited, ';
764                 $queryStr .=  'pn_create_user_id, ';
765                 $queryStr .=  'pn_create_dt) ';
766                 $queryStr .=  'VALUES ';
767                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
768                 $ret =$this->execStatement($queryStr, array($pageId, $pageSubId, ''/*言語なし*/, $historyIndex, $template, $metaTitle, $metaDesc, $metaKeyword, $contentType, $authType, intval($ssl), intval($userLimited), $user, $now));
769                         
770                 // トランザクション確定
771                 $ret = $this->endTransaction();
772                 return $ret;
773         }
774         /**
775          * ページヘッダ情報を更新
776          *
777          * @param string $pageId                ページID
778          * @param string $pageSubId             ページサブID
779          * @param string $langId                言語ID
780          * @param string $metaTitle             METAタグ、タイトル
781          * @param string $metaDesc              METAタグ、ページ要約
782          * @param string $metaKeyword   METAタグ、検索用キーワード
783          * @param string $headOthers    HEADタグ、その他
784          * @return                                      true = 正常、false=異常
785          */
786         function updatePageHead($pageId, $pageSubId, $langId, $metaTitle='', $metaDesc='', $metaKeyword='', $headOthers='')
787         {
788                 $now = date("Y/m/d H:i:s");     // 現在日時
789                 $user = $this->gEnv->getCurrentUserId();        // 現在のユーザ
790                 $template = '';                 // テンプレートID
791                 $contentType = '';
792                 $authType = 0;
793                 $ssl = false;
794                 $userLimited = false;
795                 
796                 // トランザクション開始
797                 $this->startTransaction();
798                 
799                 // 指定のレコードの履歴インデックス取得
800                 $historyIndex = 0;              // 履歴番号
801                 $queryStr  = 'SELECT * FROM _page_info ';
802                 $queryStr .=   'WHERE pn_id = ? ';
803                 $queryStr .=     'AND pn_sub_id = ? ';
804                 $queryStr .=     'AND pn_language_id = ? ';             // 言語ID(2010/2/23追加)
805                 $queryStr .=  'ORDER BY pn_history_index DESC ';
806                 $ret = $this->selectRecord($queryStr, array($pageId, $pageSubId, $langId), $row);
807                 if ($ret){
808                         $historyIndex = $row['pn_history_index'] + 1;
809                         $template = $row['pn_template_id'];                     // テンプレートID
810                         $contentType = $row['pn_content_type'];
811                         $authType = $row['pn_auth_type'];
812                         $ssl = $row['pn_use_ssl'];
813                         $userLimited = $row['pn_user_limited'];
814                         
815                         // レコードが削除されていない場合は削除
816                         if (!$row['pn_deleted']){
817                                 // 古いレコードを削除
818                                 $queryStr  = 'UPDATE _page_info ';
819                                 $queryStr .=   'SET pn_deleted = true, ';       // 削除
820                                 $queryStr .=     'pn_update_user_id = ?, ';
821                                 $queryStr .=     'pn_update_dt = ? ';
822                                 $queryStr .=   'WHERE pn_serial = ?';
823                                 $ret = $this->execStatement($queryStr, array($user, $now, $row['pn_serial']));
824                                 if (!$ret){
825                                         $this->endTransaction();
826                                         return false;
827                                 }
828                         }
829                 }
830                 
831                 // 新規レコード追加
832                 $queryStr = 'INSERT INTO _page_info ';
833                 $queryStr .=  '(';
834                 $queryStr .=  'pn_id, ';
835                 $queryStr .=  'pn_sub_id, ';
836                 $queryStr .=  'pn_language_id, ';// 言語ID(2010/2/23追加)
837                 $queryStr .=  'pn_history_index, ';
838                 $queryStr .=  'pn_template_id, ';
839                 $queryStr .=  'pn_meta_title, ';
840                 $queryStr .=  'pn_meta_description, ';
841                 $queryStr .=  'pn_meta_keywords, ';
842                 $queryStr .=  'pn_head_others, ';
843                 $queryStr .=  'pn_content_type, ';
844                 $queryStr .=  'pn_auth_type, ';
845                 $queryStr .=  'pn_use_ssl, ';
846                 $queryStr .=  'pn_user_limited, ';
847                 $queryStr .=  'pn_create_user_id, ';
848                 $queryStr .=  'pn_create_dt) ';
849                 $queryStr .=  'VALUES ';
850                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
851                 $ret =$this->execStatement($queryStr, array($pageId, $pageSubId, $langId, $historyIndex, $template, $metaTitle, $metaDesc, $metaKeyword, $headOthers, $contentType, $authType, intval($ssl), intval($userLimited), $user, $now));
852                         
853                 // トランザクション確定
854                 $ret = $this->endTransaction();
855                 return $ret;
856         }
857         /**
858          * ページIDの更新
859          *
860          * @param int $type                             ページタイプ(0=ページID,1=ページサブID)
861          * @param string  $id                   ID
862          * @param string  $name                 名前
863          * @param string  $desc                 説明
864          * @param int  $priority                優先度
865          * @param bool  $active                 有効かどうか
866          * @return                                              true=成功、false=失敗
867          */
868         function updatePageId($type, $id, $name, $desc, $priority, $active)
869         {
870                 // トランザクション開始
871                 $this->startTransaction();
872                 
873                 $ret = $this->isExistsPageId($type, $id);
874                 if ($ret){              // データが存在する場合
875                         // 既存項目を更新
876                         $queryStr  = 'UPDATE _page_id ';
877                         $queryStr .=   'SET ';
878                         $queryStr .=     'pg_name = ?, ';
879                         $queryStr .=     'pg_description = ?, ';
880                         $queryStr .=     'pg_priority = ?, ';
881                         $queryStr .=     'pg_active = ? ';
882                         $queryStr .=   'WHERE pg_id = ? ';
883                         $queryStr .=     'AND pg_type = ? ';
884                         $this->execStatement($queryStr, array($name, $desc, $priority, intval($active), $id, $type));
885                 } else {
886                         // 新規レコードを追加
887                         $queryStr  = 'INSERT INTO _page_id (';
888                         $queryStr .=   'pg_id, ';
889                         $queryStr .=   'pg_type, ';
890                         $queryStr .=   'pg_name, ';
891                         $queryStr .=   'pg_description, ';
892                         $queryStr .=   'pg_priority, ';
893                         $queryStr .=   'pg_active ';
894                         $queryStr .= ') VALUES (';
895                         $queryStr .=   '?, ';
896                         $queryStr .=   '?, ';
897                         $queryStr .=   '?, ';
898                         $queryStr .=   '?, ';
899                         $queryStr .=   '?, ';
900                         $queryStr .=   '?) ';
901                         $this->execStatement($queryStr, array($id, $type, $name, $desc, $priority, intval($active)));
902                 }
903
904                 // トランザクション確定
905                 $ret = $this->endTransaction();
906                 return $ret;
907         }
908         /**
909          * ページIDの存在チェック
910          *
911          * @param int $type                             リストの種別
912          * @param string  $id                   ID
913          * @return bool                                 true=存在する、false=存在しない
914          */
915         function isExistsPageId($type, $id)
916         {
917                 $queryStr = 'SELECT * FROM _page_id ';
918                 $queryStr .=  'WHERE pg_type = ? ';
919                 $queryStr .=  'AND pg_id = ? ';
920                 return $this->isRecordExists($queryStr, array($type, $id));
921         }
922         /**
923          * ページIDの削除
924          *
925          * @param int $type                             リストの種別
926          * @param string  $id                   ID
927          * @return bool                                 true=存在する、false=存在しない
928          */
929         function deletePageId($type, $id)
930         {
931                 // トランザクション開始
932                 $this->startTransaction();
933                 
934                 $queryStr = 'DELETE FROM _page_id ';
935                 $queryStr .=  'WHERE pg_type = ? ';
936                 $queryStr .=  'AND pg_id = ? ';
937                 $this->execStatement($queryStr, array($type, $id));
938                 
939                 // トランザクション確定
940                 $ret = $this->endTransaction();
941                 return $ret;
942         }
943         /**
944          * ページポジションのリストを取得
945          *
946          * @param function $callback    コールバック関数
947          * @return                                              なし
948          */
949         function getPagePositionList($callback)
950         {
951                 $queryStr = 'select * from _template_position ';
952                 $queryStr .=  'order by tp_sort_order';
953                 $this->selectLoop($queryStr, array(), $callback);
954         }
955         /**
956          * ページ定義のリスト取得
957          *
958          * @param function $callback    コールバック関数
959          * @param string $pageId                ページID
960          * @param string $pageSubId             ページサブID
961          * @param string $position              表示位置。空文字列のときはすべて取得。
962          * @param int    $setId                 定義セットID
963          * @return                                              なし
964          */
965         function getPageDefList($callback, $pageId, $pageSubId, $position = '', $setId = 0)
966         {
967                 $queryStr  = 'select * from _page_def left join _widgets on pd_widget_id = wd_id and wd_deleted = false ';
968                 $queryStr .=   'where pd_id = ? ';
969                 $queryStr .=     'and (pd_sub_id = ? or pd_sub_id = \'\') ';    // 空の場合は共通項目
970                 $queryStr .=     'and pd_set_id = ? ';
971                 if (empty($position)){
972                         $queryStr .=   'order by pd_position_id, pd_index';
973                         $this->selectLoop($queryStr, array($pageId, $pageSubId, $setId), $callback);
974                 } else {
975                         $queryStr .=     'and pd_position_id = ? ';
976                         $queryStr .=   'order by pd_position_id, pd_index';
977                         $this->selectLoop($queryStr, array($pageId, $pageSubId, $setId, $position), $callback);
978                 }
979         }
980         /**
981          * ページ定義があるか確認
982          *
983          * @param string $pageId                ページID
984          * @param string $pageSubId             ページサブID
985          * @param string $position      表示位置
986          * @param int $index            表示インデックス
987          * @param int    $setId                 定義セットID
988          * @return bool                         true=存在する、false=存在しない
989          */
990          /*
991         function isPageDefExists($pageId, $pageSubId, $position, $index, $setId = 0)
992         {
993                 $queryStr  = 'select * from _page_def ';
994                 $queryStr .=   'where pd_id = ? ';
995                 $queryStr .=     'and pd_sub_id = ? ';
996                 $queryStr .=     'and pd_position_id = ? ';
997                 $queryStr .=     'and pd_index = ? ';
998                 return $this->isRecordExists($queryStr, array($pageId, $pageSubId, $position, $index));
999         }*/
1000         /**
1001          * ページ定義を取得
1002          *
1003          * @param int $serialNo                 シリアルNo
1004          * @param array  $rows                  更新データ
1005          * @return bool                         true=存在する、false=存在しない
1006          */
1007         function getPageDef($serialNo, &$row)
1008         {
1009                 $queryStr  = 'SELECT * FROM _page_def LEFT JOIN _widgets on pd_widget_id = wd_id AND wd_deleted = false ';
1010                 $queryStr .=   'WHERE pd_serial = ?';
1011                 return $this->selectRecord($queryStr, array($serialNo), $row);
1012         }
1013         /**
1014          * ページ定義項目の更新
1015          *
1016          * @param int $serialNo                 シリアルNo(0のとき新規追加)
1017          * @param string $pageId                ページID
1018          * @param string $pageSubId             ページサブID
1019          * @param string $position              表示位置
1020          * @param int $index                    表示インデックスNo
1021          * @param string $widgetId              ウィジェットID
1022          * @param int $configId                 定義ID
1023          * @param string $suffix                サフィックス
1024          * @param string $style                 css
1025          * @param bool $visible                 表示状態
1026          * @param int $userId                   ユーザID(データ更新者)
1027          * @param int    $setId                 定義セットID
1028          * @return                                              true=成功、false=失敗
1029          */
1030         function updatePageDef($serialNo, $pageId, $pageSubId, $position, $index, $widgetId, $configId, $suffix, $style, $visible, $userId, $setId = 0)
1031         {
1032                 // 更新ユーザ、日時設定
1033                 $this->now = date("Y/m/d H:i:s");       // 現在日時
1034                 $this->userId = $userId;
1035                 $editable = 1;          // 編集可能
1036                 
1037                 // トランザクション開始
1038                 $this->startTransaction();
1039
1040                 if ($serialNo == 0){            // 新規追加
1041                         // 新規データを追加
1042                         $queryStr  = 'INSERT INTO _page_def (';
1043                         $queryStr .=   'pd_id, ';
1044                         $queryStr .=   'pd_sub_id, ';
1045                         $queryStr .=   'pd_set_id, ';
1046                         $queryStr .=   'pd_position_id, ';
1047                         $queryStr .=   'pd_index, ';
1048                         $queryStr .=   'pd_widget_id, ';
1049                         $queryStr .=   'pd_config_id, ';
1050                         $queryStr .=   'pd_suffix, ';
1051                         $queryStr .=   'pd_style, ';
1052                         $queryStr .=   'pd_visible, ';
1053                         $queryStr .=   'pd_editable, ';
1054                         $queryStr .=   'pd_update_user_id, ';
1055                         $queryStr .=   'pd_update_dt) ';
1056                         $queryStr .= 'VALUES (';
1057                         $queryStr .=   '?, ';
1058                         $queryStr .=   '?, ';
1059                         $queryStr .=   '?, ';
1060                         $queryStr .=   '?, ';
1061                         $queryStr .=   '?, ';
1062                         $queryStr .=   '?, ';
1063                         $queryStr .=   '?, ';
1064                         $queryStr .=   '?, ';
1065                         $queryStr .=   '?, ';
1066                         $queryStr .=   '?, ';
1067                         $queryStr .=   '?, ';
1068                         $queryStr .=   '?, ';
1069                         $queryStr .=   '?)';
1070                         $this->execStatement($queryStr, array($pageId, $pageSubId, $setId, $position, $index, 
1071                                                                 $widgetId, $configId, $suffix, $style, $visible, $editable, $this->userId, $this->now));
1072                 } else {                        // 更新
1073                         $queryStr  = 'select * from _page_def ';
1074                         $queryStr .=   'where pd_serial = ? ';
1075                         $ret = $this->selectRecord($queryStr, array($serialNo), $row);
1076                         if ($ret){
1077                                 if ($row['pd_id'] != $pageId || $row['pd_sub_id'] != $pageSubId){                       // 表示ページが変更された
1078                                         // 新規に追加して、古いレコードを削除
1079                                         // 新規データを追加
1080                                         $queryStr  = 'INSERT INTO _page_def (';
1081                                         $queryStr .=   'pd_id, ';
1082                                         $queryStr .=   'pd_sub_id, ';
1083                                         $queryStr .=   'pd_set_id, ';
1084                                         $queryStr .=   'pd_position_id, ';
1085                                         $queryStr .=   'pd_index, ';
1086                                         $queryStr .=   'pd_widget_id, ';
1087                                         $queryStr .=   'pd_config_id, ';
1088                                         $queryStr .=   'pd_suffix, ';
1089                                         $queryStr .=   'pd_style, ';
1090                                         $queryStr .=   'pd_visible, ';
1091                                         $queryStr .=   'pd_editable, ';
1092                                         $queryStr .=   'pd_update_user_id, ';
1093                                         $queryStr .=   'pd_update_dt) ';
1094                                         $queryStr .= 'VALUES (';
1095                                         $queryStr .=   '?, ';
1096                                         $queryStr .=   '?, ';
1097                                         $queryStr .=   '?, ';
1098                                         $queryStr .=   '?, ';
1099                                         $queryStr .=   '?, ';
1100                                         $queryStr .=   '?, ';
1101                                         $queryStr .=   '?, ';
1102                                         $queryStr .=   '?, ';
1103                                         $queryStr .=   '?, ';
1104                                         $queryStr .=   '?, ';
1105                                         $queryStr .=   '?, ';
1106                                         $queryStr .=   '?, ';
1107                                         $queryStr .=   '?)';
1108                                         $this->execStatement($queryStr, array($pageId, $pageSubId, $row['pd_set_id'], $position, $index, 
1109                                                                                 $widgetId, $configId, $suffix, $style, $visible, $editable, $this->userId, $this->now));
1110                                                                                 
1111                                         // 旧データ削除
1112                                         $queryStr  = 'DELETE FROM _page_def WHERE pd_serial = ?';
1113                                         $this->execStatement($queryStr, array($serialNo));
1114                                 } else {
1115                                         // 既存項目を更新
1116                                         $queryStr  = 'UPDATE _page_def ';
1117                                         $queryStr .=   'SET ';
1118                                         $queryStr .=     'pd_position_id = ?, ';
1119                                         $queryStr .=     'pd_index = ?, ';
1120                                         $queryStr .=     'pd_widget_id = ?, ';
1121                                         $queryStr .=     'pd_config_id = ?, ';
1122                                         $queryStr .=     'pd_suffix = ?, ';
1123                                         $queryStr .=     'pd_style = ?, ';
1124                                         $queryStr .=     'pd_visible = ?, ';
1125                                         $queryStr .=     'pd_editable = ?, ';
1126                                         $queryStr .=     'pd_update_user_id = ?, ';
1127                                         $queryStr .=     'pd_update_dt = ? ';
1128                                         $queryStr .=   'WHERE pd_serial = ? ';
1129                                         $this->execStatement($queryStr, array($position, $index, 
1130                                                                                 $widgetId, $configId, $suffix, $style, $visible, $editable, $this->userId, $this->now, $serialNo));
1131                                 }
1132                         }
1133                 }
1134
1135                 // トランザクション確定
1136                 $ret = $this->endTransaction();
1137                 return $ret;
1138         }
1139         /**
1140          * ページ定義項目のスタイル値の変更
1141          *
1142          * @param int $serialNo                 シリアルNo
1143          * @param string $style                 スタイル値
1144          * @param string $title                 タイトル
1145          * @param bool $titleVisible    タイトルを表示するかどうか
1146          * @param bool $useRender               Joomla!の描画処理を使用するかどうか
1147          * @param string $topContent    補助コンテンツ(上)
1148          * @param string $bottomContent 補助コンテンツ(下)
1149          * @param bool $showReadmore    もっと読むボタンを表示するかどうか
1150          * @param string $readmoreTitle もっと読むボタンタイトル
1151          * @param string $readmoreUrl   もっと読むリンク先URL
1152          * @return                                              true=成功、false=失敗
1153          */
1154         function updatePageDefInfo($serialNo, $style, $title, $titleVisible, $useRender, $topContent, $bottomContent, $showReadmore, $readmoreTitle, $readmoreUrl)
1155         {
1156                 $now = date("Y/m/d H:i:s");     // 現在日時
1157                 $user = $this->gEnv->getCurrentUserId();        // 現在のユーザ
1158
1159                 // トランザクション開始
1160                 $this->startTransaction();
1161                 
1162                 // 既存項目を更新
1163                 $queryStr  = 'UPDATE _page_def ';
1164                 $queryStr .=   'SET ';
1165                 $queryStr .=     'pd_style = ?, ';
1166                 $queryStr .=     'pd_title = ?, ';
1167                 $queryStr .=     'pd_title_visible = ?, ';
1168                 $queryStr .=     'pd_use_render = ?, ';
1169                 $queryStr .=     'pd_top_content = ?, ';
1170                 $queryStr .=     'pd_bottom_content = ?, ';
1171                 $queryStr .=     'pd_show_readmore = ?, ';
1172                 $queryStr .=     'pd_readmore_title = ?, ';
1173                 $queryStr .=     'pd_readmore_url = ?, ';
1174                 $queryStr .=     'pd_update_user_id = ?, ';
1175                 $queryStr .=     'pd_update_dt = ? ';
1176                 $queryStr .=   'WHERE pd_serial = ? ';
1177                 $ret = $this->execStatement($queryStr, array($style, $title, intval($titleVisible), intval($useRender), $topContent, $bottomContent, intval($showReadmore), $readmoreTitle, $readmoreUrl, $user, $now, $serialNo));
1178
1179                 // トランザクション確定
1180                 $ret = $this->endTransaction();
1181                 return $ret;
1182         }
1183         /**
1184          * ページ定義レコードを更新
1185          *
1186          * @param int $serialNo                 シリアルNo
1187          * @param array $updateData             更新データ(キー=フィールド名、値=更新値の配列)
1188          * @return                                              true=成功、false=失敗
1189          */
1190         function updatePageDefRecord($serialNo, $updateData)
1191         {
1192                 $now = date("Y/m/d H:i:s");     // 現在日時
1193                 $user = $this->gEnv->getCurrentUserId();        // 現在のユーザ
1194                 $param = array();
1195                 $keys = array_keys($updateData);// キーを取得
1196                 
1197                 // トランザクション開始
1198                 $this->startTransaction();
1199                 
1200                 // 既存項目を更新
1201                 $queryStr  = 'UPDATE _page_def ';
1202                 $queryStr .=   'SET ';
1203                 for ($i = 0; $i < count($keys); $i++){
1204                         $queryStr .= $keys[$i] . ' = ?, ';
1205                         $param[] = $updateData[$keys[$i]];
1206                 }
1207                 $queryStr .=     'pd_update_user_id = ?, ';
1208                 $queryStr .=     'pd_update_dt = ? ';
1209                 $queryStr .=   'WHERE pd_serial = ? ';
1210                 $ret = $this->execStatement($queryStr, array_merge($param, array($user, $now, $serialNo)));
1211
1212                 // トランザクション確定
1213                 $ret = $this->endTransaction();
1214                 return $ret;
1215         }
1216         /**
1217          * ウィジェットの共通属性を変更
1218          *
1219          * @param string $pageId                ページID
1220          * @param string $pageSubId             ページサブID
1221          * @param int $serial           シリアル番号
1222          * @param int    $shared        共通属性
1223          * @return bool                         true=成功、false=失敗
1224          */
1225         function toggleSharedWidget($pageId, $pageSubId, $serial, $shared)
1226         {
1227                 $now = date("Y/m/d H:i:s");     // 現在日時
1228                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1229                 
1230                 // トランザクション開始
1231                 $this->startTransaction();
1232                 
1233                 // 現在の値取得
1234                 $queryStr  = 'SELECT * FROM _page_def ';
1235                 $queryStr .=   'WHERE pd_serial = ? ';
1236                 $ret = $this->selectRecord($queryStr, array($serial), $row);
1237                 if ($ret){
1238                         if (empty($shared)){            // 単独ウィジェットのとき
1239                                 $newPageSubId = $pageSubId;
1240                         } else {
1241                                 $newPageSubId = '';
1242                         }
1243                         
1244                         // 既存項目を更新
1245                         $queryStr  = 'UPDATE _page_def ';
1246                         $queryStr .=   'SET ';
1247                         $queryStr .=     'pd_sub_id = ?, ';
1248                         $queryStr .=     'pd_update_user_id = ?, ';
1249                         $queryStr .=     'pd_update_dt = ? ';
1250                         $queryStr .=   'WHERE pd_serial = ? ';
1251                         $this->execStatement($queryStr, array($newPageSubId, $userId, $now, $serial));
1252                 } else {
1253                         $this->endTransaction();
1254                         return false;
1255                 }
1256                 
1257                 // トランザクション確定
1258                 $ret = $this->endTransaction();
1259                 return $ret;
1260         }
1261         /**
1262          * ページ定義項目の削除
1263          *
1264          * @param int $serialNo                 シリアルNo
1265          * @param int $userId                   ユーザID(データ更新者)
1266          * @return                                              true=成功、false=失敗
1267          */
1268         function delPageDef($serialNo, $userId)
1269         {
1270                 // 更新ユーザ、日時設定
1271                 $this->now = date("Y/m/d H:i:s");       // 現在日時
1272                 $this->userId = $userId;
1273                 
1274                 // トランザクション開始
1275                 $this->startTransaction();
1276                 
1277                 $queryStr  = 'DELETE FROM _page_def WHERE pd_serial = ?';
1278                 $this->execStatement($queryStr, array($serialNo));
1279                 
1280                 // トランザクション確定
1281                 $ret = $this->endTransaction();
1282                 return $ret;
1283         }
1284         
1285         /**
1286          * ページ定義項目をすべて削除
1287          *
1288          * @param string  $pageId                       ページID
1289          * @param string  $pageSubId            ページサブID
1290          * @param string  $position                     表示ポジション
1291          * @param bool $withCommon                      共通項目も削除するかどうか
1292          * @param int    $setId                 定義セットID
1293          * @return                                              true=成功、false=失敗
1294          */
1295         function delPageDefAll($pageId, $pageSubId, $position, $withCommon, $setId = 0)
1296         {
1297                 // トランザクション開始
1298                 $this->startTransaction();
1299                 
1300                 if (empty($position)){
1301                         $queryStr  = 'DELETE FROM _page_def ';
1302                         $queryStr .=   'WHERE pd_id = ? ';
1303                         if ($withCommon){
1304                                 $queryStr .=     'and (pd_sub_id = ? or pd_sub_id = \'\') ';    // 空の場合は共通項目
1305                         } else {
1306                                 $queryStr .=     'and pd_sub_id = ? ';  // 空の場合は共通項目
1307                         }
1308                         $queryStr .=     'and pd_set_id = ? ';
1309                         $this->execStatement($queryStr, array($pageId, $pageSubId, $setId));
1310                 } else {
1311                         $queryStr  = 'DELETE FROM _page_def ';
1312                         $queryStr .=   'WHERE pd_id = ? ';
1313                         if ($withCommon){
1314                                 $queryStr .=     'and (pd_sub_id = ? or pd_sub_id = \'\') ';    // 空の場合は共通項目
1315                         } else {
1316                                 $queryStr .=     'and pd_sub_id = ? ';  // 空の場合は共通項目
1317                         }
1318                         $queryStr .=     'and pd_position_id = ? ';
1319                         $queryStr .=     'and pd_set_id = ? ';
1320                         $this->execStatement($queryStr, array($pageId, $pageSubId, $position, $setId));
1321                 }
1322                 
1323                 // トランザクション確定
1324                 $ret = $this->endTransaction();
1325                 return $ret;
1326         }
1327         /**
1328          * ユーザリスト取得
1329          *
1330          * @param int           $limit                          取得する項目数
1331          * @param int           $page                           取得するページ(1~)
1332          * @param function $callback    コールバック関数
1333          * @return                                              なし
1334          */
1335         function getAllUserList($limit, $page, $callback)
1336         {
1337                 $offset = $limit * ($page -1);
1338                 if ($offset < 0) $offset = 0;
1339                 
1340                 $queryStr = 'SELECT * FROM _login_user LEFT JOIN _login_log on lu_id = ll_user_id ';
1341                 $queryStr .=  'WHERE lu_deleted = false ';// 削除されていない
1342                 $queryStr .=  'ORDER BY lu_user_type, lu_account limit ' . $limit . ' offset ' . $offset;
1343                 $this->selectLoop($queryStr, array(), $callback);
1344         }
1345         /**
1346          * ユーザ総数取得
1347          *
1348          * @return int                                  総数
1349          */
1350         function getAllUserListCount()
1351         {
1352                 $queryStr = 'select * from _login_user ';
1353                 $queryStr .=  'where lu_deleted = false ';// 削除されていない
1354                 return $this->selectRecordCount($queryStr, array());
1355         }
1356         /**
1357          * ログイン状況取得
1358          *
1359          * @param int           $limit                          取得する項目数
1360          * @param int           $page                           取得するページ(1~)
1361          * @param function $callback    コールバック関数
1362          * @return                                              なし
1363          */
1364         function getUserLoginStatusList($limit, $page, $callback)
1365         {
1366                 $offset = $limit * ($page -1);
1367                 if ($offset < 0) $offset = 0;
1368                 
1369                 $queryStr = 'SELECT lu_id,lu_account,lu_name,lu_user_type,lu_user_status,ll_login_count,ll_access_log_serial,ll_pre_login_dt,ll_last_login_dt, ';
1370                 $queryStr .=    'CASE WHEN ll_last_login_dt IS NULL THEN 1 ELSE 0 ';
1371                 $queryStr .=    'END AS ord ';
1372                 $queryStr .=    'FROM _login_user LEFT JOIN _login_log on lu_id = ll_user_id ';
1373                 $queryStr .=  'WHERE lu_deleted = false ';// 削除されていない
1374                 $queryStr .=  'ORDER BY ord, ll_last_login_dt desc limit ' . $limit . ' offset ' . $offset;
1375                 $this->selectLoop($queryStr, array(), $callback);
1376         }
1377         /**
1378          * ログイン状況数取得
1379          *
1380          * @return int                                  総数
1381          */
1382         function getUserLoginStatusListCount()
1383         {
1384                 $queryStr = 'SELECT * FROM _login_user LEFT JOIN _login_log on lu_id = ll_user_id ';
1385                 $queryStr .=  'WHERE lu_deleted = false ';// 削除されていない
1386                 return $this->selectRecordCount($queryStr, array());
1387         }
1388         /**
1389          * 新規ユーザの追加
1390          *
1391          * @param string  $name                 名前
1392          * @param string  $account              アカウント
1393          * @param string  $password             パスワード
1394          * @param int     $userType             ユーザ種別
1395          * @param bool    $canLogin             ログインできるかどうか
1396          * @param timestamp     $startDt        期間(開始日)
1397          * @param timestamp     $endDt          期間(終了日)
1398          * @param int     $newSerial    新規シリアル番号
1399          * @return                                              true=成功、false=失敗
1400          */
1401 /*      function addNewUser($name, $account, $password, $userType, $canLogin, $startDt, $endDt, &$newSerial)
1402         {
1403                 $now = date("Y/m/d H:i:s");     // 現在日時
1404                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1405                 
1406                 // トランザクション開始
1407                 $this->startTransaction();
1408                 
1409                 // 新規IDを作成
1410                 $newId = 1;
1411                 $queryStr = 'select max(lu_id) as ms from _login_user ';
1412                 $ret = $this->selectRecord($queryStr, array(), $row);
1413                 if ($ret) $newId = $row['ms'] + 1;
1414                 
1415                 // 新規レコードを追加
1416                 $queryStr  = 'INSERT INTO _login_user (';
1417                 $queryStr .=   'lu_id, ';
1418                 $queryStr .=   'lu_history_index, ';
1419                 $queryStr .=   'lu_name, ';
1420                 $queryStr .=   'lu_account, ';
1421                 $queryStr .=   'lu_password, ';
1422                 $queryStr .=   'lu_user_type, ';
1423                 $queryStr .=   'lu_enable_login, ';
1424                 $queryStr .=   'lu_active_start_dt, ';
1425                 $queryStr .=   'lu_active_end_dt, ';
1426                 $queryStr .=   'lu_create_user_id, ';
1427                 $queryStr .=   'lu_create_dt ';
1428                 $queryStr .= ') VALUES (';
1429                 $queryStr .=   '?, ';
1430                 $queryStr .=   '?, ';
1431                 $queryStr .=   '?, ';
1432                 $queryStr .=   '?, ';
1433                 $queryStr .=   '?, ';
1434                 $queryStr .=   '?, ';
1435                 $queryStr .=   '?, ';
1436                 $queryStr .=   '?, ';
1437                 $queryStr .=   '?, ';
1438                 $queryStr .=   '?, ';
1439                 $queryStr .=   '?) ';
1440                 $this->execStatement($queryStr, array($newId, 0, $name, $account, $password, $userType, $canLogin, $startDt, $endDt, $userId, $now));
1441                 
1442                 // 新規のシリアル番号取得
1443                 $queryStr = 'select max(lu_serial) as ns from _login_user ';
1444                 $ret = $this->selectRecord($queryStr, array(), $row);
1445                 if ($ret) $newSerial = $row['ns'];
1446                 
1447                 // トランザクション確定
1448                 $ret = $this->endTransaction();
1449                 return $ret;
1450         }*/
1451         /**
1452          * ユーザの更新
1453          *
1454          * @param int $serial                   シリアル番号
1455          * @param string  $name                 ユーザ名
1456          * @param string  $account              アカウント
1457          * @param string  $password             パスワード(空のときは更新しない)
1458          * @param int     $userType             ユーザ種別
1459          * @param string $canLogin              ログイン可能かどうか
1460          * @param timestamp     $startDt        期間(開始日)
1461          * @param timestamp     $endDt          期間(終了日)
1462          * @param int     $newSerial    新規シリアル番号
1463          * @return                                              true=成功、false=失敗
1464          */
1465 /*      function updateUser($serial, $name, $account, $password, $userType, $canLogin, $startDt, $endDt, &$newSerial)
1466         {
1467                 $now = date("Y/m/d H:i:s");     // 現在日時
1468                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1469                                 
1470                 // トランザクション開始
1471                 $this->startTransaction();
1472                 
1473                 // 指定のシリアルNoのレコードが削除状態でないかチェック
1474                 $historyIndex = 0;              // 履歴番号
1475                 $queryStr  = 'select * from _login_user ';
1476                 $queryStr .=   'where lu_serial = ? ';
1477                 $ret = $this->selectRecord($queryStr, array($serial), $row);
1478                 if ($ret){              // 既に登録レコードがあるとき
1479                         if ($row['lu_deleted']){                // レコードが削除されていれば終了
1480                                 $this->endTransaction();
1481                                 return false;
1482                         }
1483                         $historyIndex = $row['lu_history_index'] + 1;
1484                 } else {                // 存在しない場合は終了
1485                         $this->endTransaction();
1486                         return false;
1487                 }
1488                 
1489                 // パスワードが設定されているときは更新
1490                 $pwd = $row['lu_password'];
1491                 if (!empty($password)) $pwd = $password;
1492                 
1493                 // 古いレコードを削除
1494                 $queryStr  = 'UPDATE _login_user ';
1495                 $queryStr .=   'SET lu_deleted = true, ';       // 削除
1496                 $queryStr .=     'lu_update_user_id = ?, ';
1497                 $queryStr .=     'lu_update_dt = ? ';
1498                 $queryStr .=   'WHERE lu_serial = ?';
1499                 $this->execStatement($queryStr, array($userId, $now, $serial));
1500
1501                 // 新規レコード追加
1502                 $queryStr  = 'INSERT INTO _login_user (';
1503                 $queryStr .=   'lu_id, ';
1504                 $queryStr .=   'lu_history_index, ';
1505                 $queryStr .=   'lu_name, ';
1506                 $queryStr .=   'lu_account, ';
1507                 $queryStr .=   'lu_password, ';
1508                 $queryStr .=   'lu_user_type, ';
1509                 $queryStr .=   'lu_assign, ';
1510                 $queryStr .=   'lu_widget_id, ';
1511                 $queryStr .=   'lu_enable_login, ';
1512                 $queryStr .=   'lu_active_start_dt, ';
1513                 $queryStr .=   'lu_active_end_dt, ';
1514                 $queryStr .=   'lu_create_user_id, ';
1515                 $queryStr .=   'lu_create_dt ';
1516                 $queryStr .= ') VALUES (';
1517                 $queryStr .=   '?, ';
1518                 $queryStr .=   '?, ';
1519                 $queryStr .=   '?, ';
1520                 $queryStr .=   '?, ';
1521                 $queryStr .=   '?, ';
1522                 $queryStr .=   '?, ';
1523                 $queryStr .=   '?, ';
1524                 $queryStr .=   '?, ';
1525                 $queryStr .=   '?, ';
1526                 $queryStr .=   '?, ';
1527                 $queryStr .=   '?, ';
1528                 $queryStr .=   '?, ';
1529                 $queryStr .=   '?) ';
1530                 $this->execStatement($queryStr, array($row['lu_id'], $historyIndex, $name, $account, $pwd, $userType, $row['lu_assign'], $row['lu_widget_id'], $canLogin, $startDt, $endDt, $userId, $now));
1531
1532                 // 新規のシリアル番号取得
1533                 $queryStr = 'select max(lu_serial) as ns from _login_user ';
1534                 $ret = $this->selectRecord($queryStr, array(), $row);
1535                 if ($ret) $newSerial = $row['ns'];
1536                 
1537                 // トランザクション確定
1538                 $ret = $this->endTransaction();
1539                 return $ret;
1540         }*/
1541         /**
1542          * ユーザの削除
1543          *
1544          * @param array $serial                 シリアルNo
1545          * @return                                              true=成功、false=失敗
1546          */
1547         function delUserBySerial($serial)
1548         {
1549                 // 引数のエラーチェック
1550                 if (!is_array($serial)) return false;
1551                 if (count($serial) <= 0) return true;
1552                 
1553                 $now = date("Y/m/d H:i:s");     // 現在日時
1554                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1555                 
1556                 // トランザクション開始
1557                 $this->startTransaction();
1558                 
1559                 // 指定のシリアルNoのレコードが削除状態でないかチェック
1560                 for ($i = 0; $i < count($serial); $i++){
1561                         $queryStr  = 'SELECT * FROM _login_user ';
1562                         $queryStr .=   'WHERE lu_deleted = false ';             // 未削除
1563                         $queryStr .=     'AND lu_serial = ? ';
1564                         $ret = $this->isRecordExists($queryStr, array($serial[$i]));
1565                         // 存在しない場合は、既に削除されたとして終了
1566                         if (!$ret){
1567                                 $this->endTransaction();
1568                                 return false;
1569                         }
1570                 }
1571                 
1572                 // レコードを削除
1573                 $queryStr  = 'UPDATE _login_user ';
1574                 $queryStr .=   'SET lu_deleted = true, ';       // 削除
1575                 $queryStr .=     'lu_update_user_id = ?, ';
1576                 $queryStr .=     'lu_update_dt = ? ';
1577                 $queryStr .=   'WHERE lu_serial in (' . implode($serial, ',') . ') ';
1578                 $this->execStatement($queryStr, array($userId, $now));
1579                 
1580                 // トランザクション確定
1581                 $ret = $this->endTransaction();
1582                 return $ret;
1583         }
1584         /**
1585          * ユーザ情報をシリアル番号で取得
1586          *
1587          * @param string        $serial                         シリアル番号
1588          * @param array     $row                                レコード
1589          * @param array     $groupRows                  ユーザグループ
1590          * @return bool                                                 取得 = true, 取得なし= false
1591          */
1592         function getUserBySerial($serial, &$row, &$groupRows)
1593         {
1594                 $queryStr  = 'SELECT * FROM _login_user ';
1595                 $queryStr .=   'WHERE lu_serial = ? ';
1596                 $ret = $this->selectRecord($queryStr, array($serial), $row);
1597                 
1598                 // ユーザグループを取得
1599                 if ($ret){
1600                         $queryStr  = 'SELECT * FROM _user_with_group LEFT JOIN _user_group ON uw_group_id = ug_id AND ug_deleted = false ';
1601                         $queryStr .=   'WHERE uw_user_serial = ? ';
1602                         $queryStr .=  'ORDER BY uw_index ';
1603                         $this->selectRecords($queryStr, array($serial), $groupRows);
1604                 }
1605                 return $ret;
1606         }
1607         /**
1608          * ユーザ情報をユーザIDで取得
1609          *
1610          * @param string        $id                     ユーザID
1611          * @param array     $row                レコード
1612          * @return bool                                 取得 = true, 取得なし= false
1613          */
1614         function getUserById($id, &$row)
1615         {
1616                 $queryStr  = 'SELECT * FROM _login_user ';
1617                 $queryStr .=   'WHERE lu_id = ? ';
1618                 $queryStr .=     'AND lu_deleted = false';
1619                 $ret = $this->selectRecord($queryStr, array($id), $row);
1620                 return $ret;
1621         }
1622         /**
1623          * ユーザ情報をアカウントで取得
1624          *
1625          * @param string        $account                        アカウント
1626          * @param array     $row                                レコード
1627          * @return bool                                                 取得 = true, 取得なし= false
1628          */
1629         function getUserByAccount($account, &$row)
1630         {
1631                 $queryStr  = 'SELECT * FROM _login_user ';
1632                 $queryStr .=   'WHERE lu_account = ? ';
1633                 $queryStr .=    'AND lu_deleted = false';
1634                 $ret = $this->selectRecord($queryStr, array($account), $row);
1635                 return $ret;
1636         }
1637         /**
1638          * ユーザアカウントが存在するかチェック
1639          *
1640          * @param string $account       アカウント
1641          * @return                                      true=存在する、false=存在しない
1642          */
1643          /*
1644         function isExistsAccount($account)
1645         {
1646                 $queryStr = 'SELECT * from _login_user ';
1647                 $queryStr .=  'WHERE lu_account = ? ';
1648                 $queryStr .=    'AND lu_deleted = false';
1649                 return $this->isRecordExists($queryStr, array($account));
1650         }*/
1651         /**
1652          * テンプレートリスト取得
1653          *
1654          * @param int      $type                        テンプレートのタイプ(0=PC用、1=携帯用、2=スマートフォン)
1655          * @param function $callback            コールバック関数
1656          * @param bool     $availableOnly       利用可能なテンプレートに制限するかどうか
1657          * @return                                                      なし
1658          */
1659         function getAllTemplateList($type, $callback, $availableOnly = true)
1660         {
1661                 // tm_device_typeは後で追加したため、tm_mobileを残しておく
1662                 $queryStr = 'SELECT * FROM _templates ';
1663                 $queryStr .=  'WHERE tm_deleted = false ';// 削除されていない
1664                 if ($availableOnly) $queryStr .=    'AND tm_available = true ';         // 利用可能
1665                 $params = array();
1666                 switch ($type){
1667                         case 0:         // PC用テンプレート
1668                         case 2:         // スマートフォン用テンプレート
1669                         default:
1670                                 $queryStr .=    'AND tm_mobile = false ';               // 携帯用以外
1671                                 $queryStr .=    'AND tm_device_type = ? '; $params[] = $type;
1672                                 break;
1673                         case 1:         // 携帯用のとき
1674                                 $queryStr .=    'AND tm_mobile = true ';                // 携帯用
1675                                 break;
1676                 }
1677                 $queryStr .=  'ORDER BY tm_id';
1678                 $this->selectLoop($queryStr, $params, $callback);
1679         }
1680         /**
1681          * テンプレートIDリスト取得
1682          *
1683          * @param array  $rows                  取得レコード
1684          * @return                                              true=取得、false=取得せず
1685          */
1686         function getAllTemplateIdList(&$rows)
1687         {
1688                 $queryStr = 'SELECT * FROM _templates ';
1689                 $queryStr .=  'WHERE tm_deleted = false ';// 削除されていない
1690                 $queryStr .=  'ORDER BY tm_id';
1691                 $retValue = $this->selectRecords($queryStr, array(), $rows);
1692                 return $retValue;
1693         }
1694         /**
1695          * 携帯用テンプレートIDリスト取得
1696          *
1697          * @param array  $rows                  取得レコード
1698          * @return                                              true=取得、false=取得せず
1699          */
1700         function getAllMobileTemplateIdList(&$rows)
1701         {
1702                 $queryStr = 'SELECT * FROM _templates ';
1703                 $queryStr .=  'WHERE tm_deleted = false ';// 削除されていない
1704                 $queryStr .=  'AND tm_mobile = true ';// 携帯
1705                 $queryStr .=  'ORDER BY tm_id';
1706                 $retValue = $this->selectRecords($queryStr, array(), $rows);
1707                 return $retValue;
1708         }
1709         /**
1710          * テンプレートの追加
1711          *
1712          * @param string  $id                   テンプレートID
1713          * @param string  $name                 テンプレート名
1714          * @param int     $type                 テンプレートのタイプ
1715          * @param int     $deviceType   端末タイプ(0=PC用、1=携帯用、2=スマートフォン)
1716          * @param int     $cleanType    クリーン処理タイプ
1717          * @return                                              なし
1718          */
1719         function addNewTemplate($id, $name, $type, $deviceType = 0, $cleanType = 0)
1720         {
1721                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1722                 $now = date("Y/m/d H:i:s");     // 現在日時
1723                 $historyIndex = 0;
1724                 $mobile = 0;                            // 携帯端末かどうか
1725                 if ($deviceType == 1) $mobile = 1;
1726                 
1727                 // トランザクション開始
1728                 $this->startTransaction();
1729                 
1730                 // 同じIDが登録済みかどうかチェック
1731                 $queryStr = 'SELECT * FROM _templates ';
1732                 $queryStr .=  'WHERE tm_id = ? ';
1733                 $queryStr .=  'ORDER BY tm_history_index DESC ';
1734                 $ret = $this->selectRecord($queryStr, array($id), $row);
1735                 if ($ret){
1736                         if (!$row['tm_deleted']){               // レコードが削除されていなければ、削除
1737                                 // 古いレコードを削除
1738                                 $queryStr  = 'UPDATE _templates ';
1739                                 $queryStr .=   'SET tm_deleted = true, ';       // 削除
1740                                 $queryStr .=     'tm_update_user_id = ?, ';
1741                                 $queryStr .=     'tm_update_dt = ? ';
1742                                 $queryStr .=   'WHERE tm_serial = ?';
1743                                 $this->execStatement($queryStr, array($userId, $now, $row['tm_serial']));                       
1744                         }
1745                         $historyIndex = $row['tm_history_index'] + 1;
1746                 }
1747                 
1748                 $queryStr = 'INSERT INTO _templates ';
1749                 $queryStr .=  '(tm_id, tm_history_index, tm_name, tm_type, tm_device_type, tm_mobile, tm_clean_type, tm_create_dt, tm_create_user_id) ';
1750                 $queryStr .=  'VALUES ';
1751                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?)';
1752                 $this->execStatement($queryStr, array($id, $historyIndex, $name, $type, $deviceType, $mobile, $cleanType, $now, $userId));
1753                 
1754                 // トランザクション確定
1755                 $ret = $this->endTransaction();
1756                 return $ret;
1757         }
1758         /**
1759          * テンプレートの更新
1760          *
1761          * @param string $templateId    テンプレートID
1762          * @param string  $name                 ウィジェット名
1763          * @return                                              true=成功、false=失敗
1764          */
1765         function updateTemplate($templateId, $name)
1766         {
1767                 $now = date("Y/m/d H:i:s");     // 現在日時
1768                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1769                                 
1770                 // トランザクション開始
1771                 $this->startTransaction();
1772                 
1773                 // 既存データを取得
1774                 $historyIndex = 0;              // 履歴番号
1775                 $queryStr = 'SELECT * FROM _templates ';
1776                 $queryStr .=  'WHERE tm_id = ? ';
1777                 $queryStr .=  'ORDER BY tm_history_index DESC ';
1778                 $ret = $this->selectRecord($queryStr, array($templateId), $row);
1779                 if ($ret){
1780                         if ($row['tm_deleted']){                // レコードが削除されていれば終了
1781                                 $this->endTransaction();
1782                                 return false;
1783                         } else {                // レコードが削除されていなければ、削除
1784                                 // 古いレコードを削除
1785                                 $queryStr  = 'UPDATE _templates ';
1786                                 $queryStr .=   'SET tm_deleted = true, ';       // 削除
1787                                 $queryStr .=     'tm_update_user_id = ?, ';
1788                                 $queryStr .=     'tm_update_dt = ? ';
1789                                 $queryStr .=   'WHERE tm_serial = ?';
1790                                 $this->execStatement($queryStr, array($userId, $now, $row['tm_serial']));                       
1791                         }
1792                         $historyIndex = $row['tm_history_index'] + 1;
1793                 } else {
1794                         $this->endTransaction();
1795                         return false;
1796                 }
1797                 
1798                 // 新規レコード追加
1799                 $queryStr  = 'INSERT INTO _templates (';
1800                 $queryStr .=   'tm_id, ';
1801                 $queryStr .=   'tm_history_index, ';
1802                 $queryStr .=   'tm_name, ';
1803                 $queryStr .=   'tm_type, ';
1804                 $queryStr .=   'tm_device_type, ';
1805                 $queryStr .=   'tm_mobile, ';
1806                 $queryStr .=   'tm_clean_type, ';
1807                 $queryStr .=   'tm_available, ';
1808                 $queryStr .=   'tm_create_user_id, ';
1809                 $queryStr .=   'tm_create_dt ';
1810                 $queryStr .= ') VALUES (';
1811                 $queryStr .=   '?, ';
1812                 $queryStr .=   '?, ';
1813                 $queryStr .=   '?, ';
1814                 $queryStr .=   '?, ';
1815                 $queryStr .=   '?, ';
1816                 $queryStr .=   '?, ';
1817                 $queryStr .=   '?, ';
1818                 $queryStr .=   '?, ';
1819                 $queryStr .=   '?, ';
1820                 $queryStr .=   '?)';
1821                 $this->execStatement($queryStr, array($row['tm_id'], $historyIndex, $name, $row['tm_type'], intval($row['tm_device_type']), intval($row['tm_mobile']), $row['tm_clean_type'], intval($row['tm_available']), $userId, $now));
1822
1823                 // トランザクション確定
1824                 $ret = $this->endTransaction();
1825                 return $ret;
1826         }
1827         /**
1828          * テンプレートの削除
1829          *
1830          * @param string $templateId    テンプレートID
1831          * @return                                              true=成功、false=失敗
1832          */
1833         function deleteTemplate($templateId)
1834         {
1835                 $now = date("Y/m/d H:i:s");     // 現在日時
1836                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
1837                 
1838                 // トランザクション開始
1839                 $this->startTransaction();
1840                 
1841                 // 既存データを取得
1842                 $queryStr = 'SELECT * FROM _templates ';
1843                 $queryStr .=  'WHERE tm_deleted = false ';
1844                 $queryStr .=  'AND tm_id = ? ';
1845                 $ret = $this->selectRecord($queryStr, array($templateId), $row);
1846                 if (!$ret){
1847                         $this->endTransaction();
1848                         return false;
1849                 }
1850                 // レコードを削除
1851                 $queryStr  = 'UPDATE _templates ';
1852                 $queryStr .=   'SET tm_deleted = true, ';       // 削除
1853                 $queryStr .=     'tm_update_user_id = ?, ';
1854                 $queryStr .=     'tm_update_dt = ? ';
1855                 $queryStr .=   'WHERE tm_serial = ?';
1856                 $this->execStatement($queryStr, array($userId, $now, $row['tm_serial']));
1857                 
1858                 // トランザクション確定
1859                 $ret = $this->endTransaction();
1860                 return $ret;            
1861         }
1862         /**
1863          * 言語状態を更新
1864          *
1865          * @param string $id            言語ID
1866          * @param bool   $available     利用可
1867          * @return                                      true = 正常、false=異常
1868          */
1869         function updateLangStatus($id, $available)
1870         {
1871                 // トランザクションスタート
1872                 $this->startTransaction();
1873
1874                 $queryStr  = 'UPDATE _language ';
1875                 $queryStr .=   'SET ln_available = ? ';
1876                 $queryStr .=   'WHERE ln_id = ?';
1877                 $ret = $this->execStatement($queryStr, array(intval($available), $id));
1878
1879                 // トランザクション終了
1880                 $ret = $this->endTransaction();
1881                 return $ret;
1882         }
1883         /**
1884          * すべての言語を取得
1885          *
1886          * @param function      $callback                       コールバック関数
1887          * @return                      true=取得、false=取得せず
1888          */
1889         function getAllLang($callback)
1890         {
1891                 $queryStr = 'SELECT * FROM _language ORDER BY ln_priority';
1892                 $this->selectLoop($queryStr, array(), $callback, null);
1893         }
1894         /**
1895          * 指定言語を取得
1896          *
1897          * @param array         $langArray      取得言語のID
1898          * @param function      $callback       コールバック関数
1899          * @return                      true=取得、false=取得せず
1900          */
1901         function getLangs($langArray, $callback)
1902         {
1903                 $id = '';
1904                 for ($i = 0; $i < count($langArray); $i++){
1905                         $id .= '\'' . addslashes($langArray[$i]) . '\',';
1906                 }
1907                 $id = rtrim($id, ',');
1908                 $queryStr  = 'SELECT * FROM _language ';
1909                 $queryStr .=   'WHERE ln_id in (' . $id . ') ';
1910                 $queryStr .= 'ORDER BY ln_priority';
1911                 $this->selectLoop($queryStr, array(), $callback, null);
1912         }
1913         /**
1914          * 利用可能な言語を取得
1915          *
1916          * @param array  $rows                  取得レコード
1917          * @return                                              true=取得、false=取得せず
1918          */
1919         function getAvailableLang(&$rows)
1920         {
1921                 $queryStr  = 'SELECT * FROM _language ';
1922                 $queryStr .=   'WHERE ln_available = true ';
1923                 $queryStr .=   'ORDER BY ln_priority';
1924                 $retValue = $this->selectRecords($queryStr, array(), $rows);
1925                 return $retValue;
1926         }
1927         /**
1928          * メニュー項目の表示状態を更新
1929          *
1930          * @param string $groupId       更新対象グループID
1931          * @param bool $visible         表示状態
1932          * @return                                      true = 正常、false=異常
1933          */
1934         function updateMenuVisible($groupId, $visible)
1935         {
1936                 $sql = "UPDATE _nav_item SET ni_visible = ? WHERE ni_group_id = ?";
1937                 $params = array($visible, $groupId);
1938                 return $this->execStatement($sql, $params);
1939         }
1940         /**
1941          * トップ画面表示項目を取得
1942          *
1943          * @param string $navId                 ナビゲーションバー識別ID
1944          * @param array  $rows                  取得レコード
1945          * @return                                              true=取得、false=取得せず
1946          */
1947         /*function getTopPageItems($navId, &$rows)
1948         {
1949                 $queryStr  = 'SELECT * FROM _nav_item ';
1950                 $queryStr .=   'WHERE ni_nav_id = ? ';
1951                 $queryStr .=     'AND ni_top_page_index != 0 ';         // 0以外を表示
1952                 $queryStr .=     'AND ni_visible = true ';
1953                 $queryStr .=   'ORDER BY ni_top_page_index';
1954                 $retValue = $this->selectRecords($queryStr, array($navId), $rows);
1955                 return $retValue;
1956         }*/
1957         /**
1958          * ナビゲーションバー項目を取得
1959          *
1960          * @param string $navId                 ナビゲーションバー識別ID
1961          * @param string $parentId              親項目ID
1962          * @param array  $rows                  取得レコード
1963          * @return                                              true=取得、false=取得せず
1964          */
1965         function getNavItems($navId, $parentId, &$rows)
1966         {
1967                 $queryStr  = 'SELECT * FROM _nav_item ';
1968                 $queryStr .=   'WHERE ni_nav_id = ? ';
1969                 $queryStr .=     'AND ni_parent_id = ? ';
1970                 $queryStr .=     'AND ni_visible = true ';
1971                 $queryStr .=   'ORDER BY ni_index';
1972                 
1973                 $retValue = $this->selectRecords($queryStr, array($navId, $parentId), $rows);
1974                 return $retValue;
1975         }
1976         /**
1977          * ナビゲーションバー項目をすべて取得
1978          *
1979          * @param string        $navId                  ナビゲーションバー識別ID
1980          * @param function      $callback               コールバック関数
1981          * @return                      なし
1982          */
1983         function getNavItemsAll($navId, $callback)
1984         {
1985                 $queryStr  = 'SELECT * FROM _nav_item ';
1986                 $queryStr .=   'WHERE ni_nav_id = ? ';
1987                 $queryStr .=   'ORDER BY ni_id';
1988                 $this->selectLoop($queryStr, array($navId), $callback, null);
1989         }
1990         /**
1991          * ナビゲーションバー項目をすべて取得
1992          *
1993          * @param string        $navId                  ナビゲーションバー識別ID
1994          * @param array         $rows                   取得レコード
1995          * @return                      なし
1996          */
1997         function getNavItemsAllRecords($navId, &$rows)
1998         {
1999                 $queryStr  = 'SELECT * FROM _nav_item ';
2000                 $queryStr .=   'WHERE ni_nav_id = ? ';
2001                 $queryStr .=   'ORDER BY ni_id';
2002                 $retValue = $this->selectRecords($queryStr, array($navId), $rows);
2003                 return $retValue;
2004         }
2005         /**
2006          * ナビゲーションバー項目を削除
2007          *
2008          * @param string $menuId                メニュー識別ID
2009          * @return                                              true=成功、false=失敗
2010          */
2011         function delNavItems($menuId)
2012         {
2013                 $sql = "DELETE FROM _nav_item WHERE ni_nav_id = ?";
2014                 $params = array($menuId);
2015                 $this->execStatement($sql, $params);
2016         }
2017         /**
2018          * ナビゲーションバー項目の最大IDを取得
2019          *
2020          * @return int                  最大ID
2021          */
2022         function getNavItemsMaxId()
2023         {
2024                 $max = 0;
2025                 $queryStr = 'SELECT max(ni_id) as mid FROM _nav_item ';
2026                 $ret = $this->selectRecord($queryStr, array(), $row);
2027                 if ($ret) $max = $row['mid'];
2028                 return $max;
2029         }
2030         /**
2031          * ナビゲーションバー項目キー存在チェック
2032          *
2033          * @param string $menuId                メニュー識別ID
2034          * @param string $taskId                タスクID
2035          * @param string $param                 追加パラメータ
2036          * @return bool                                 true=存在する、false=存在しない
2037          */
2038         function isExistsNavItemKey($menuId, $taskId, $param)
2039         {
2040                 $queryStr = 'SELECT * FROM _nav_item ';
2041                 $queryStr .=  'WHERE ni_nav_id = ? ';
2042                 $queryStr .=  'AND ni_task_id = ? ';
2043                 $queryStr .=  'AND ni_param = ? ';
2044                 return $this->isRecordExists($queryStr, array($menuId, $taskId, $param));
2045         }
2046         /**
2047          * ナビゲーションバー項目を更新
2048          *
2049          * @param string $navId                 ナビゲーションバー識別ID
2050          * @param int $id                               項目ID
2051          * @param int $parentId                 項目親項目ID
2052          * @param int $index                    インデックス番号起動
2053          * @param string $taskId                タスクID
2054          * @param string $param                 追加パラメータ
2055          * @param int $control                  改行指示(0=改行しない、1=改行)
2056          * @param string $name                  項目名
2057          * @param string $helpTitle             ヘルプタイトル
2058          * @param string $helpBody              ヘルプ本体
2059          * @return                                              true=成功、false=失敗
2060          */
2061         function addNavItems($navId, $id, $parentId, $index, $taskId, $param, $control, $name, $helpTitle, $helpBody)
2062         {
2063                 // 新規レコード追加
2064                 $groupId = '';
2065                 $queryStr  = 'INSERT INTO _nav_item (';
2066                 $queryStr .=   'ni_id, ';
2067                 $queryStr .=   'ni_parent_id, ';
2068                 $queryStr .=   'ni_index, ';
2069                 $queryStr .=   'ni_nav_id, ';
2070                 $queryStr .=   'ni_task_id, ';
2071                 $queryStr .=   'ni_param, ';
2072                 $queryStr .=   'ni_group_id, ';
2073                 $queryStr .=   'ni_view_control, ';
2074                 $queryStr .=   'ni_name, ';
2075                 $queryStr .=   'ni_help_title, ';
2076                 $queryStr .=   'ni_help_body ';
2077                 $queryStr .= ') VALUES (';
2078                 $queryStr .=   '?, ';
2079                 $queryStr .=   '?, ';
2080                 $queryStr .=   '?, ';
2081                 $queryStr .=   '?, ';
2082                 $queryStr .=   '?, ';
2083                 $queryStr .=   '?, ';
2084                 $queryStr .=   '?, ';
2085                 $queryStr .=   '?, ';
2086                 $queryStr .=   '?, ';
2087                 $queryStr .=   '?, ';
2088                 $queryStr .=   '?)';
2089                 $ret = $this->execStatement($queryStr, array($id, $parentId, $index, $navId, $taskId, $param, $groupId, $control, $name, $helpTitle, $helpBody));
2090                 return $ret;
2091         }
2092         /**
2093          * 変換キーテーブルを取得
2094          *
2095          * @param string        $key                            キー文字列
2096          * @param string        $group                          グループID
2097          * @param function      $callback                       コールバック関数
2098          * @return                      なし
2099          */
2100         function getAllKey($key, $group, $callback)
2101         {
2102                 $queryStr = 'SELECT * FROM _key_value ';
2103                 $queryStr .=  'WHERE kv_deleted = false ';
2104                 $queryStr .=    'AND kv_id LIKE \'' . $key . '%\' ';
2105                 $queryStr .=    'AND kv_group_id = ? ';
2106                 $queryStr .=  'ORDER BY kv_id';
2107                 $this->selectLoop($queryStr, array($group), $callback, null);
2108         }
2109         /**
2110          * 運用ログ取得
2111          *
2112          * @param int           $level          取得ログのレベル(0すべて、1=注意以上、10=要確認)
2113          * @param int           $status         取得するデータの状況(0=すべて、1=未参照のみ、2=参照済みのみ)
2114          * @param int           $limit          取得する項目数
2115          * @param int           $page           取得するページ(1~)
2116          * @param function      $callback       コールバック関数
2117          * @return                                              なし
2118          */
2119         function getOpeLogList($level, $status, $limit, $page, $callback)
2120         {
2121                 // メッセージ種別
2122                 // 通常メッセージ: info=情報,warn=警告,user_info=ユーザ操作
2123                 // 参照必須メッセージ: error=通常エラー,fatal=致命的エラー,user_err=ユーザ操作エラー,user_access=不正アクセス,user_data=不正データ
2124                 $offset = $limit * ($page -1);
2125                 if ($offset < 0) $offset = 0;
2126                 
2127                 $queryStr = 'SELECT * FROM _operation_log LEFT JOIN _operation_type ON ol_type = ot_id ';
2128                 $queryStr .= 'LEFT JOIN _access_log ON ol_access_log_serial = al_serial ';
2129                 
2130                 // 必須参照項目のみに限定
2131                 $params = array();
2132                 $addWhere = '';
2133                 if ($level > 0){
2134                         $addWhere .= 'WHERE ot_level >= ? ';
2135                         $params[] = $level;
2136                 }
2137                 // 参照状況を制限
2138                 if ($status == 1){              // 未参照
2139                         if (empty($addWhere)){
2140                                 $addWhere .= 'WHERE ';
2141                         } else {
2142                                 $addWhere .= 'AND ';
2143                         }
2144                         $addWhere .= 'ol_checked = false ';
2145                 } else if ($status == 2){       // 参照済み
2146                         if (empty($addWhere)){
2147                                 $addWhere .= 'WHERE ';
2148                         } else {
2149                                 $addWhere .= 'AND ';
2150                         }
2151                         $addWhere .= 'ol_checked = true ';
2152                 }
2153                 $queryStr .= $addWhere;
2154                 $queryStr .=  'ORDER BY ol_serial DESC limit ' . $limit . ' offset ' . $offset;
2155                 $this->selectLoop($queryStr, $params, $callback);
2156         }
2157         /**
2158          * 運用ログ総数取得
2159          *
2160          * @param int           $level          取得ログのレベル(0すべて、1=参照必須)
2161          * @param int           $status         取得するデータの状況(0=すべて、1=未参照のみ、2=参照済みのみ)
2162          * @return int                                  総数
2163          */
2164         function getOpeLogCount($level, $status)
2165         {
2166                 $queryStr = 'SELECT * FROM _operation_log LEFT JOIN _operation_type ON ol_type = ot_id ';
2167                 
2168                 // 必須参照項目のみに限定
2169                 $params = array();
2170                 $addWhere = '';
2171                 if ($level > 0){
2172                         $addWhere .= 'WHERE ot_level >= ? ';
2173                         $params[] = $level;
2174                 }
2175                 // 参照状況を制限
2176                 if ($status == 1){              // 未参照
2177                         if (empty($addWhere)){
2178                                 $addWhere .= 'WHERE ';
2179                         } else {
2180                                 $addWhere .= 'AND ';
2181                         }
2182                         $addWhere .= 'ol_checked = false ';
2183                 } else if ($status == 2){       // 参照済み
2184                         if (empty($addWhere)){
2185                                 $addWhere .= 'WHERE ';
2186                         } else {
2187                                 $addWhere .= 'AND ';
2188                         }
2189                         $addWhere .= 'ol_checked = true ';
2190                 }
2191                 $queryStr .= $addWhere;
2192                 return $this->selectRecordCount($queryStr, $params);
2193         }
2194         /**
2195          * メッセージコードから運用ログ取得
2196          *
2197          * @param int,array     $messageCode    メッセージコード。配列の場合はORで取得。
2198          * @param string        $searchOption   検索付加オプション
2199          * @param int           $limit                  取得する項目数
2200          * @param int           $page                   取得するページ(1~)
2201          * @param function      $callback               コールバック関数
2202          * @return                                                      なし
2203          */
2204         function getOpeLogListByMessageCode($messageCode, $searchOption, $limit, $page, $callback)
2205         {
2206                 $offset = $limit * ($page -1);
2207                 if ($offset < 0) $offset = 0;
2208                 
2209                 if (!is_array($messageCode)) $messageCode = array($messageCode);
2210                 
2211                 $params = array();
2212                 $queryStr  = 'SELECT * FROM _operation_log LEFT JOIN _operation_type ON ol_type = ot_id ';
2213                 $queryStr .=   'LEFT JOIN _access_log ON ol_access_log_serial = al_serial ';
2214                 $queryStr .=   'WHERE ol_search_option = ? '; $params[] = $searchOption;
2215                 $queryStr .=     'AND (';
2216                 for ($i = 0; $i < count($messageCode); $i++){
2217                         if ($i > 0) $queryStr .= 'OR ';
2218                         $queryStr .=     'ol_message_code = ? '; $params[] = $messageCode[$i];
2219                 }
2220                 $queryStr .=     ') ';
2221                 $queryStr .=   'ORDER BY ol_serial DESC limit ' . $limit . ' offset ' . $offset;
2222                 $this->selectLoop($queryStr, $params, $callback);
2223         }
2224         /**
2225          * メッセージコードから運用ログ総数取得
2226          *
2227          * @param int,array             $messageCode    メッセージコード。配列の場合はORで取得。
2228          * @param string                $searchOption   検索付加オプション
2229          * @return int                                                  総数
2230          */
2231         function getOpeLogCountByMessageCode($messageCode, $searchOption)
2232         {
2233                 if (!is_array($messageCode)) $messageCode = array($messageCode);
2234                 
2235                 $params = array();
2236                 $queryStr  = 'SELECT * FROM _operation_log LEFT JOIN _operation_type ON ol_type = ot_id ';
2237                 $queryStr .=   'WHERE ol_search_option = ? '; $params[] = $searchOption;
2238                 $queryStr .=     'AND (';
2239                 for ($i = 0; $i < count($messageCode); $i++){
2240                         if ($i > 0) $queryStr .= 'OR ';
2241                         $queryStr .=     'ol_message_code = ? '; $params[] = $messageCode[$i];
2242                 }
2243                 $queryStr .=     ') ';
2244                 return $this->selectRecordCount($queryStr, $params);
2245         }
2246         /**
2247          * 運用ログの取得
2248          *
2249          * @param string  $serial               シリアル番号
2250          * @return                                              true=正常、false=異常
2251          */
2252         function getOpeLog($serial, &$row)
2253         {
2254                 $queryStr = 'SELECT * FROM _operation_log LEFT JOIN _operation_type ON ol_type = ot_id ';
2255                 $queryStr .=   'WHERE ol_serial = ? ';
2256                 $ret = $this->selectRecord($queryStr, array($serial), $row);
2257                 return $ret;
2258         }
2259         /**
2260          * 運用ログの確認状況を更新
2261          *
2262          * @param string  $serial               シリアル番号
2263          * @param bool    $checked              確認状況
2264          * @return                                              true=正常、false=異常
2265          */
2266         function updateOpeLogChecked($serial, $checked)
2267         {
2268                 $queryStr = "UPDATE _operation_log SET ol_checked = ? WHERE ol_serial = ?";
2269                 $params = array(intval($checked), $serial);
2270                 return $this->execStatement($queryStr, $params);
2271         }
2272         /**
2273          * アクセスログ取得
2274          *
2275          * @param int           $limit          取得する項目数
2276          * @param int           $page           取得するページ(1~)
2277          * @param string        $path           アクセスパス
2278          * @param function      $callback       コールバック関数
2279          * @param timestamp     $startDt        期間(開始日)
2280          * @param timestamp     $endDt          期間(終了日)
2281          * @return                                              なし
2282          */
2283         function getAccessLogList($limit, $page, $path, $callback, $startDt, $endDt)
2284         {
2285                 $offset = $limit * ($page -1);
2286                 if ($offset < 0) $offset = 0;
2287                 
2288                 $params = array();
2289                 $queryStr = 'SELECT * FROM _access_log LEFT JOIN _login_user on al_user_id = lu_id ';
2290                 if (!is_null($path)){
2291                         $queryStr .=  'WHERE al_path = ? ';
2292                         $params[] = $path;
2293                 }
2294                 // 日付範囲
2295                 if (!empty($startDt)){
2296                         if (count($params) > 0){
2297                                 $queryStr .=    'AND ? <= al_dt ';
2298                         } else {
2299                                 $queryStr .=    'WHERE ? <= al_dt ';
2300                         }
2301                         $params[] = $startDt;
2302                 }
2303                 if (!empty($endDt)){
2304                         if (count($params) > 0){
2305                                 $queryStr .=    'AND al_dt < ? ';
2306                         } else {
2307                                 $queryStr .=    'WHERE al_dt < ? ';
2308                         }
2309                         $params[] = $endDt;
2310                 }
2311                 $queryStr .=  'ORDER BY al_serial DESC limit ' . $limit . ' offset ' . $offset;
2312                 $this->selectLoop($queryStr, $params, $callback);
2313         }
2314         /**
2315          * アクセスログ総数取得
2316          *
2317          * @param string        $path           アクセスパス
2318          * @param timestamp     $startDt        期間(開始日)
2319          * @param timestamp     $endDt          期間(終了日)
2320          * @return int                                  総数
2321          */
2322         function getAccessLogCount($path, $startDt, $endDt)
2323         {
2324                 $params = array();
2325                 $queryStr = 'SELECT * FROM _access_log ';
2326                 if (!is_null($path)){
2327                         $queryStr .=  'WHERE al_path = ? ';
2328                         $params[] = $path;
2329                 }
2330                 // 日付範囲
2331                 if (!empty($startDt)){
2332                         if (count($params) > 0){
2333                                 $queryStr .=    'AND ? <= al_dt ';
2334                         } else {
2335                                 $queryStr .=    'WHERE ? <= al_dt ';
2336                         }
2337                         $params[] = $startDt;
2338                 }
2339                 if (!empty($endDt)){
2340                         if (count($params) > 0){
2341                                 $queryStr .=    'AND al_dt < ? ';
2342                         } else {
2343                                 $queryStr .=    'WHERE al_dt < ? ';
2344                         }
2345                         $params[] = $endDt;
2346                 }
2347                 return $this->selectRecordCount($queryStr, $params);
2348         }
2349         /**
2350          * アクセスログの取得
2351          *
2352          * @param string  $serial               シリアル番号
2353          * @return                                              true=正常、false=異常
2354          */
2355         function getAccessLog($serial, &$row)
2356         {
2357                 $queryStr = 'SELECT * FROM _access_log LEFT JOIN _login_user on al_user_id = lu_id ';
2358                 $queryStr .=   'WHERE al_serial = ? ';
2359                 $ret = $this->selectRecord($queryStr, array($serial), $row);
2360                 return $ret;
2361         }
2362         /**
2363          * 検索語ログ取得
2364          *
2365          * @param int           $limit          取得する項目数
2366          * @param int           $page           取得するページ(1~)
2367          * @param string        $path           アクセスパス
2368          * @param function      $callback       コールバック関数
2369          * @return                                              なし
2370          */
2371         function getSearchWordLogList($limit, $page, $path, $callback)
2372         {
2373                 $offset = $limit * ($page -1);
2374                 if ($offset < 0) $offset = 0;
2375                 
2376                 $params = array();
2377                 $queryStr  = 'SELECT * FROM _search_word  ';
2378                 $queryStr .=   'LEFT JOIN _access_log ON sw_access_log_serial = al_serial ';
2379                 $queryStr .=   'LEFT JOIN _login_user on al_user_id = lu_id ';
2380                 if (!is_null($path)){
2381                         $queryStr .=  'WHERE sw_path = ? ';
2382                         $params[] = $path;
2383                 }
2384                 $queryStr .=  'ORDER BY sw_serial DESC limit ' . $limit . ' offset ' . $offset;
2385                 $this->selectLoop($queryStr, $params, $callback);
2386         }
2387         /**
2388          * 検索語ログ総数取得
2389          *
2390          * @param string        $path           アクセスパス
2391          * @return int                                  総数
2392          */
2393         function getSearchWordLogCount($path)
2394         {
2395                 $params = array();
2396                 $queryStr = 'SELECT * FROM _search_word ';
2397                 if (!is_null($path)){
2398                         $queryStr .=  'WHERE sw_path = ? ';
2399                         $params[] = $path;
2400                 }
2401                 return $this->selectRecordCount($queryStr, $params);
2402         }
2403         /**
2404          * 比較語から検索語ログ取得
2405          *
2406          * @param string    $word               比較語
2407          * @param int           $limit          取得する項目数
2408          * @param int           $page           取得するページ(1~)
2409          * @param string        $path           アクセスパス
2410          * @param function      $callback       コールバック関数
2411          * @return                                              なし
2412          */
2413         function getSearchWordLogListByWord($word, $limit, $page, $path, $callback)
2414         {
2415                 $offset = $limit * ($page -1);
2416                 if ($offset < 0) $offset = 0;
2417                 
2418                 $params = array();
2419                 $queryStr  = 'SELECT * FROM _search_word  ';
2420                 $queryStr .=   'LEFT JOIN _access_log ON sw_access_log_serial = al_serial ';
2421                 $queryStr .=   'LEFT JOIN _login_user on al_user_id = lu_id ';
2422                 $queryStr .=   'WHERE sw_basic_word = ? '; $params[] = $word;
2423                 if (!is_null($path)){
2424                         $queryStr .=  'AND sw_path = ? ';
2425                         $params[] = $path;
2426                 }
2427                 $queryStr .=  'ORDER BY sw_serial DESC limit ' . $limit . ' offset ' . $offset;
2428                 $this->selectLoop($queryStr, $params, $callback);
2429         }
2430         /**
2431          * 比較語から検索語ログ総数取得
2432          *
2433          * @param string    $word               比較語
2434          * @param string        $path           アクセスパス
2435          * @return int                                  総数
2436          */
2437         function getSearchWordLogCountByWord($word, $path)
2438         {
2439                 $params = array();
2440                 $queryStr  = 'SELECT * FROM _search_word ';
2441                 $queryStr .=   'WHERE sw_basic_word = ? '; $params[] = $word;
2442                 if (!is_null($path)){
2443                         $queryStr .=  'AND sw_path = ? ';
2444                         $params[] = $path;
2445                 }
2446                 return $this->selectRecordCount($queryStr, $params);
2447         }
2448         /**
2449          * 検索語検索数リスト取得
2450          *
2451          * @param int           $limit          取得する項目数
2452          * @param int           $page           取得するページ(1~)
2453          * @param string        $path           アクセスパス
2454          * @param function      $callback       コールバック関数
2455          * @return                                              なし
2456          */
2457         function getSearchWordSumList($limit, $page, $path, $callback)
2458         {
2459                 $offset = $limit * ($page -1);
2460                 if ($offset < 0) $offset = 0;
2461                 
2462                 $params = array();
2463                 $queryStr  = 'SELECT count(*) AS ct, sw_basic_word FROM _search_word ';
2464                 if (!is_null($path)){
2465                         $queryStr .=  'WHERE sw_path = ? ';
2466                         $params[] = $path;
2467                 }
2468                 $queryStr .=  'GROUP BY sw_basic_word ';
2469                 $queryStr .=  'ORDER BY ct DESC limit ' . $limit . ' offset ' . $offset;
2470                 $this->selectLoop($queryStr, $params, $callback);
2471         }
2472         /**
2473          * 検索語検索数総数取得
2474          *
2475          * @param string        $path           アクセスパス
2476          * @return int                                  総数
2477          */
2478         function getSearchWordSumCount($path)
2479         {
2480                 $params = array();
2481                 $queryStr  = 'SELECT count(*) AS ct FROM _search_word ';
2482                 if (!is_null($path)){
2483                         $queryStr .=  'WHERE sw_path = ? ';
2484                         $params[] = $path;
2485                 }
2486                 $queryStr .=   'GROUP BY sw_basic_word';
2487                 return $this->selectRecordCount($queryStr, $params);
2488         }
2489         /**
2490          * 検索語ログの取得
2491          *
2492          * @param int  $serial          シリアル番号
2493          * @return                                              true=正常、false=異常
2494          */
2495         function getSearchWordLog($serial, &$row)
2496         {
2497                 $queryStr  = 'SELECT * FROM _search_word  ';
2498                 $queryStr .=   'LEFT JOIN _access_log ON sw_access_log_serial = al_serial ';
2499                 $queryStr .=   'LEFT JOIN _login_user on al_user_id = lu_id ';
2500                 $queryStr .=   'WHERE sw_serial = ? ';
2501                 $ret = $this->selectRecord($queryStr, array($serial), $row);
2502                 return $ret;
2503         }
2504         /**
2505          * 比較語から検索語ログの取得
2506          *
2507          * @param string  $word         比較語
2508          * @return                                      true=正常、false=異常
2509          */
2510         function getSearchWordLogByCompareWord($word, &$row)
2511         {
2512                 $queryStr  = 'SELECT * FROM _search_word  ';
2513                 $queryStr .=   'LEFT JOIN _access_log ON sw_access_log_serial = al_serial ';
2514                 $queryStr .=   'LEFT JOIN _login_user on al_user_id = lu_id ';
2515                 $queryStr .=   'WHERE sw_basic_word = ? ';
2516                 $queryStr .=   'ORDER BY sw_serial DESC ';
2517                 $ret = $this->selectRecord($queryStr, array($word), $row);
2518                 return $ret;
2519         }
2520         /**
2521          * メニュー項目の追加
2522          *
2523          * @param string  $menuId               メニューID
2524          * @param string  $parentId             親メニュー項目ID
2525          * @param string  $name                 メニュー名
2526          * @param string  $desc                 説明
2527          * @param int     $index                インデックス番号(0のときは最大値を設定)
2528          * @param int     $type                 項目タイプ
2529          * @param int     $linkType             リンクタイプ
2530          * @param string  $url                  URL
2531          * @param bool    $visible              表示状態
2532          * @param bool $userLimited             ユーザ制限するかどうか
2533          * @param int     $newId                新規ID
2534          * @param string  $contentType  リンク先コンテンツタイプ
2535          * @param string  $contentId    リンク先コンテンツID
2536          * @return bool                                 true = 成功、false = 失敗
2537          */
2538         function addMenuItem($menuId, $parentId, $name, $desc, $index, $type, $linkType, $url, $visible, $userLimited, &$newId, $contentType = '', $contentId = '')
2539         {
2540                 $now = date("Y/m/d H:i:s");     // 現在日時
2541                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
2542                 
2543                 // トランザクション開始
2544                 $this->startTransaction();
2545                 
2546                 // IDを求める
2547                 $id = 1;
2548                 $queryStr = 'SELECT max(md_id) as ms FROM _menu_def ';
2549                 $ret = $this->selectRecord($queryStr, array(), $maxRow);
2550                 if ($ret) $id = $maxRow['ms'] + 1;
2551                         
2552                 // インデックスが0のときは、最大値を格納
2553                 if (empty($index)){
2554                         $index = 1;
2555                         $queryStr = 'SELECT max(md_index) as ms FROM _menu_def ';
2556                         $queryStr .=  'WHERE md_menu_id = ? ';
2557                         $ret = $this->selectRecord($queryStr, array($menuId), $maxRow);
2558                         if ($ret) $index = $maxRow['ms'] + 1;
2559                 }
2560                 $queryStr = 'INSERT INTO _menu_def ';
2561                 $queryStr .=  '(md_id, md_parent_id, md_index, md_menu_id, md_name, md_description, md_type, md_link_type, md_link_url, md_visible, md_user_limited, md_content_type, md_content_id, md_update_user_id, md_update_dt) ';
2562                 $queryStr .=  'VALUES ';
2563                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
2564                 $this->execStatement($queryStr, array($id, $parentId, $index, $menuId, $name, $desc, $type, $linkType, $url, intval($visible), intval($userLimited), $contentType, $contentId, $userId, $now));
2565                 
2566                 // 新規のシリアル番号取得
2567                 $queryStr = 'select max(md_id) as ns from _menu_def ';
2568                 $ret = $this->selectRecord($queryStr, array(), $row);
2569                 if ($ret) $newId = $row['ns'];
2570                 
2571                 // トランザクション確定
2572                 $ret = $this->endTransaction();
2573                 return $ret;
2574         }
2575         /**
2576          * メニュー項目の更新
2577          *
2578          * @param int     $id                   メニュー項目ID
2579          * @param string  $name                 メニュー名
2580          * @param string  $desc                 説明
2581          * @param int     $type                 項目タイプ
2582          * @param int     $linkType             リンクタイプ
2583          * @param string  $url                  URL
2584          * @param bool    $visible              表示状態
2585          * @param bool $userLimited             ユーザ制限するかどうか
2586          * @param string  $contentType  リンク先コンテンツタイプ
2587          * @param string  $contentId    リンク先コンテンツID
2588          * @return bool                                 true = 成功、false = 失敗
2589          */
2590         function updateMenuItem($id, $name, $desc, $type, $linkType, $url, $visible, $userLimited, $contentType = '', $contentId = '')
2591         {
2592                 $now = date("Y/m/d H:i:s");     // 現在日時
2593                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
2594                 
2595                 // トランザクション開始
2596                 $this->startTransaction();
2597
2598                 $params = array();
2599                 $queryStr = 'UPDATE _menu_def ';
2600                 $queryStr .=  'SET md_name = ?, ';                      $params[] = $name;
2601                 $queryStr .=    'md_description = ?, ';         $params[] = $desc;
2602                 $queryStr .=    'md_type = ?, ';                        $params[] = $type;
2603                 $queryStr .=    'md_link_type = ?, ';           $params[] = $linkType;
2604                 $queryStr .=    'md_link_url = ?, ';            $params[] = $url;
2605                 $queryStr .=    'md_visible = ?, ';                     $params[] = intval($visible);
2606                 $queryStr .=    'md_user_limited = ?, ';                        $params[] = intval($userLimited);
2607                 $queryStr .=    'md_content_type = ?, ';        $params[] = $contentType;
2608                 $queryStr .=    'md_content_id = ?, ';          $params[] = $contentId;
2609                 $queryStr .=    'md_update_user_id = ?, ';      $params[] = $userId;
2610                 $queryStr .=    'md_update_dt = ? ';            $params[] = $now;
2611                 $queryStr .=  'WHERE md_id = ? ';                       $params[] = $id;
2612                 $this->execStatement($queryStr, $params);
2613
2614                 // トランザクション確定
2615                 $ret = $this->endTransaction();
2616                 return $ret;
2617         }
2618         /**
2619          * メニュー項目の削除
2620          *
2621          * @param string $id                    複数シリアルNoをカンマ区切り
2622          * @return                                              true=成功、false=失敗
2623          */
2624         function delMenuItems($id)
2625         {
2626                 // トランザクション開始
2627                 $this->startTransaction();
2628                 
2629                 // レコードを削除
2630                 $queryStr  = 'DELETE FROM _menu_def ';
2631                 $queryStr .=   'WHERE md_id in (' . $id . ') ';
2632                 $this->execStatement($queryStr, array());
2633                 
2634                 // トランザクション確定
2635                 $ret = $this->endTransaction();
2636                 return $ret;
2637         }
2638         /**
2639          * メニュー項目をIDで取得
2640          *
2641          * @param int     $id                   メニュー項目ID
2642          * @param array   $row                  レコード
2643          * @return bool                                 取得 = true, 取得なし= false
2644          */
2645         function getMenuItem($id, &$row)
2646         {
2647                 $queryStr  = 'SELECT * FROM _menu_def ';
2648                 $queryStr .=   'WHERE md_id = ? ';
2649                 $ret = $this->selectRecord($queryStr, array($id), $row);
2650                 return $ret;
2651         }
2652         /**
2653          * メニュー項目を取得
2654          *
2655          * @param string $menuId                メニュー識別ID
2656          * @param string $parentId              親項目ID
2657          * @param array  $rows                  取得レコード
2658          * @return                                              true=取得、false=取得せず
2659          */
2660         function getChildMenuItems($menuId, $parentId, &$rows)
2661         {
2662                 $queryStr  = 'SELECT * FROM _menu_def ';
2663                 $queryStr .=   'WHERE md_menu_id = ? ';
2664                 $queryStr .=     'AND md_parent_id = ? ';
2665                 $queryStr .=   'ORDER BY md_index';
2666                 $retValue = $this->selectRecords($queryStr, array($menuId, $parentId), $rows);
2667                 return $retValue;
2668         }
2669         /**
2670          * メニューの項目を取得(管理用)
2671          *
2672          * @param string $menuId                メニューID
2673          * @param function $callback    コールバック関数
2674          * @return                                              なし
2675          */
2676         function getAllMenuItems($menuId, $callback)
2677         {
2678                 $queryStr  = 'SELECT * FROM _menu_def ';
2679                 $queryStr .=   'WHERE md_menu_id = ? ';
2680                 $queryStr .=   'ORDER BY md_parent_id, md_index';
2681                 $this->selectLoop($queryStr, array($menuId), $callback);
2682         }
2683         /**
2684          * メニュー項目順序を変更
2685          *
2686          * @param string $menuId                メニュー識別ID
2687          * @param int $parentId                 親項目ID
2688          * @param int $id                               項目ID
2689          * @param int $pos                              新規の位置
2690          * @return                                              true=成功、false=失敗
2691          */
2692         function reorderMenuItem($menuId, $parentId, $id, $pos)
2693         {
2694                 $now = date("Y/m/d H:i:s");     // 現在日時
2695                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
2696                 
2697                 // トランザクション開始
2698                 $this->startTransaction();
2699                 
2700                 $queryStr  = 'SELECT * FROM _menu_def ';
2701                 $queryStr .=   'WHERE md_menu_id = ? ';
2702                 $queryStr .=     'AND md_parent_id = ? ';
2703                 $queryStr .=   'ORDER BY md_index';
2704                 $retValue = $this->selectRecords($queryStr, array($menuId, $parentId), $rows);
2705                 
2706                 // 同階層内かどうかチェック
2707                 $insPos = $pos;                 // 項目挿入位置
2708                 for ($i = 0; $i < count($rows); $i++){
2709                         if ($id == $rows[$i]['md_id']){
2710                                 //if ($i < $pos) $insPos++;             // 2011/8/22 simpleTreeからjsTreeに変更のため仕様変更
2711                                 break;
2712                         }
2713                 }
2714                 $index = 0;
2715                 for ($i = 0; $i < $insPos; $i++){
2716                         $itemId = $rows[$i]['md_id'];
2717                         if ($itemId != $id){
2718                                 $queryStr  = 'UPDATE _menu_def ';
2719                                 $queryStr .=   'SET md_index = ?, ';    // インデックス
2720                                 $queryStr .=     'md_update_user_id = ?, ';
2721                                 $queryStr .=     'md_update_dt = ? ';
2722                                 $queryStr .=   'WHERE md_id = ?';
2723                                 $ret = $this->execStatement($queryStr, array($index, $userId, $now, $itemId));
2724                                 $index++;
2725                         }
2726                 }
2727                 $queryStr  = 'UPDATE _menu_def ';
2728                 $queryStr .=   'SET md_index = ?, ';    // インデックス
2729                 $queryStr .=     'md_parent_id = ?, ';
2730                 $queryStr .=     'md_update_user_id = ?, ';
2731                 $queryStr .=     'md_update_dt = ? ';
2732                 $queryStr .=   'WHERE md_id = ?';
2733                 $ret = $this->execStatement($queryStr, array($index, $parentId, $userId, $now, $id));
2734                 $index++;
2735                 for ($i = $insPos; $i < count($rows); $i++){
2736                         $itemId = $rows[$i]['md_id'];
2737                         if ($itemId != $id){
2738                                 $queryStr  = 'UPDATE _menu_def ';
2739                                 $queryStr .=   'SET md_index = ?, ';    // インデックス
2740                                 $queryStr .=     'md_update_user_id = ?, ';
2741                                 $queryStr .=     'md_update_dt = ? ';
2742                                 $queryStr .=   'WHERE md_id = ?';
2743                                 $ret = $this->execStatement($queryStr, array($index, $userId, $now, $itemId));
2744                                 $index++;
2745                         }
2746                 }
2747                 
2748                 // トランザクション確定
2749                 $ret = $this->endTransaction();
2750                 return $ret;
2751         }
2752         /**
2753          * メニュー項目の表示順を変更する
2754          *
2755          * @param string  $menuId                       メニューID
2756          * @param int $parentId                         親項目ID
2757          * @param bool $visibleOnly                     表示項目だけかどうか
2758          * @param array $menuItemNoArray        並び順
2759          * @return bool                                 true = 成功、false = 失敗
2760          */
2761         function orderMenuItems($menuId, $parentId, $visibleOnly, $menuItemNoArray)
2762         {
2763                 // メニュー項目をすべて取得
2764                 $queryStr  = 'SELECT * FROM _menu_def ';
2765                 $queryStr .=   'WHERE md_menu_id = ? ';
2766                 $queryStr .=     'AND md_parent_id = ? ';
2767                 if ($visibleOnly) $queryStr .= 'AND md_visible = true ';                // 表示中の項目
2768                 $queryStr .=   'ORDER BY md_index';
2769                 $ret = $this->selectRecords($queryStr, array($menuId, $parentId), $rows);
2770                 if (!$ret) return false;
2771         
2772                 // メニュー数をチェックし、異なっている場合はエラー
2773                 $menuItemCount = count($rows);
2774                 if ($menuItemCount != count($menuItemNoArray)) return false;
2775                 
2776                 $now = date("Y/m/d H:i:s");     // 現在日時
2777                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
2778                 
2779                 // トランザクション開始
2780                 $this->startTransaction();
2781
2782                 for ($i = 0; $i < $menuItemCount; $i++){
2783                         $id = $rows[$menuItemNoArray[$i]]['md_id'];
2784                         $index = $rows[$i]['md_index'];
2785
2786                         // 既存項目を更新
2787                         $queryStr  = 'UPDATE _menu_def ';
2788                         $queryStr .=   'SET ';
2789                         $queryStr .=     'md_index = ?, ';
2790                         $queryStr .=     'md_update_user_id = ?, ';
2791                         $queryStr .=     'md_update_dt = ? ';
2792                         $queryStr .=   'WHERE md_id = ? ';
2793                         $this->execStatement($queryStr, array($index, $userId, $now, $id));
2794                 }
2795                                                                                 
2796                 // トランザクション確定
2797                 $ret = $this->endTransaction();
2798                 return $ret;
2799         }
2800         /**
2801          * コンテンツ項目一覧を取得
2802          *
2803          * @param string        $lang                           言語
2804          * @param string        $contentType            コンテンツタイプ
2805          * @param function      $callback                       コールバック関数
2806          * @return                      なし
2807          */
2808         function getAllContents($lang, $contentType, $callback)
2809         {
2810                 $queryStr = 'SELECT * FROM content ';
2811                 $queryStr .=  'WHERE cn_type = ? ';
2812                 $queryStr .=    'AND cn_language_id = ? ';
2813 //              $queryStr .=    'AND cn_visible = true ';               // 画面に表示可能
2814                 $queryStr .=    'AND cn_deleted = false ';              // 削除されていない
2815                 $queryStr .=  'ORDER BY cn_id';
2816                 $this->selectLoop($queryStr, array($contentType, $lang), $callback, null);
2817         }
2818         /**
2819          * 汎用コンテンツを外部キーで取得
2820          *
2821          * @param string        $contentType            コンテンツタイプ
2822          * @param string        $langId                         言語ID
2823          * @param string        $key                            外部キー
2824          * @param array     $row                                レコード
2825          * @return bool                                                 取得 = true, 取得なし= false
2826          */
2827         function getContentByKey($contentType, $langId, $key, &$row)
2828         {
2829                 $queryStr  = 'SELECT * FROM content ';
2830                 $queryStr .=   'WHERE cn_deleted = false ';     // 削除されていない
2831                 $queryStr .=     'AND cn_type = ? ';
2832                 $queryStr .=     'AND cn_language_id = ? ';
2833                 $queryStr .=     'AND cn_key = ? ';
2834                 $queryStr .=   'ORDER BY cn_id';
2835                 $ret = $this->selectRecord($queryStr, array($contentType, $langId, $key), $row);
2836                 return $ret;
2837         }
2838         /**
2839          * コンテンツ項目をシリアル番号で取得
2840          *
2841          * @param string        $serial                         シリアル番号
2842          * @param array     $row                                レコード
2843          * @return bool                                                 取得 = true, 取得なし= false
2844          */
2845         function getContentBySerial($serial, &$row)
2846         {
2847                 $queryStr  = 'SELECT * FROM content LEFT JOIN _login_user ON cn_create_user_id = lu_id AND lu_deleted = false ';
2848                 $queryStr .=   'WHERE cn_serial = ? ';
2849                 $ret = $this->selectRecord($queryStr, array($serial), $row);
2850                 return $ret;
2851         }
2852         /**
2853          * メニューIDのリストを取得
2854          *
2855          * @param function $callback    コールバック関数
2856          * @param bool $getWidgetMenu   ウィジェット専用メニューを取得するかどうか
2857          * @return                                              なし
2858          */
2859         function getMenuIdList($callback, $getWidgetMenu = false)
2860         {
2861                 $queryStr = 'SELECT * FROM _menu_id ';
2862                 if (!$getWidgetMenu) $queryStr .=  'WHERE mn_widget_id = \'\' ';
2863                 $queryStr .=  'ORDER BY mn_sort_order';
2864                 $this->selectLoop($queryStr, array(), $callback);
2865         }
2866         /**
2867          * メニューIDのレコードを取得
2868          *
2869          * @param string  $id                   メニューID
2870          * @param array   $row                  レコード
2871          * @return bool                                 取得 = true, 取得なし= false
2872          */
2873         function getMenuId($id, &$row)
2874         {
2875                 $retValue = '';
2876                 $queryStr = 'SELECT * FROM _menu_id ';
2877                 $queryStr .=  'WHERE mn_id  = ?';
2878                 $ret = $this->selectRecord($queryStr, array($id), $row);
2879                 return $ret;
2880         }
2881         /**
2882          * メニューIDのレコードを更新
2883          *
2884          * @param string $id    メニューID(存在しない場合は新規追加)
2885          * @param string $name  名前
2886          * @param string $desc  説明
2887          * @param int    $order ソート順
2888          * @return bool                 true=更新成功、false=更新失敗
2889          */
2890         function updateMenuId($id, $name, $desc, $order)
2891         {
2892                 // トランザクション開始
2893                 $this->startTransaction();
2894                 
2895                 $queryStr = 'SELECT * FROM _menu_id ';
2896                 $queryStr .=  'WHERE mn_id  = ?';
2897                 $ret = $this->selectRecord($queryStr, array($id), $row);
2898                 if ($ret){
2899                         $queryStr  = 'UPDATE _menu_id ';
2900                         $queryStr .=   'SET mn_name = ?, ';
2901                         $queryStr .=     'mn_description = ?, ';
2902                         $queryStr .=     'mn_sort_order = ? ';
2903                         $queryStr .=   'WHERE mn_id = ?';
2904                         $ret = $this->execStatement($queryStr, array($name, $desc, $order, $id));                       
2905                 } else {
2906                         $queryStr = 'INSERT INTO _menu_id (';
2907                         $queryStr .=  'mn_id, ';
2908                         $queryStr .=  'mn_name, ';
2909                         $queryStr .=  'mn_description, ';
2910                         $queryStr .=  'mn_sort_order ';
2911                         $queryStr .=  ') VALUES (';
2912                         $queryStr .=  '?, ?, ?, ?';
2913                         $queryStr .=  ')';
2914                         $ret = $this->execStatement($queryStr, array($id, $name, $desc, $order));       
2915                 }
2916                 // トランザクション確定
2917                 $ret = $this->endTransaction();
2918                 return $ret;
2919         }
2920         /**
2921          * メニューIDの削除
2922          *
2923          * @param array $serial                 メニューIDの配列
2924          * @return                                              true=成功、false=失敗
2925          */
2926         function delMenuId($serial)
2927         {
2928                 // 引数のエラーチェック
2929                 if (!is_array($serial)) return false;
2930                 if (count($serial) <= 0) return true;
2931                 
2932                 // トランザクション開始
2933                 $this->startTransaction();
2934                 
2935                 // 指定のシリアルNoのレコードが削除状態でないかチェック
2936                 $delId = '';
2937                 for ($i = 0; $i < count($serial); $i++){
2938                         $queryStr  = 'SELECT * FROM _menu_id ';
2939                         $queryStr .=   'WHERE mn_id = ? ';
2940                         $ret = $this->isRecordExists($queryStr, array($serial[$i]));
2941                         // 存在しない場合は、既に削除されたとして終了
2942                         if (!$ret){
2943                                 $this->endTransaction();
2944                                 return false;
2945                         }
2946                         $delId .= '\'' . addslashes($serial[$i]) . '\',';
2947                 }
2948                 $delId = rtrim($delId, ',');
2949                 
2950                 // データ削除
2951                 $queryStr  = 'DELETE FROM _menu_id ';
2952                 $queryStr .=   'WHERE mn_id in (' . $delId . ') ';
2953                 $this->execStatement($queryStr, array());
2954                 
2955                 // トランザクション確定
2956                 $ret = $this->endTransaction();
2957                 return $ret;
2958         }
2959         /**
2960          * メニューIDの存在チェック
2961          *
2962          * @param string  $id                   メニューID
2963          * @return bool                                 true=存在する、false=存在しない
2964          */
2965         function isExistsMenuId($id)
2966         {
2967                 $queryStr = 'SELECT * FROM _menu_id ';
2968                 $queryStr .=  'WHERE mn_id = ? ';
2969                 return $this->isRecordExists($queryStr, array($id));
2970         }
2971         /**
2972          * ユーザグループ一覧を取得
2973          *
2974          * @param string        $lang                           言語
2975          * @param function      $callback                       コールバック関数
2976          * @return                      なし
2977          */
2978         function getAllUserGroup($lang, $callback)
2979         {
2980                 $queryStr = 'SELECT * FROM _user_group LEFT JOIN _login_user ON ug_create_user_id = lu_id AND lu_deleted = false ';
2981                 $queryStr .=  'WHERE ug_language_id = ? ';
2982                 $queryStr .=    'AND ug_deleted = false ';              // 削除されていない
2983                 $queryStr .=  'ORDER BY ug_sort_order';
2984                 $this->selectLoop($queryStr, array($lang), $callback);
2985         }
2986         /**
2987          * ユーザグループ一覧を取得
2988          *
2989          * @param string        $lang                           言語
2990          * @param array         $rows                           取得データ
2991          * @return bool                                                 true=取得、false=取得せず
2992          */
2993         function getAllUserGroupRows($lang, &$rows)
2994         {
2995                 $queryStr = 'SELECT * FROM _user_group LEFT JOIN _login_user ON ug_create_user_id = lu_id AND lu_deleted = false ';
2996                 $queryStr .=  'WHERE ug_language_id = ? ';
2997                 $queryStr .=    'AND ug_deleted = false ';              // 削除されていない
2998                 $queryStr .=  'ORDER BY ug_sort_order';
2999                 $retValue = $this->selectRecords($queryStr, array($lang), $rows);
3000                 return $retValue;
3001         }
3002         /**
3003          * ユーザグループをシリアル番号で削除
3004          *
3005          * @param array   $serial               シリアルNo
3006          * @return                                              true=成功、false=失敗
3007          */
3008         function delUserGroupBySerial($serial)
3009         {
3010                 // 引数のエラーチェック
3011                 if (!is_array($serial)) return false;
3012                 if (count($serial) <= 0) return true;
3013                 
3014                 $now = date("Y/m/d H:i:s");     // 現在日時
3015                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
3016                 
3017                 // トランザクション開始
3018                 $this->startTransaction();
3019                 
3020                 // 指定のシリアルNoのレコードが削除状態でないかチェック
3021                 for ($i = 0; $i < count($serial); $i++){
3022                         $queryStr  = 'SELECT * FROM _user_group ';
3023                         $queryStr .=   'WHERE ug_deleted = false ';             // 未削除
3024                         $queryStr .=     'AND ug_serial = ? ';
3025                         $ret = $this->isRecordExists($queryStr, array($serial[$i]));
3026                         // 存在しない場合は、既に削除されたとして終了
3027                         if (!$ret){
3028                                 $this->endTransaction();
3029                                 return false;
3030                         }
3031                 }
3032                 
3033                 // レコードを削除
3034                 $queryStr  = 'UPDATE _user_group ';
3035                 $queryStr .=   'SET ug_deleted = true, ';       // 削除
3036                 $queryStr .=     'ug_update_user_id = ?, ';
3037                 $queryStr .=     'ug_update_dt = ? ';
3038                 $queryStr .=   'WHERE ug_serial in (' . implode($serial, ',') . ') ';
3039                 $this->execStatement($queryStr, array($userId, $now));
3040                 
3041                 // トランザクション確定
3042                 $ret = $this->endTransaction();
3043                 return $ret;
3044         }
3045         /**
3046          * ユーザグループをシリアル番号で取得
3047          *
3048          * @param int           $serial                         シリアル番号
3049          * @param array     $row                                レコード
3050          * @return bool                                                 取得 = true, 取得なし= false
3051          */
3052         function getUserGroupBySerial($serial, &$row)
3053         {
3054                 $queryStr  = 'SELECT * FROM _user_group LEFT JOIN _login_user ON ug_create_user_id = lu_id AND lu_deleted = false ';
3055                 $queryStr .=   'WHERE ug_serial = ? ';
3056                 $ret = $this->selectRecord($queryStr, array($serial), $row);
3057                 return $ret;
3058         }
3059         /**
3060          * ユーザグループを識別IDで取得
3061          *
3062          * @param string        $id                                     識別ID
3063          * @param array     $row                                レコード
3064          * @return bool                                                 取得 = true, 取得なし= false
3065          */
3066         function getUserGroupById($id, &$row)
3067         {
3068                 $queryStr  = 'SELECT * FROM _user_group LEFT JOIN _login_user ON ug_create_user_id = lu_id AND lu_deleted = false ';
3069                 $queryStr .=  'WHERE ug_deleted = false ';
3070                 $queryStr .=  'AND ug_id = ? ';
3071                 $ret = $this->selectRecord($queryStr, array($id), $row);
3072                 return $ret;
3073         }
3074         /**
3075          * ユーザグループの最大表示順を取得
3076          *
3077          * @param string        $lang           言語
3078          * @return int                                  最大表示順
3079          */
3080         function getUserGroupMaxIndex($lang)
3081         {
3082                 $queryStr = 'SELECT max(ug_sort_order) as mi FROM _user_group ';
3083                 $queryStr .=  'WHERE ug_deleted = false ';
3084                 $queryStr .=  'AND ug_language_id = ? ';
3085                 $ret = $this->selectRecord($queryStr, array($lang), $row);
3086                 if ($ret){
3087                         $index = $row['mi'];
3088                 } else {
3089                         $index = 0;
3090                 }
3091                 return $index;
3092         }
3093         /**
3094          * ユーザグループの新規追加
3095          *
3096          * @param int     $id                   識別ID
3097          * @param string  $lang                 言語ID
3098          * @param string  $name                 名前
3099          * @param int     $index                表示順
3100          * @param int     $newSerial    新規シリアル番号
3101          * @return bool                                 true = 成功、false = 失敗
3102          */
3103         function addUserGroup($id, $lang, $name, $index, &$newSerial)
3104         {
3105                 $now = date("Y/m/d H:i:s");     // 現在日時
3106                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
3107                 
3108                 // トランザクション開始
3109                 $this->startTransaction();
3110                 
3111                 // ユーザグループが存在していないかチェック
3112                 $ret = $this->getUserGroupById($id, $row);
3113                 if ($ret){
3114                         $this->endTransaction();
3115                         return false;
3116                 }
3117                 
3118                 // データを追加
3119                 $queryStr  = 'INSERT INTO _user_group ';
3120                 $queryStr .=   '(ug_id, ug_language_id, ug_name, ug_sort_order, ug_create_user_id, ug_create_dt) ';
3121                 $queryStr .=   'VALUES ';
3122                 $queryStr .=   '(?, ?, ?, ?, ?, ?)';
3123                 $this->execStatement($queryStr, array($id, $lang, $name, $index, $userId, $now));
3124                 
3125                 // 新規のシリアル番号取得
3126                 $queryStr = 'SELECT MAX(ug_serial) AS ns FROM _user_group ';
3127                 $ret = $this->selectRecord($queryStr, array(), $row);
3128                 if ($ret) $newSerial = $row['ns'];
3129                         
3130                 // トランザクション確定
3131                 $ret = $this->endTransaction();
3132                 return $ret;
3133         }
3134         /**
3135          * ユーザグループの更新
3136          *
3137          * @param int     $serial               シリアル番号
3138          * @param string  $name                 名前
3139          * @param int     $index                表示順
3140          * @param int     $newSerial    新規シリアル番号
3141          * @return bool                                 true = 成功、false = 失敗
3142          */
3143         function updateUserGroup($serial, $name, $index, &$newSerial)
3144         {       
3145                 $now = date("Y/m/d H:i:s");     // 現在日時
3146                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
3147                                 
3148                 // トランザクション開始
3149                 $this->startTransaction();
3150                 
3151                 // 指定のシリアルNoのレコードが削除状態でないかチェック
3152                 $historyIndex = 0;              // 履歴番号
3153                 $queryStr  = 'SELECT * FROM _user_group ';
3154                 $queryStr .=   'WHERE ug_serial = ? ';
3155                 $ret = $this->selectRecord($queryStr, array($serial), $row);
3156                 if ($ret){              // 既に登録レコードがあるとき
3157                         if ($row['ug_deleted']){                // レコードが削除されていれば終了
3158                                 $this->endTransaction();
3159                                 return false;
3160                         }
3161                         $historyIndex = $row['ug_history_index'] + 1;
3162                 } else {                // 存在しない場合は終了
3163                         $this->endTransaction();
3164                         return false;
3165                 }
3166                 
3167                 // 古いレコードを削除
3168                 $queryStr  = 'UPDATE _user_group ';
3169                 $queryStr .=   'SET ug_deleted = true, ';       // 削除
3170                 $queryStr .=     'ug_update_user_id = ?, ';
3171                 $queryStr .=     'ug_update_dt = ? ';
3172                 $queryStr .=   'WHERE ug_serial = ?';
3173                 $this->execStatement($queryStr, array($userId, $now, $serial));
3174                 
3175                 // 新規レコード追加
3176                 $queryStr = 'INSERT INTO _user_group ';
3177                 $queryStr .=  '(ug_id, ug_language_id, ug_history_index, ug_name, ug_sort_order, ug_create_user_id, ug_create_dt) ';
3178                 $queryStr .=  'VALUES ';
3179                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?)';
3180                 $this->execStatement($queryStr, array($row['ug_id'], $row['ug_language_id'], $historyIndex, $name, $index, $userId, $now));
3181
3182                 // 新規のシリアル番号取得
3183                 $queryStr = 'SELECT MAX(ug_serial) AS ns FROM _user_group ';
3184                 $ret = $this->selectRecord($queryStr, array(), $row);
3185                 if ($ret) $newSerial = $row['ns'];
3186                 
3187                 // トランザクション確定
3188                 $ret = $this->endTransaction();
3189                 return $ret;
3190         }
3191 }
3192 ?>