OSDN Git Service

DB更新スクリプト更新。
[magic3/magic3.git] / widgets / m / pc_content / include / db / pc_contentDb.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-2008 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: pc_contentDb.php 1253 2008-11-19 05:43:26Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
17
18 class pc_contentDb extends BaseDb
19 {
20         /**
21          * コンテンツ項目を取得
22          *
23          * @param function      $callback                       コールバック関数
24          * @param array         $contentIdArray         コンテンツID
25          * @param string        $lang                           言語
26          * @param bool          $all                            すべてのデータを取得するか、ユーザ制限のないデータを取得するかを指定
27          * @return                      なし
28          */
29         function getContentItems($callback, $contentIdArray, $lang, $all=true)
30         {
31                 $contentType = '';
32                 
33                 // コンテンツIDの指定がない場合は、デフォルト値を取得
34                 if ($contentIdArray == null){
35                         $queryStr = 'SELECT * FROM content ';
36                         $queryStr .=  'WHERE cn_visible = true ';
37                         $queryStr .=    'AND cn_default = true ';
38                         $queryStr .=    'AND cn_deleted = false ';              // 削除されていない
39                         $queryStr .=    'AND cn_type = ? ';
40                         $queryStr .=    'AND cn_language_id = ? ';
41                         if (!$all) $queryStr .=    'AND cn_user_limited = false ';              // ユーザ制限のないデータ
42                         $queryStr .=  'ORDER BY cn_serial';
43                         $this->selectLoop($queryStr, array($contentType, $lang), $callback, null);
44                 } else {
45                         $contentId = implode(',', $contentIdArray);
46                         
47                         // CASE文作成
48                         $caseStr = 'CASE cn_id ';
49                         for ($i = 0; $i < count($contentIdArray); $i++){
50                                 $caseStr .= 'WHEN ' . $contentIdArray[$i] . ' THEN ' . $i . ' ';
51                         }
52                         $caseStr .= 'END AS no';
53
54                         $queryStr = 'SELECT *, ' . $caseStr . ' FROM content ';
55                         $queryStr .=  'WHERE cn_visible = true ';
56                         $queryStr .=    'AND cn_deleted = false ';              // 削除されていない
57                         $queryStr .=    'AND cn_type = ? ';
58                         $queryStr .=    'AND cn_id in (' . $contentId . ') ';
59                         $queryStr .=    'AND cn_language_id = ? ';
60                         if (!$all) $queryStr .=    'AND cn_user_limited = false ';              // ユーザ制限のないデータ
61                         $queryStr .=  'ORDER BY no';
62                         $this->selectLoop($queryStr, array($contentType, $lang), $callback, null);
63                 }
64         }
65         /**
66          * コンテンツ項目一覧を取得(管理用)
67          *
68          * @param function      $callback                       コールバック関数
69          * @param string        $lang                           言語
70          * @return                      なし
71          */
72         function getAllContentItems($callback, $lang)
73         {
74                 $contentType = '';
75                 $queryStr = 'SELECT * FROM content LEFT JOIN _login_user ON cn_create_user_id = lu_id AND lu_deleted = false ';
76                 $queryStr .=  'WHERE cn_type = ? ';
77                 $queryStr .=    'AND cn_language_id = ? ';
78                 $queryStr .=    'AND cn_deleted = false ';              // 削除されていない
79                 $queryStr .=  'ORDER BY cn_id';
80                 $this->selectLoop($queryStr, array($contentType, $lang), $callback, null);
81         }
82         /**
83          * コンテンツの対応言語を取得(管理用)
84          *
85          * @param string        $contentId                      コンテンツID
86          * @return                      true=取得、false=取得せず
87          */
88         function getLangByContentId($contentId, &$rows)
89         {
90                 $contentType = '';
91                 $queryStr = 'SELECT ln_id, ln_name, ln_name_en FROM content LEFT JOIN _language ON cn_language_id = ln_id ';
92                 $queryStr .=  'WHERE cn_deleted = false ';      // 削除されていない
93                 $queryStr .=    'AND cn_type = ? ';
94                 $queryStr .=    'AND cn_id = ? ';
95                 $queryStr .=  'ORDER BY cn_id, ln_priority';
96                 $retValue = $this->selectRecords($queryStr, array($contentType, $contentId), $rows);
97                 return $retValue;
98         }
99         /**
100          * コンテンツの対応言語を取得(管理用)
101          *
102          * @param function      $callback                       コールバック関数
103          * @param string        $contentId                      コンテンツID
104          * @return                      なし
105          */
106         function getLangLoopByContentId($callback, $contentId)
107         {
108                 // コンテンツIDがないときは終了
109                 if (empty($contentId)) return;
110                 
111                 $contentType = '';
112                 $queryStr = 'SELECT ln_id, ln_name, ln_name_en FROM content LEFT JOIN _language ON cn_language_id = ln_id ';
113                 $queryStr .=  'WHERE cn_deleted = false ';      // 削除されていない
114                 $queryStr .=    'AND cn_type = ? ';
115                 $queryStr .=    'AND cn_id = ? ';
116                 $queryStr .=  'ORDER BY cn_id, ln_priority';
117                 $this->selectLoop($queryStr, array($contentType, $contentId), $callback, null);
118         }
119         /**
120          * コンテンツ項目をコンテンツIDで取得
121          *
122          * @param string        $contentId                      コンテンツID
123          * @param string        $langId                         言語ID
124          * @param array     $row                                レコード
125          * @return bool                                                 取得 = true, 取得なし= false
126          */
127         function getContentByContentId($contentId, $langId, &$row)
128         {
129                 $contentType = '';
130                 $queryStr  = 'SELECT * FROM content LEFT JOIN _login_user ON cn_create_user_id = lu_id AND lu_deleted = false ';
131                 $queryStr .=   'WHERE cn_deleted = false ';     // 削除されていない
132                 $queryStr .=    'AND cn_type = ? ';
133                 $queryStr .=   'AND cn_id = ? ';
134                 $queryStr .=   'AND cn_language_id = ? ';
135                 $ret = $this->selectRecord($queryStr, array($contentType, $contentId, $langId), $row);
136                 return $ret;
137         }
138         /**
139          * コンテンツ項目をシリアル番号で取得
140          *
141          * @param string        $serial                         シリアル番号
142          * @param array     $row                                レコード
143          * @return bool                                                 取得 = true, 取得なし= false
144          */
145         function getContentBySerial($serial, &$row)
146         {
147                 $queryStr  = 'select * from content LEFT JOIN _login_user ON cn_create_user_id = lu_id AND lu_deleted = false ';
148                 $queryStr .=   'WHERE cn_serial = ? ';
149                 $ret = $this->selectRecord($queryStr, array($serial), $row);
150                 return $ret;
151         }
152         
153         /**
154          * コンテンツ項目の新規追加
155          *
156          * @param string  $contentid    コンテンツID
157          * @param string  $lang                 言語ID
158          * @param string  $name                 コンテンツ名
159          * @param string  $desc                 説明
160          * @param string  $html                 HTML
161          * @param bool    $visible              表示状態
162          * @param bool    $default              デフォルトで使用するかどうか
163          * @param bool    $limited              ユーザ制限するかどうか
164          * @param string  $key                  外部参照用キー
165          * @param int     $newSerial    新規シリアル番号
166          * @return bool                                 true = 成功、false = 失敗
167          */
168         function addContentItem($contentid, $lang, $name, $desc, $html, $visible, $default, $limited, $key, &$newSerial)
169         {
170                 global $gEnvManager;
171                 $now = date("Y/m/d H:i:s");     // 現在日時
172                 $user = $gEnvManager->getCurrentUserId();       // 現在のユーザ
173                 $contentType = '';
174                                 
175                 // トランザクション開始
176                 $this->startTransaction();
177                 
178                 if ($contentid == 0){           // コンテンツIDが0のときは、コンテンツIDを新規取得
179                         // コンテンツIDを決定する
180                         $queryStr = 'select max(cn_id) as mid from content ';
181                         $queryStr .=  'WHERE cn_type = ? ';
182                         $ret = $this->selectRecord($queryStr, array($contentType), $row);
183                         if ($ret){
184                                 $contId = $row['mid'] + 1;
185                         } else {
186                                 $contId = 1;
187                         }
188                 } else {
189                         $contId = $contentid;
190                 }
191                 
192                 // 前レコードの削除状態チェック
193                 $historyIndex = 0;
194                 $queryStr = 'SELECT * FROM content ';
195                 $queryStr .=  'WHERE cn_type = ? ';
196                 $queryStr .=    'AND cn_id = ? ';
197                 $queryStr .=    'AND cn_language_id = ? ';
198                 $queryStr .=  'ORDER BY cn_history_index DESC ';
199                 $ret = $this->selectRecord($queryStr, array($contentType, $contId, $lang), $row);
200                 if ($ret){
201                         if (!$row['cn_deleted']){               // レコード存在していれば終了
202                                 $this->endTransaction();
203                                 return false;
204                         }
205                         $historyIndex = $row['cn_history_index'] + 1;
206                 }
207                 // デフォルトを設定のときは他のデフォルトを解除
208                 if ($default){
209                         $queryStr  = 'UPDATE content ';
210                         $queryStr .=   'SET cn_default = false, ';              // デフォルトをクリア
211                         $queryStr .=     'cn_update_user_id = ?, ';
212                         $queryStr .=     'cn_update_dt = ? ';
213                         $queryStr .=   'WHERE cn_deleted = false ';
214                         $queryStr .=     'AND cn_type = ? ';
215                         $queryStr .=     'AND cn_language_id = ? ';
216                         $this->execStatement($queryStr, array($user, $now, $contentType, $lang));
217                 }
218                 // データを追加
219                 $queryStr = 'INSERT INTO content ';
220                 $queryStr .=  '(cn_type, cn_id, cn_language_id, cn_history_index, cn_name, cn_description, cn_html, cn_visible, cn_default, cn_user_limited, cn_key, cn_create_user_id, cn_create_dt) ';
221                 $queryStr .=  'VALUES ';
222                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
223                 $this->execStatement($queryStr, array($contentType, $contId, $lang, $historyIndex, $name, $desc, $html, intval($visible), intval($default), intval($limited), $key, $user, $now));
224                 
225                 // 新規のシリアル番号取得
226                 $queryStr = 'select max(cn_serial) as ns from content ';
227                 $ret = $this->selectRecord($queryStr, array(), $row);
228                 if ($ret) $newSerial = $row['ns'];
229                         
230                 // トランザクション確定
231                 $ret = $this->endTransaction();
232                 return $ret;
233         }
234         
235         /**
236          * コンテンツ項目の更新
237          *
238          * @param int     $serial               シリアル番号
239          * @param string  $name                 コンテンツ名
240          * @param string  $html                 HTML
241          * @param bool    $visible              表示状態
242          * @param bool    $default              デフォルトで使用するかどうか
243          * @param bool    $limited              ユーザ制限するかどうか
244          * @param string  $key                  外部参照用キー
245          * @param int     $newSerial    新規シリアル番号
246          * @return bool                                 true = 成功、false = 失敗
247          */
248         function updateContentItem($serial, $name, $html, $visible, $default, $limited, $key, &$newSerial)
249         {
250                 global $gEnvManager;
251                 $now = date("Y/m/d H:i:s");     // 現在日時
252                 $user = $gEnvManager->getCurrentUserId();       // 現在のユーザ
253                 $contentType = '';
254                                 
255                 // トランザクション開始
256                 $this->startTransaction();
257                 
258                 // 指定のシリアルNoのレコードが削除状態でないかチェック
259                 $historyIndex = 0;              // 履歴番号
260                 $queryStr  = 'select * from content ';
261                 $queryStr .=   'where cn_serial = ? ';
262                 $ret = $this->selectRecord($queryStr, array($serial), $row);
263                 if ($ret){              // 既に登録レコードがあるとき
264                         if ($row['cn_deleted']){                // レコードが削除されていれば終了
265                                 $this->endTransaction();
266                                 return false;
267                         }
268                         $historyIndex = $row['cn_history_index'] + 1;
269                 } else {                // 存在しない場合は終了
270                         $this->endTransaction();
271                         return false;
272                 }
273                 // デフォルトを設定のときは他のデフォルトを解除
274                 if ($default){
275                         $queryStr  = 'UPDATE content ';
276                         $queryStr .=   'SET cn_default = false, ';              // デフォルトをクリア
277                         $queryStr .=     'cn_update_user_id = ?, ';
278                         $queryStr .=     'cn_update_dt = ? ';
279                         $queryStr .=   'WHERE cn_deleted = false ';
280                         $queryStr .=     'AND cn_type = ? ';
281                         $queryStr .=     'AND cn_language_id = ? ';
282                         $this->execStatement($queryStr, array($user, $now, $contentType, $row['cn_language_id']));
283                 }
284                 
285                 // 古いレコードを削除
286                 $queryStr  = 'UPDATE content ';
287                 $queryStr .=   'SET cn_deleted = true, ';       // 削除
288                 $queryStr .=     'cn_update_user_id = ?, ';
289                 $queryStr .=     'cn_update_dt = ? ';
290                 $queryStr .=   'WHERE cn_serial = ?';
291                 $this->execStatement($queryStr, array($user, $now, $serial));
292                 
293                 // 新規レコード追加
294                 $queryStr = 'INSERT INTO content ';
295                 $queryStr .=  '(cn_type, cn_id, cn_language_id, cn_history_index, cn_name, cn_description, cn_html, cn_visible, cn_default, cn_user_limited, cn_key, cn_create_user_id, cn_create_dt) ';
296                 $queryStr .=  'VALUES ';
297                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
298                 $this->execStatement($queryStr, array($row['cn_type'], $row['cn_id'], $row['cn_language_id'], $historyIndex, $name, $row['cn_description'], $html, intval($visible), intval($default), intval($limited), $key, $user, $now));
299
300                 // 新規のシリアル番号取得
301                 $queryStr = 'select max(cn_serial) as ns from content ';
302                 $ret = $this->selectRecord($queryStr, array(), $row);
303                 if ($ret) $newSerial = $row['ns'];
304                 
305                 // トランザクション確定
306                 $ret = $this->endTransaction();
307                 return $ret;
308         }
309         
310         /**
311          * コンテンツ項目の削除
312          *
313          * @param array $serial                 シリアルNo
314          * @return                                              true=成功、false=失敗
315          */
316         function delContentItem($serial)
317         {
318                 global $gEnvManager;
319                 $now = date("Y/m/d H:i:s");     // 現在日時
320                 $user = $gEnvManager->getCurrentUserId();       // 現在のユーザ
321                 
322                 if (!is_array($serial) || count($serial) <= 0) return true;
323                 
324                 // トランザクション開始
325                 $this->startTransaction();
326                 
327                 // 指定のシリアルNoのレコードが削除状態でないかチェック
328                 for ($i = 0; $i < count($serial); $i++){
329                         $queryStr  = 'SELECT * FROM content ';
330                         $queryStr .=   'WHERE cn_deleted = false ';             // 未削除
331                         $queryStr .=     'AND cn_serial = ? ';
332                         $ret = $this->isRecordExists($queryStr, array($serial[$i]));
333                         // 存在しない場合は、既に削除されたとして終了
334                         if (!$ret){
335                                 $this->endTransaction();
336                                 return false;
337                         }
338                 }
339                 
340                 // レコードを削除
341                 $queryStr  = 'UPDATE content ';
342                 $queryStr .=   'SET cn_deleted = true, ';       // 削除
343                 $queryStr .=     'cn_update_user_id = ?, ';
344                 $queryStr .=     'cn_update_dt = now() ';
345                 $queryStr .=   'WHERE cn_serial in (' . implode($serial, ',') . ') ';
346                 $this->execStatement($queryStr, array($user));
347                 
348                 // トランザクション確定
349                 $ret = $this->endTransaction();
350                 return $ret;
351         }
352         /**
353          * コンテンツIDでコンテンツ項目を削除
354          *
355          * @param int $serial                   シリアルNo
356          * @param int $userId                   ユーザID(データ更新者)
357          * @return                                              true=成功、false=失敗
358          */
359         function delContentItemById($serial, $userId)
360         {
361                 $contentType = '';
362                                 
363                 // トランザクション開始
364                 $this->startTransaction();
365                 
366                 // コンテンツIDを取得
367                 $queryStr  = 'select * from content ';
368                 $queryStr .=   'where cn_deleted = false ';             // 未削除
369                 $queryStr .=     'and cn_serial = ? ';
370                 $ret = $this->selectRecord($queryStr, array($serial), $row);
371                 if ($ret){              // 既に登録レコードがあるとき
372                         if ($row['cn_deleted']){                // レコードが削除されていれば終了
373                                 $this->endTransaction();
374                                 return false;
375                         }
376                 } else {                // 存在しない場合は終了
377                         $this->endTransaction();
378                         return false;
379                 }
380                 $contId = $row['cn_id'];
381                 
382                 // レコードを削除
383                 $queryStr  = 'UPDATE content ';
384                 $queryStr .=   'SET cn_deleted = true, ';       // 削除
385                 $queryStr .=     'cn_update_user_id = ?, ';
386                 $queryStr .=     'cn_update_dt = now() ';
387                 $queryStr .=   'WHERE cn_type = ? ';
388                 $queryStr .=     'AND cn_id = ? ';
389                 $this->execStatement($queryStr, array($userId, $contentType, $contId));
390                 
391                 // トランザクション確定
392                 $ret = $this->endTransaction();
393                 return $ret;
394         }
395         /**
396          * コンテンツ項目をすべて削除
397          *
398          * @param int $userId                   ユーザID(データ更新者)
399          * @return                                              true=成功、false=失敗
400          */
401         function delAllContentItems($userId)
402         {
403                 $contentType = '';
404                         
405                 // トランザクション開始
406                 $this->startTransaction();
407                 
408                 // レコードを削除
409                 $queryStr  = 'UPDATE content ';
410                 $queryStr .=   'SET cn_deleted = true, ';       // 削除
411                 $queryStr .=     'cn_update_user_id = ?, ';
412                 $queryStr .=     'cn_update_dt = now() ';
413                 $queryStr .=   'WHERE cn_type = ? AND cn_deleted = false';
414                 $this->execStatement($queryStr, array($userId, $contentType));
415                 
416                 // トランザクション確定
417                 $ret = $this->endTransaction();
418                 return $ret;
419         }       
420         /**
421          * すべての言語を取得
422          *
423          * @param function      $callback                       コールバック関数
424          * @return                      true=取得、false=取得せず
425          */
426         function getAllLang($callback)
427         {
428                 $queryStr = 'SELECT * FROM _language ORDER BY ln_priority';
429                 $this->selectLoop($queryStr, array(), $callback, null);
430         }
431         
432         /**
433          * メニュー項目の追加
434          *
435          * @param string  $menuId               メニューID
436          * @param string  $lang                 言語ID
437          * @param string  $name                 メニュー名
438          * @param string  $url                  URL
439          * @param int     $incIndex             表示順増加分
440          * @param int     $userId               更新者ユーザID
441          * @return bool                                 true = 成功、false = 失敗
442          */
443         function addMenuItem($menuId, $lang, $name, $url, $incIndex, $userId)
444         {
445                 // トランザクション開始
446                 $this->startTransaction();
447                 
448                 // メニュー項目IDを作成
449                 $queryStr = 'select max(mi_id) as mid from menu_item ';
450                 $ret = $this->selectRecord($queryStr, array(), $row);
451                 if ($ret){
452                         $menuItemId = $row['mid'] + 1;
453                 } else {
454                         $menuItemId = 1;
455                 }
456                 // インデックス番号を作成
457                 $queryStr = 'SELECT max(mi_index) as m FROM menu_item ';
458                 $queryStr .=  'WHERE mi_menu_id = ? ';
459                 $queryStr .=    'AND mi_language_id = ? ';
460                 $ret = $this->selectRecord($queryStr, array($menuId, $lang), $row);
461                 if ($ret){
462                         $index = $row['m'] + $incIndex;
463                 } else {
464                         $index = 1;
465                 }
466                 
467                 $queryStr = 'INSERT INTO menu_item ';
468                 $queryStr .=  '(mi_menu_id, mi_id, mi_language_id, mi_name, mi_index, mi_link_type, mi_link_url, mi_visible, mi_enable, mi_update_user_id, mi_update_dt) ';
469                 $queryStr .=  'VALUES ';
470                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, now())';
471                 $this->execStatement($queryStr, array($menuId, $menuItemId, $lang, $name, $index, 0, $url, true, true, $userId));
472                 
473                 // トランザクション確定
474                 $ret = $this->endTransaction();
475                 return $ret;
476         }
477 }
478 ?>