OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / ec_main / include / db / ec_mainProductCategoryDb.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-2012 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: ec_mainProductCategoryDb.php 5434 2012-12-06 12:32:21Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
17
18 class ec_mainProductCategoryDb extends BaseDb
19 {
20         /**
21          * すべての言語を取得
22          *
23          * @param function      $callback                       コールバック関数
24          * @return                      true=取得、false=取得せず
25          */
26         function getAllLang($callback)
27         {
28                 $queryStr = 'SELECT * FROM _language ORDER BY ln_priority';
29                 $this->selectLoop($queryStr, array(), $callback, null);
30         }
31         /**
32          * 商品カテゴリー一覧を取得
33          *
34          * @param string        $lang                           言語
35          * @param function      $callback                       コールバック関数
36          * @return                      なし
37          */
38         function getAllCategory($lang, $callback)
39         {
40                 $queryStr = 'SELECT * FROM product_category LEFT JOIN _login_user ON pc_create_user_id = lu_id AND lu_deleted = false ';
41                 $queryStr .=  'WHERE pc_language_id = ? ';
42                 $queryStr .=    'AND pc_deleted = false ';              // 削除されていない
43                 $queryStr .=  'ORDER BY pc_id';
44                 $this->selectLoop($queryStr, array($lang), $callback, null);
45         }
46         /**
47          * 商品カテゴリーの対応言語を取得
48          *
49          * @param int           $id                     商品カテゴリーID
50          * @return bool                                 true=取得、false=取得せず
51          */
52         function getLangByCategoryId($id, &$rows)
53         {
54                 $queryStr = 'SELECT ln_id, ln_name, ln_name_en FROM product_category LEFT JOIN _language ON pc_language_id = ln_id ';
55                 $queryStr .=  'WHERE pc_deleted = false ';      // 削除されていない
56                 $queryStr .=    'AND pc_id = ? ';
57                 $queryStr .=  'ORDER BY pc_id, ln_priority';
58                 $retValue = $this->selectRecords($queryStr, array($id), $rows);
59                 return $retValue;
60         }
61         /**
62          * 商品カテゴリーの新規追加
63          *
64          * @param int     $id   カテゴリーID
65          * @param string  $lang                 言語ID
66          * @param string  $name                 名前
67          * @param int     $pcategory    親カテゴリーID
68          * @param int     $index                表示順
69          * @param bool    $visible              表示、非表示
70          * @param int     $userId               更新者ユーザID
71          * @param int     $newSerial    新規シリアル番号
72          * @return bool                                 true = 成功、false = 失敗
73          */
74         function addCategory($id, $lang, $name, $pcategory, $index, $visible, $userId, &$newSerial)
75         {       
76                 // トランザクション開始
77                 $this->startTransaction();
78                 
79                 if ($id == 0){          // IDが0のときは、カテゴリーIDを新規取得
80                         // コンテンツIDを決定する
81                         $queryStr = 'select max(pc_id) as mid from product_category ';
82                         $ret = $this->selectRecord($queryStr, array(), $row);
83                         if ($ret){
84                                 $cId = $row['mid'] + 1;
85                         } else {
86                                 $cId = 1;
87                         }
88                 } else {
89                         $cId = $id;
90                 }
91                 // 前レコードの削除状態チェック
92                 $historyIndex = 0;
93                 $queryStr = 'SELECT * FROM product_category ';
94                 $queryStr .=  'WHERE pc_id = ? ';
95                 $queryStr .=    'AND pc_language_id = ? ';
96                 $queryStr .=  'ORDER BY pc_history_index DESC ';
97                 $ret = $this->selectRecord($queryStr, array($cId, $lang), $row);
98                 if ($ret){
99                         if (!$row['pc_deleted']){               // レコード存在していれば終了
100                                 $this->endTransaction();
101                                 return false;
102                         }
103                         $historyIndex = $row['pc_history_index'] + 1;
104                 }
105                 
106                 // データを追加
107                 $queryStr = 'INSERT INTO product_category ';
108                 $queryStr .=  '(pc_id, pc_language_id, pc_history_index, pc_name, pc_parent_id, pc_sort_order, pc_visible, pc_create_user_id, pc_create_dt) ';
109                 $queryStr .=  'VALUES ';
110                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, now())';
111                 $this->execStatement($queryStr, array($cId, $lang, $historyIndex, $name, $pcategory, $index, $visible, $userId));
112                 
113                 // 新規のシリアル番号取得
114                 $queryStr = 'select max(pc_serial) as ns from product_category ';
115                 $ret = $this->selectRecord($queryStr, array(), $row);
116                 if ($ret) $newSerial = $row['ns'];
117                         
118                 // トランザクション確定
119                 $ret = $this->endTransaction();
120                 return $ret;
121         }
122         /**
123          * 商品カテゴリーをシリアル番号で取得
124          *
125          * @param int           $serial                         シリアル番号
126          * @param array     $row                                レコード
127          * @return bool                                                 取得 = true, 取得なし= false
128          */
129         function getCategoryBySerial($serial, &$row)
130         {
131                 $queryStr  = 'select * from product_category LEFT JOIN _login_user ON pc_create_user_id = lu_id AND lu_deleted = false ';
132                 $queryStr .=   'WHERE pc_serial = ? ';
133                 $ret = $this->selectRecord($queryStr, array($serial), $row);
134                 return $ret;
135         }       
136         /**
137          * 商品カテゴリーをカテゴリーIDで取得
138          *
139          * @param int           $id                                     カテゴリーID
140          * @param string        $langId                         言語ID
141          * @param array     $row                                レコード
142          * @return bool                                                 取得 = true, 取得なし= false
143          */
144         function getCategoryByCategoryId($id, $langId, &$row)
145         {
146                 $queryStr  = 'SELECT * FROM product_category LEFT JOIN _login_user ON pc_create_user_id = lu_id AND lu_deleted = false ';
147                 $queryStr .=   'WHERE pc_deleted = false ';     // 削除されていない
148                 $queryStr .=   'AND pc_id = ? ';
149                 $queryStr .=   'AND pc_language_id = ? ';
150                 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);
151                 return $ret;
152         }
153         /**
154          * 商品カテゴリーの更新
155          *
156          * @param int     $serial               シリアル番号
157          * @param string  $name                 名前
158          * @param int     $pcategory    親カテゴリーID
159          * @param int     $index                表示順
160          * @param bool    $visible              表示、非表示
161          * @param int     $userId               更新者ユーザID
162          * @param int     $newSerial    新規シリアル番号
163          * @return bool                                 true = 成功、false = 失敗
164          */
165         function updateCategory($serial, $name, $pcategory, $index, $visible, $userId, &$newSerial)
166         {       
167                 $now = date("Y/m/d H:i:s");     // 現在日時
168                                 
169                 // トランザクション開始
170                 $this->startTransaction();
171                 
172                 // 指定のシリアルNoのレコードが削除状態でないかチェック
173                 $changePCategory = false;               // 親カテゴリを変更かどうか
174                 $historyIndex = 0;              // 履歴番号
175                 $queryStr  = 'select * from product_category ';
176                 $queryStr .=   'where pc_serial = ? ';
177                 $ret = $this->selectRecord($queryStr, array($serial), $row);
178                 if ($ret){              // 既に登録レコードがあるとき
179                         if ($row['pc_deleted']){                // レコードが削除されていれば終了
180                                 $this->endTransaction();
181                                 return false;
182                         }
183                         $historyIndex = $row['pc_history_index'] + 1;
184                         if ($pcategory != $row['pc_parent_id']) $changePCategory = true;
185                 } else {                // 存在しない場合は終了
186                         $this->endTransaction();
187                         return false;
188                 }
189                 // 親カテゴリーが変更のときは、同じカテゴリーIDの親カテゴリーも変更
190                 if ($changePCategory){
191                         $queryStr = 'SELECT pc_serial FROM product_category ';
192                         $queryStr .=  'WHERE pc_deleted = false ';      // 削除されていない
193                         $queryStr .=    'AND pc_id = ? ';
194                         $ret = $this->selectRecords($queryStr, array($row['pc_id']), $rows);
195                         if ($ret){
196                                 for ($i = 0; $i < count($rows); $i++){
197                                         if ($rows[$i]['pc_serial'] != $serial){
198                                                 if (!$this->updatePCategory($rows[$i]['pc_serial'], $pcategory, $userId, $now)){
199                                                         $this->endTransaction();
200                                                         return false;           
201                                                 }
202                                         }
203                                 }
204                         } else {
205                                 $this->endTransaction();
206                                 return false;                   
207                         }
208                 }
209                 
210                 // 古いレコードを削除
211                 $queryStr  = 'UPDATE product_category ';
212                 $queryStr .=   'SET pc_deleted = true, ';       // 削除
213                 $queryStr .=     'pc_update_user_id = ?, ';
214                 $queryStr .=     'pc_update_dt = ? ';
215                 $queryStr .=   'WHERE pc_serial = ?';
216                 $this->execStatement($queryStr, array($userId, $now, $serial));
217                 
218                 // 新規レコード追加
219                 $queryStr = 'INSERT INTO product_category ';
220                 $queryStr .=  '(pc_id, pc_language_id, pc_history_index, pc_name, pc_parent_id, pc_sort_order, pc_visible, pc_create_user_id, pc_create_dt) ';
221                 $queryStr .=  'VALUES ';
222                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?, ?)';
223                 $this->execStatement($queryStr, array($row['pc_id'], $row['pc_language_id'], $historyIndex, $name, $pcategory, $index, $visible, $userId, $now));
224
225                 // 新規のシリアル番号取得
226                 $queryStr = 'select max(pc_serial) as ns from product_category ';
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          * @param int     $serial               シリアル番号
238          * @param int     $pcategory    親カテゴリーID
239          * @param int     $userId               更新者ユーザID
240          * @param string  $now                  現在日時
241          * @return bool                                 true = 成功、false = 失敗
242          */
243         function updatePCategory($serial, $pcategory, $userId, $now)
244         {
245                 // 指定のシリアルNoのレコードが削除状態でないかチェック
246                 $historyIndex = 0;              // 履歴番号
247                 $queryStr  = 'select * from product_category ';
248                 $queryStr .=   'where pc_serial = ? ';
249                 $ret = $this->selectRecord($queryStr, array($serial), $row);
250                 if ($ret){              // 既に登録レコードがあるとき
251                         if ($row['pc_deleted']){                // レコードが削除されていれば終了
252                                 return false;
253                         }
254                         $historyIndex = $row['pc_history_index'] + 1;
255                 } else {                // 存在しない場合は終了
256                         return false;
257                 }
258                 
259                 // 古いレコードを削除
260                 $queryStr  = 'UPDATE product_category ';
261                 $queryStr .=   'SET pc_deleted = true, ';       // 削除
262                 $queryStr .=     'pc_update_user_id = ?, ';
263                 $queryStr .=     'pc_update_dt = ? ';
264                 $queryStr .=   'WHERE pc_serial = ?';
265                 $ret = $this->execStatement($queryStr, array($userId, $now, $serial));
266                 if (!$ret) return false;
267                 
268                 // 新規レコード追加
269                 $queryStr = 'INSERT INTO product_category ';
270                 $queryStr .=  '(pc_id, pc_language_id, pc_history_index, pc_name, pc_parent_id, pc_sort_order, pc_create_user_id, pc_create_dt) ';
271                 $queryStr .=  'VALUES ';
272                 $queryStr .=  '(?, ?, ?, ?, ?, ?, ?, ?)';
273                 $ret = $this->execStatement($queryStr, array($row['pc_id'], $row['pc_language_id'], $historyIndex, $row['pc_name'], $pcategory, $row['pc_sort_order'], $userId, $now));
274                 if ($ret){
275                         return true;
276                 } else {
277                         return false;
278                 }
279         }
280         /**
281          * カテゴリーの削除
282          *
283          * @param int $serialNo                 シリアルNo
284          * @param int $userId                   ユーザID(データ更新者)
285          * @return                                              true=成功、false=失敗
286          */
287         function delCategory($serialNo, $userId)
288         {
289                 // トランザクション開始
290                 $this->startTransaction();
291                 
292                 // 指定のシリアルNoのレコードが削除状態でないかチェック
293                 $queryStr  = 'select * from product_category ';
294                 $queryStr .=   'where pc_deleted = false ';             // 未削除
295                 $queryStr .=     'and pc_serial = ? ';
296                 $ret = $this->isRecordExists($queryStr, array($serialNo));
297                 // 存在しない場合は、既に削除されたとして終了
298                 if (!$ret){
299                         $this->endTransaction();
300                         return false;
301                 }
302                 
303                 // レコードを削除
304                 $queryStr  = 'UPDATE product_category ';
305                 $queryStr .=   'SET pc_deleted = true, ';       // 削除
306                 $queryStr .=     'pc_update_user_id = ?, ';
307                 $queryStr .=     'pc_update_dt = now() ';
308                 $queryStr .=   'WHERE pc_serial = ?';
309                 $this->execStatement($queryStr, array($userId, $serialNo));
310                 
311                 // トランザクション確定
312                 $ret = $this->endTransaction();
313                 return $ret;
314         }
315         /**
316          * カテゴリーをシリアル番号で削除
317          *
318          * @param array   $serial               シリアルNo
319          * @return                                              true=成功、false=失敗
320          */
321         function delCategoryBySerial($serial)
322         {
323                 // 引数のエラーチェック
324                 if (!is_array($serial)) return false;
325                 if (count($serial) <= 0) return true;
326                 
327                 $now = date("Y/m/d H:i:s");     // 現在日時
328                 $userId = $this->gEnv->getCurrentUserId();      // 現在のユーザ
329                 
330                 // トランザクション開始
331                 $this->startTransaction();
332                 
333                 // 指定のシリアルNoのレコードが削除状態でないかチェック
334                 for ($i = 0; $i < count($serial); $i++){
335                         $queryStr  = 'SELECT * FROM product_category ';
336                         $queryStr .=   'WHERE pc_deleted = false ';             // 未削除
337                         $queryStr .=     'AND pc_serial = ? ';
338                         $ret = $this->isRecordExists($queryStr, array($serial[$i]));
339                         // 存在しない場合は、既に削除されたとして終了
340                         if (!$ret){
341                                 $this->endTransaction();
342                                 return false;
343                         }
344                 }
345                 
346                 // レコードを削除
347                 $queryStr  = 'UPDATE product_category ';
348                 $queryStr .=   'SET pc_deleted = true, ';       // 削除
349                 $queryStr .=     'pc_update_user_id = ?, ';
350                 $queryStr .=     'pc_update_dt = ? ';
351                 $queryStr .=   'WHERE pc_serial in (' . implode($serial, ',') . ') ';
352                 $this->execStatement($queryStr, array($userId, $now));
353                 
354                 // トランザクション確定
355                 $ret = $this->endTransaction();
356                 return $ret;
357         }
358         /**
359          * カテゴリーIDで削除
360          *
361          * @param int $serial                   シリアルNo
362          * @param int $userId                   ユーザID(データ更新者)
363          * @return                                              true=成功、false=失敗
364          */
365         function delCategoryById($serial, $userId)
366         {
367                 // トランザクション開始
368                 $this->startTransaction();
369                 
370                 // コンテンツIDを取得
371                 $queryStr  = 'select * from product_category ';
372                 $queryStr .=   'where pc_deleted = false ';             // 未削除
373                 $queryStr .=     'and pc_serial = ? ';
374                 $ret = $this->selectRecord($queryStr, array($serial), $row);
375                 if ($ret){              // 既に登録レコードがあるとき
376                         if ($row['pc_deleted']){                // レコードが削除されていれば終了
377                                 $this->endTransaction();
378                                 return false;
379                         }
380                 } else {                // 存在しない場合は終了
381                         $this->endTransaction();
382                         return false;
383                 }
384                 $contId = $row['pc_id'];
385                 
386                 // レコードを削除
387                 $queryStr  = 'UPDATE product_category ';
388                 $queryStr .=   'SET pc_deleted = true, ';       // 削除
389                 $queryStr .=     'pc_update_user_id = ?, ';
390                 $queryStr .=     'pc_update_dt = now() ';
391                 $queryStr .=   'WHERE pc_id = ?';
392                 $this->execStatement($queryStr, array($userId, $contId));
393                 
394                 // トランザクション確定
395                 $ret = $this->endTransaction();
396                 return $ret;
397         }
398         /**
399          * 指定したカテゴリーが親であるカテゴリーを取得
400          *
401          * @param int           $id                     親商品カテゴリーID(0はトップレベル)
402          * @param string        $langId                         言語ID
403          * @return array                                カテゴリーIDの配列
404          */
405         function getChildCategory($id, $lang)
406         {
407                 $retArray = array();
408                 $queryStr = 'SELECT pc_id FROM product_category ';
409                 $queryStr .=  'WHERE pc_deleted = false ';      // 削除されていない
410                 $queryStr .=    'AND pc_parent_id = ? ';
411                 $queryStr .=    'AND pc_language_id = ? ';
412                 $queryStr .=  'ORDER BY pc_sort_order';
413                 $ret = $this->selectRecords($queryStr, array($id, $lang), $rows);
414                 if ($ret){
415                         for ($i = 0; $i < count($rows); $i++){
416                                 $retArray[] = $rows[$i]['pc_id'];
417                         }
418                 }
419                 return $retArray;
420         }
421         /**
422          * 指定したカテゴリーが親であるカテゴリーを取得
423          *
424          * @param int           $id                     親商品カテゴリーID(0はトップレベル)
425          * @param string        $langId                         言語ID
426          * @param array         $rows           取得した行データ
427          * @return int                                  取得した行数
428          */
429         function getChildCategoryWithRows($id, $lang, &$rows)
430         {
431                 $retCount = 0;
432                 $queryStr = 'SELECT pc_id,pc_name FROM product_category ';
433                 $queryStr .=  'WHERE pc_deleted = false ';      // 削除されていない
434                 $queryStr .=    'AND pc_parent_id = ? ';
435                 $queryStr .=    'AND pc_language_id = ? ';
436                 $queryStr .=  'ORDER BY pc_sort_order';
437                 $ret = $this->selectRecords($queryStr, array($id, $lang), $rows);
438                 if ($ret){
439                         $retCount = count($rows);
440                 }
441                 return $retCount;
442         }
443         /**
444          * カテゴリーを取得
445          *
446          * @param function      $callback                       コールバック関数
447          * @param array         $idArray                        カテゴリーID
448          * @param string        $lang                           言語
449          * @return                      なし
450          */
451         function getCategoryByIdArray($callback, $idArray, $lang)
452         {
453                 $catId = implode(',', $idArray);
454                 
455                 // CASE文作成
456                 $caseStr = 'CASE pc_id ';
457                 for ($i = 0; $i < count($idArray); $i++){
458                         $caseStr .= 'WHEN ' . $idArray[$i] . ' THEN ' . $i . ' ';
459                 }
460                 $caseStr .= 'END AS no';
461
462                 $queryStr = 'SELECT *, ' . $caseStr . ' FROM product_category ';
463                 $queryStr .=  'WHERE pc_deleted = false ';              // 削除されていない
464                 $queryStr .=    'AND pc_id in (' . $catId . ') ';
465                 $queryStr .=    'AND pc_language_id = ? ';
466                 $queryStr .=  'ORDER BY no';
467                 $this->selectLoop($queryStr, array($lang), $callback, null);
468         }
469         /**
470          * 最大表示順を取得
471          *
472          * @param string        $lang           言語
473          * @return int                                  最大表示順
474          */
475         function getMaxIndex($lang)
476         {
477                 $queryStr = 'SELECT max(pc_sort_order) as mi FROM product_category ';
478                 $queryStr .=  'WHERE pc_deleted = false ';
479                 $queryStr .=  'AND pc_language_id = ? ';
480                 $ret = $this->selectRecord($queryStr, array($lang), $row);
481                 if ($ret){
482                         $index = $row['mi'];
483                 } else {
484                         $index = 0;
485                 }
486                 return $index;
487         }
488 }
489 ?>