7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
9 * @package Magic3 Framework
10 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11 * @copyright Copyright 2006-2012 Magic3 Project.
12 * @license http://www.gnu.org/copyleft/gpl.html GPL License
13 * @version SVN: $Id: ec_mainProductCategoryDb.php 5434 2012-12-06 12:32:21Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
18 class ec_mainProductCategoryDb extends BaseDb
23 * @param function $callback コールバック関数
24 * @return true=取得、false=取得せず
26 function getAllLang($callback)
28 $queryStr = 'SELECT * FROM _language ORDER BY ln_priority';
29 $this->selectLoop($queryStr, array(), $callback, null);
34 * @param string $lang 言語
35 * @param function $callback コールバック関数
38 function getAllCategory($lang, $callback)
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);
49 * @param int $id 商品カテゴリーID
50 * @return bool true=取得、false=取得せず
52 function getLangByCategoryId($id, &$rows)
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);
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 = 失敗
74 function addCategory($id, $lang, $name, $pcategory, $index, $visible, $userId, &$newSerial)
77 $this->startTransaction();
79 if ($id == 0){ // IDが0のときは、カテゴリーIDを新規取得
81 $queryStr = 'select max(pc_id) as mid from product_category ';
82 $ret = $this->selectRecord($queryStr, array(), $row);
84 $cId = $row['mid'] + 1;
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);
99 if (!$row['pc_deleted']){ // レコード存在していれば終了
100 $this->endTransaction();
103 $historyIndex = $row['pc_history_index'] + 1;
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));
114 $queryStr = 'select max(pc_serial) as ns from product_category ';
115 $ret = $this->selectRecord($queryStr, array(), $row);
116 if ($ret) $newSerial = $row['ns'];
119 $ret = $this->endTransaction();
125 * @param int $serial シリアル番号
126 * @param array $row レコード
127 * @return bool 取得 = true, 取得なし= false
129 function getCategoryBySerial($serial, &$row)
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);
139 * @param int $id カテゴリーID
140 * @param string $langId 言語ID
141 * @param array $row レコード
142 * @return bool 取得 = true, 取得なし= false
144 function getCategoryByCategoryId($id, $langId, &$row)
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);
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 = 失敗
165 function updateCategory($serial, $name, $pcategory, $index, $visible, $userId, &$newSerial)
167 $now = date("Y/m/d H:i:s"); // 現在日時
170 $this->startTransaction();
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();
183 $historyIndex = $row['pc_history_index'] + 1;
184 if ($pcategory != $row['pc_parent_id']) $changePCategory = true;
185 } else { // 存在しない場合は終了
186 $this->endTransaction();
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);
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();
205 $this->endTransaction();
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));
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));
226 $queryStr = 'select max(pc_serial) as ns from product_category ';
227 $ret = $this->selectRecord($queryStr, array(), $row);
228 if ($ret) $newSerial = $row['ns'];
231 $ret = $this->endTransaction();
237 * @param int $serial シリアル番号
238 * @param int $pcategory 親カテゴリーID
239 * @param int $userId 更新者ユーザID
240 * @param string $now 現在日時
241 * @return bool true = 成功、false = 失敗
243 function updatePCategory($serial, $pcategory, $userId, $now)
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']){ // レコードが削除されていれば終了
254 $historyIndex = $row['pc_history_index'] + 1;
255 } else { // 存在しない場合は終了
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;
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));
283 * @param int $serialNo シリアルNo
284 * @param int $userId ユーザID(データ更新者)
285 * @return true=成功、false=失敗
287 function delCategory($serialNo, $userId)
290 $this->startTransaction();
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 // 存在しない場合は、既に削除されたとして終了
299 $this->endTransaction();
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));
312 $ret = $this->endTransaction();
318 * @param array $serial シリアルNo
319 * @return true=成功、false=失敗
321 function delCategoryBySerial($serial)
324 if (!is_array($serial)) return false;
325 if (count($serial) <= 0) return true;
327 $now = date("Y/m/d H:i:s"); // 現在日時
328 $userId = $this->gEnv->getCurrentUserId(); // 現在のユーザ
331 $this->startTransaction();
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 // 存在しない場合は、既に削除されたとして終了
341 $this->endTransaction();
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));
355 $ret = $this->endTransaction();
361 * @param int $serial シリアルNo
362 * @param int $userId ユーザID(データ更新者)
363 * @return true=成功、false=失敗
365 function delCategoryById($serial, $userId)
368 $this->startTransaction();
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();
380 } else { // 存在しない場合は終了
381 $this->endTransaction();
384 $contId = $row['pc_id'];
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));
395 $ret = $this->endTransaction();
399 * 指定したカテゴリーが親であるカテゴリーを取得
401 * @param int $id 親商品カテゴリーID(0はトップレベル)
402 * @param string $langId 言語ID
403 * @return array カテゴリーIDの配列
405 function getChildCategory($id, $lang)
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);
415 for ($i = 0; $i < count($rows); $i++){
416 $retArray[] = $rows[$i]['pc_id'];
422 * 指定したカテゴリーが親であるカテゴリーを取得
424 * @param int $id 親商品カテゴリーID(0はトップレベル)
425 * @param string $langId 言語ID
426 * @param array $rows 取得した行データ
429 function getChildCategoryWithRows($id, $lang, &$rows)
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);
439 $retCount = count($rows);
446 * @param function $callback コールバック関数
447 * @param array $idArray カテゴリーID
448 * @param string $lang 言語
451 function getCategoryByIdArray($callback, $idArray, $lang)
453 $catId = implode(',', $idArray);
456 $caseStr = 'CASE pc_id ';
457 for ($i = 0; $i < count($idArray); $i++){
458 $caseStr .= 'WHEN ' . $idArray[$i] . ' THEN ' . $i . ' ';
460 $caseStr .= 'END AS no';
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);
472 * @param string $lang 言語
475 function getMaxIndex($lang)
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);