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-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
16 require_once($gEnvManager->getDbPath() . '/baseDb.php');
18 class pc_contentDb extends BaseDb
23 * @param function $callback コールバック関数
24 * @param array $contentIdArray コンテンツID
25 * @param string $lang 言語
26 * @param bool $all すべてのデータを取得するか、ユーザ制限のないデータを取得するかを指定
29 function getContentItems($callback, $contentIdArray, $lang, $all=true)
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);
45 $contentId = implode(',', $contentIdArray);
48 $caseStr = 'CASE cn_id ';
49 for ($i = 0; $i < count($contentIdArray); $i++){
50 $caseStr .= 'WHEN ' . $contentIdArray[$i] . ' THEN ' . $i . ' ';
52 $caseStr .= 'END AS no';
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);
68 * @param function $callback コールバック関数
69 * @param string $lang 言語
72 function getAllContentItems($callback, $lang)
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);
85 * @param string $contentId コンテンツID
86 * @return true=取得、false=取得せず
88 function getLangByContentId($contentId, &$rows)
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);
102 * @param function $callback コールバック関数
103 * @param string $contentId コンテンツID
106 function getLangLoopByContentId($callback, $contentId)
109 if (empty($contentId)) return;
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);
122 * @param string $contentId コンテンツID
123 * @param string $langId 言語ID
124 * @param array $row レコード
125 * @return bool 取得 = true, 取得なし= false
127 function getContentByContentId($contentId, $langId, &$row)
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);
141 * @param string $serial シリアル番号
142 * @param array $row レコード
143 * @return bool 取得 = true, 取得なし= false
145 function getContentBySerial($serial, &$row)
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);
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 = 失敗
168 function addContentItem($contentid, $lang, $name, $desc, $html, $visible, $default, $limited, $key, &$newSerial)
171 $now = date("Y/m/d H:i:s"); // 現在日時
172 $user = $gEnvManager->getCurrentUserId(); // 現在のユーザ
176 $this->startTransaction();
178 if ($contentid == 0){ // コンテンツIDが0のときは、コンテンツIDを新規取得
180 $queryStr = 'select max(cn_id) as mid from content ';
181 $queryStr .= 'WHERE cn_type = ? ';
182 $ret = $this->selectRecord($queryStr, array($contentType), $row);
184 $contId = $row['mid'] + 1;
189 $contId = $contentid;
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);
201 if (!$row['cn_deleted']){ // レコード存在していれば終了
202 $this->endTransaction();
205 $historyIndex = $row['cn_history_index'] + 1;
207 // デフォルトを設定のときは他のデフォルトを解除
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));
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));
226 $queryStr = 'select max(cn_serial) as ns from content ';
227 $ret = $this->selectRecord($queryStr, array(), $row);
228 if ($ret) $newSerial = $row['ns'];
231 $ret = $this->endTransaction();
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 = 失敗
248 function updateContentItem($serial, $name, $html, $visible, $default, $limited, $key, &$newSerial)
251 $now = date("Y/m/d H:i:s"); // 現在日時
252 $user = $gEnvManager->getCurrentUserId(); // 現在のユーザ
256 $this->startTransaction();
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();
268 $historyIndex = $row['cn_history_index'] + 1;
269 } else { // 存在しない場合は終了
270 $this->endTransaction();
273 // デフォルトを設定のときは他のデフォルトを解除
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']));
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));
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));
301 $queryStr = 'select max(cn_serial) as ns from content ';
302 $ret = $this->selectRecord($queryStr, array(), $row);
303 if ($ret) $newSerial = $row['ns'];
306 $ret = $this->endTransaction();
313 * @param array $serial シリアルNo
314 * @return true=成功、false=失敗
316 function delContentItem($serial)
319 $now = date("Y/m/d H:i:s"); // 現在日時
320 $user = $gEnvManager->getCurrentUserId(); // 現在のユーザ
322 if (!is_array($serial) || count($serial) <= 0) return true;
325 $this->startTransaction();
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 // 存在しない場合は、既に削除されたとして終了
335 $this->endTransaction();
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));
349 $ret = $this->endTransaction();
355 * @param int $serial シリアルNo
356 * @param int $userId ユーザID(データ更新者)
357 * @return true=成功、false=失敗
359 function delContentItemById($serial, $userId)
364 $this->startTransaction();
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();
376 } else { // 存在しない場合は終了
377 $this->endTransaction();
380 $contId = $row['cn_id'];
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));
392 $ret = $this->endTransaction();
398 * @param int $userId ユーザID(データ更新者)
399 * @return true=成功、false=失敗
401 function delAllContentItems($userId)
406 $this->startTransaction();
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));
417 $ret = $this->endTransaction();
423 * @param function $callback コールバック関数
424 * @return true=取得、false=取得せず
426 function getAllLang($callback)
428 $queryStr = 'SELECT * FROM _language ORDER BY ln_priority';
429 $this->selectLoop($queryStr, array(), $callback, null);
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 = 失敗
443 function addMenuItem($menuId, $lang, $name, $url, $incIndex, $userId)
446 $this->startTransaction();
449 $queryStr = 'select max(mi_id) as mid from menu_item ';
450 $ret = $this->selectRecord($queryStr, array(), $row);
452 $menuItemId = $row['mid'] + 1;
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);
462 $index = $row['m'] + $incIndex;
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));
474 $ret = $this->endTransaction();