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: s_photo_categoryDb.php 4711 2012-02-22 13:20:46Z fishbone $
14 * @link http://www.magic3.org
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
18 class s_photo_categoryDb 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 コールバック関数
36 * @param bool $onlyVisible 表示可能なカテゴリーのみ取得
39 function getAllCategory($lang, $callback, $onlyVisible=false)
41 $queryStr = 'SELECT * FROM photo_category LEFT JOIN _login_user ON hc_create_user_id = lu_id AND lu_deleted = false ';
42 $queryStr .= 'WHERE hc_language_id = ? ';
43 $queryStr .= 'AND hc_deleted = false '; // 削除されていない
44 if ($onlyVisible) $queryStr .= 'AND hc_visible = true '; // 表示可能項目のみ
45 $queryStr .= 'ORDER BY hc_sort_order';
46 $this->selectLoop($queryStr, array($lang), $callback);
51 * @param string $lang 言語
52 * @param array $row レコード
53 * @return bool true=取得、false=取得せず
55 function getAllPCategory($lang, &$rows)
57 $queryStr = 'SELECT DISTINCT pc1.hc_parent_id AS parent, pc2.hc_name AS name FROM photo_category AS pc1 RIGHT JOIN photo_category AS pc2 ON pc1.hc_parent_id = pc2.hc_id AND pc1.hc_language_id = pc2.hc_language_id AND pc2.hc_deleted = false ';
58 $queryStr .= 'WHERE pc1.hc_deleted = false '; // 削除されていない
59 $queryStr .= 'AND pc1.hc_parent_id > 0 '; // 親カテゴリーあり
60 $queryStr .= 'AND pc1.hc_language_id = ? ';
61 $queryStr .= 'ORDER BY pc2.hc_sort_order';
62 $retValue = $this->selectRecords($queryStr, array($lang), $rows);
68 * @param string $langId 言語ID
69 * @param array $categoryArray 取得するカテゴリID
70 * @param array $rows 取得レコード
71 * @return true=取得、false=取得せず
73 function getAllCategoryForMenu($langId, $categoryArray, &$rows)
75 if (count($categoryArray) <= 0) return false;
79 $caseStr = 'CASE hc_parent_id ';
80 for ($i = 0; $i < count($categoryArray); $i++){
81 //$id = '\'' . addslashes($categoryArray[$i]) . '\'';
82 $id = addslashes($categoryArray[$i]);
83 $caseStr .= 'WHEN ' . $id . ' THEN ' . $i . ' ';
84 $categoryId .= $id . ',';
86 $caseStr .= 'END AS no ';
87 $categoryId = rtrim($categoryId, ',');
89 $queryStr = 'SELECT *, ' . $caseStr . ' FROM photo_category ';
90 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
91 $queryStr .= 'AND hc_visible = true '; // 表示
92 $queryStr .= 'AND hc_language_id = ? ';
93 $queryStr .= 'AND hc_parent_id in (' . $categoryId . ') ';
94 $queryStr .= 'ORDER BY no, hc_sort_order';
95 $retValue = $this->selectRecords($queryStr, array($langId), $rows);
101 * @param int $id 画像カテゴリーID
102 * @param array $row レコード
103 * @return bool true=取得、false=取得せず
105 function getLangByCategoryId($id, &$rows)
107 $queryStr = 'SELECT ln_id, ln_name, ln_name_en FROM photo_category LEFT JOIN _language ON hc_language_id = ln_id ';
108 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
109 $queryStr .= 'AND hc_id = ? ';
110 $queryStr .= 'ORDER BY hc_id, ln_priority';
111 $retValue = $this->selectRecords($queryStr, array($id), $rows);
117 * @param int $id カテゴリーID
118 * @param string $lang 言語ID
119 * @param string $name 名前
120 * @param string $password パスワード
121 * @param int $pcategory 親カテゴリーID
122 * @param int $index 表示順
123 * @param bool $visible 表示、非表示
124 * @param int $userId 更新者ユーザID
125 * @param int $newSerial 新規シリアル番号
126 * @return bool true = 成功、false = 失敗
128 function addCategory($id, $lang, $name, $password, $pcategory, $index, $visible, $userId, &$newSerial)
131 $this->startTransaction();
133 if ($id == 0){ // IDが0のときは、カテゴリーIDを新規取得
135 $queryStr = 'select max(hc_id) as mid from photo_category ';
136 $ret = $this->selectRecord($queryStr, array(), $row);
138 $cId = $row['mid'] + 1;
148 $queryStr = 'SELECT * FROM photo_category ';
149 $queryStr .= 'WHERE hc_id = ? ';
150 $queryStr .= 'AND hc_language_id = ? ';
151 $queryStr .= 'ORDER BY hc_history_index DESC ';
152 $ret = $this->selectRecord($queryStr, array($cId, $lang), $row);
154 if (!$row['hc_deleted']){ // レコード存在していれば終了
155 $this->endTransaction();
158 $historyIndex = $row['hc_history_index'] + 1;
162 $queryStr = 'INSERT INTO photo_category ';
163 $queryStr .= '(hc_id, hc_language_id, hc_history_index, hc_name, hc_password, hc_parent_id, hc_sort_order, hc_visible, hc_create_user_id, hc_create_dt) ';
164 $queryStr .= 'VALUES ';
165 $queryStr .= '(?, ?, ?, ?, ?, ?, ?, ?, ?, now())';
166 $this->execStatement($queryStr, array($cId, $lang, $historyIndex, $name, $password, $pcategory, $index, $visible, $userId));
169 $queryStr = 'select max(hc_serial) as ns from photo_category ';
170 $ret = $this->selectRecord($queryStr, array(), $row);
171 if ($ret) $newSerial = $row['ns'];
174 $ret = $this->endTransaction();
180 * @param int $serial シリアル番号
181 * @param string $name 名前
182 * @param string $password パスワード
183 * @param int $pcategory 親カテゴリーID
184 * @param int $index 表示順
185 * @param bool $visible 表示、非表示
186 * @param int $userId 更新者ユーザID
187 * @param int $newSerial 新規シリアル番号
188 * @return bool true = 成功、false = 失敗
190 function updateCategory($serial, $name, $password, $pcategory, $index, $visible, $userId, &$newSerial)
192 $now = date("Y/m/d H:i:s"); // 現在日時
195 $this->startTransaction();
197 // 指定のシリアルNoのレコードが削除状態でないかチェック
198 $changePCategory = false; // 親カテゴリを変更かどうか
199 $historyIndex = 0; // 履歴番号
200 $queryStr = 'select * from photo_category ';
201 $queryStr .= 'where hc_serial = ? ';
202 $ret = $this->selectRecord($queryStr, array($serial), $row);
203 if ($ret){ // 既に登録レコードがあるとき
204 if ($row['hc_deleted']){ // レコードが削除されていれば終了
205 $this->endTransaction();
208 $historyIndex = $row['hc_history_index'] + 1;
209 if ($pcategory != $row['hc_parent_id']) $changePCategory = true;
210 } else { // 存在しない場合は終了
211 $this->endTransaction();
214 // 親カテゴリーが変更のときは、同じカテゴリーIDの親カテゴリーも変更
215 if ($changePCategory){
216 $queryStr = 'SELECT hc_serial FROM photo_category ';
217 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
218 $queryStr .= 'AND hc_id = ? ';
219 $ret = $this->selectRecords($queryStr, array($row['hc_id']), $rows);
221 for ($i = 0; $i < count($rows); $i++){
222 if ($rows[$i]['hc_serial'] != $serial){
223 if (!$this->updatePCategory($rows[$i]['hc_serial'], $pcategory, $userId, $now)){
224 $this->endTransaction();
230 $this->endTransaction();
236 $queryStr = 'UPDATE photo_category ';
237 $queryStr .= 'SET hc_deleted = true, '; // 削除
238 $queryStr .= 'hc_update_user_id = ?, ';
239 $queryStr .= 'hc_update_dt = ? ';
240 $queryStr .= 'WHERE hc_serial = ?';
241 $this->execStatement($queryStr, array($userId, $now, $serial));
244 $queryStr = 'INSERT INTO photo_category ';
245 $queryStr .= '(hc_id, hc_language_id, hc_history_index, hc_name, hc_password, hc_parent_id, hc_sort_order, hc_visible, hc_create_user_id, hc_create_dt) ';
246 $queryStr .= 'VALUES ';
247 $queryStr .= '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
248 $this->execStatement($queryStr, array($row['hc_id'], $row['hc_language_id'], $historyIndex, $name, $password, $pcategory, $index, $visible, $userId, $now));
251 $queryStr = 'select max(hc_serial) as ns from photo_category ';
252 $ret = $this->selectRecord($queryStr, array(), $row);
253 if ($ret) $newSerial = $row['ns'];
256 $ret = $this->endTransaction();
262 * @param int $serial シリアル番号
263 * @param array $row レコード
264 * @return bool 取得 = true, 取得なし= false
266 function getCategoryBySerial($serial, &$row)
268 $queryStr = 'select * from photo_category LEFT JOIN _login_user ON hc_create_user_id = lu_id AND lu_deleted = false ';
269 $queryStr .= 'WHERE hc_serial = ? ';
270 $ret = $this->selectRecord($queryStr, array($serial), $row);
276 * @param int $id カテゴリーID
277 * @param string $langId 言語ID
278 * @param array $row レコード
279 * @return bool 取得 = true, 取得なし= false
281 function getCategoryByCategoryId($id, $langId, &$row)
283 $queryStr = 'SELECT * FROM photo_category LEFT JOIN _login_user ON hc_create_user_id = lu_id AND lu_deleted = false ';
284 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
285 $queryStr .= 'AND hc_id = ? ';
286 $queryStr .= 'AND hc_language_id = ? ';
287 $ret = $this->selectRecord($queryStr, array($id, $langId), $row);
293 * @param int $serial シリアル番号
294 * @param int $pcategory 親カテゴリーID
295 * @param int $userId 更新者ユーザID
296 * @param string $now 現在日時
297 * @return bool true = 成功、false = 失敗
299 function updatePCategory($serial, $pcategory, $userId, $now)
301 // 指定のシリアルNoのレコードが削除状態でないかチェック
302 $historyIndex = 0; // 履歴番号
303 $queryStr = 'select * from photo_category ';
304 $queryStr .= 'where hc_serial = ? ';
305 $ret = $this->selectRecord($queryStr, array($serial), $row);
306 if ($ret){ // 既に登録レコードがあるとき
307 if ($row['hc_deleted']){ // レコードが削除されていれば終了
310 $historyIndex = $row['hc_history_index'] + 1;
311 } else { // 存在しない場合は終了
316 $queryStr = 'UPDATE photo_category ';
317 $queryStr .= 'SET hc_deleted = true, '; // 削除
318 $queryStr .= 'hc_update_user_id = ?, ';
319 $queryStr .= 'hc_update_dt = ? ';
320 $queryStr .= 'WHERE hc_serial = ?';
321 $ret = $this->execStatement($queryStr, array($userId, $now, $serial));
322 if (!$ret) return false;
325 $queryStr = 'INSERT INTO photo_category ';
326 $queryStr .= '(hc_id, hc_language_id, hc_history_index, hc_name, hc_parent_id, hc_sort_order, hc_create_user_id, hc_create_dt) ';
327 $queryStr .= 'VALUES ';
328 $queryStr .= '(?, ?, ?, ?, ?, ?, ?, ?)';
329 $ret = $this->execStatement($queryStr, array($row['hc_id'], $row['hc_language_id'], $historyIndex, $row['hc_name'], $pcategory, $row['hc_sort_order'], $userId, $now));
339 * @param int $serialNo シリアルNo
340 * @param int $userId ユーザID(データ更新者)
341 * @return true=成功、false=失敗
343 function delCategory($serialNo, $userId)
346 $this->startTransaction();
348 // 指定のシリアルNoのレコードが削除状態でないかチェック
349 $queryStr = 'select * from photo_category ';
350 $queryStr .= 'where hc_deleted = false '; // 未削除
351 $queryStr .= 'and hc_serial = ? ';
352 $ret = $this->isRecordExists($queryStr, array($serialNo));
353 // 存在しない場合は、既に削除されたとして終了
355 $this->endTransaction();
360 $queryStr = 'UPDATE photo_category ';
361 $queryStr .= 'SET hc_deleted = true, '; // 削除
362 $queryStr .= 'hc_update_user_id = ?, ';
363 $queryStr .= 'hc_update_dt = now() ';
364 $queryStr .= 'WHERE hc_serial = ?';
365 $this->execStatement($queryStr, array($userId, $serialNo));
368 $ret = $this->endTransaction();
374 * @param array $serial シリアルNo
375 * @return true=成功、false=失敗
377 function delCategoryBySerial($serial)
382 if (!is_array($serial)) return false;
383 if (count($serial) <= 0) return true;
385 $now = date("Y/m/d H:i:s"); // 現在日時
386 $userId = $gEnvManager->getCurrentUserId(); // 現在のユーザ
389 $this->startTransaction();
391 // 指定のシリアルNoのレコードが削除状態でないかチェック
392 for ($i = 0; $i < count($serial); $i++){
393 $queryStr = 'SELECT * FROM photo_category ';
394 $queryStr .= 'WHERE hc_deleted = false '; // 未削除
395 $queryStr .= 'AND hc_serial = ? ';
396 $ret = $this->isRecordExists($queryStr, array($serial[$i]));
397 // 存在しない場合は、既に削除されたとして終了
399 $this->endTransaction();
405 $queryStr = 'UPDATE photo_category ';
406 $queryStr .= 'SET hc_deleted = true, '; // 削除
407 $queryStr .= 'hc_update_user_id = ?, ';
408 $queryStr .= 'hc_update_dt = ? ';
409 $queryStr .= 'WHERE hc_serial in (' . implode($serial, ',') . ') ';
410 $this->execStatement($queryStr, array($userId, $now));
413 $ret = $this->endTransaction();
419 * @param int $serial シリアルNo
420 * @param int $userId ユーザID(データ更新者)
421 * @return true=成功、false=失敗
423 function delCategoryById($serial, $userId)
426 $this->startTransaction();
429 $queryStr = 'select * from photo_category ';
430 $queryStr .= 'where hc_deleted = false '; // 未削除
431 $queryStr .= 'and hc_serial = ? ';
432 $ret = $this->selectRecord($queryStr, array($serial), $row);
433 if ($ret){ // 既に登録レコードがあるとき
434 if ($row['hc_deleted']){ // レコードが削除されていれば終了
435 $this->endTransaction();
438 } else { // 存在しない場合は終了
439 $this->endTransaction();
442 $contId = $row['hc_id'];
445 $queryStr = 'UPDATE photo_category ';
446 $queryStr .= 'SET hc_deleted = true, '; // 削除
447 $queryStr .= 'hc_update_user_id = ?, ';
448 $queryStr .= 'hc_update_dt = now() ';
449 $queryStr .= 'WHERE hc_id = ?';
450 $this->execStatement($queryStr, array($userId, $contId));
453 $ret = $this->endTransaction();
457 * 指定したカテゴリーが親であるカテゴリーを取得
459 * @param int $id 親画像カテゴリーID(0はトップレベル)
460 * @param string $langId 言語ID
461 * @return array カテゴリーIDの配列
463 function getChildCategory($id, $lang)
466 $queryStr = 'SELECT hc_id FROM photo_category ';
467 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
468 $queryStr .= 'AND hc_parent_id = ? ';
469 $queryStr .= 'AND hc_language_id = ? ';
470 $queryStr .= 'ORDER BY hc_sort_order';
471 $ret = $this->selectRecords($queryStr, array($id, $lang), $rows);
473 for ($i = 0; $i < count($rows); $i++){
474 $retArray[] = $rows[$i]['hc_id'];
480 * 指定したカテゴリーが親であるカテゴリーを取得
482 * @param int $id 親画像カテゴリーID(0はトップレベル)
483 * @param string $langId 言語ID
484 * @param array $rows 取得した行データ
487 function getChildCategoryWithRows($id, $lang, &$rows)
490 $queryStr = 'SELECT hc_id,hc_name FROM photo_category ';
491 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
492 $queryStr .= 'AND hc_parent_id = ? ';
493 $queryStr .= 'AND hc_language_id = ? ';
494 $queryStr .= 'ORDER BY hc_sort_order';
495 $ret = $this->selectRecords($queryStr, array($id, $lang), $rows);
497 $retCount = count($rows);
504 * @param function $callback コールバック関数
505 * @param array $idArray カテゴリーID
506 * @param string $lang 言語
509 function getCategoryByIdArray($callback, $idArray, $lang)
511 $catId = implode(',', $idArray);
514 $caseStr = 'CASE hc_id ';
515 for ($i = 0; $i < count($idArray); $i++){
516 $caseStr .= 'WHEN ' . $idArray[$i] . ' THEN ' . $i . ' ';
518 $caseStr .= 'END AS no';
520 $queryStr = 'SELECT *, ' . $caseStr . ' FROM photo_category ';
521 $queryStr .= 'WHERE hc_deleted = false '; // 削除されていない
522 $queryStr .= 'AND hc_id in (' . $catId . ') ';
523 $queryStr .= 'AND hc_language_id = ? ';
524 $queryStr .= 'ORDER BY no';
525 $this->selectLoop($queryStr, array($lang), $callback, null);
530 * @param string $lang 言語
533 function getMaxIndex($lang)
535 $queryStr = 'SELECT max(hc_sort_order) as mi FROM photo_category ';
536 $queryStr .= 'WHERE hc_deleted = false ';
537 $queryStr .= 'AND hc_language_id = ? ';
538 $ret = $this->selectRecord($queryStr, array($lang), $row);