ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/webapp/lib/db/album.php @ 8446

Last change on this file since 8446 was 8446, checked in by ebihara, 12 years ago

#1777:ソースコード内のcopyright表記の年を2008に変更

File size: 18.4 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7/**
8 * db_album_public_flag_condition
9 *
10 * @param int $c_member_id target c_member_id
11 * @param int $u viewer's c_member_id
12 * @param string $force
13 * @return string
14 */
15function db_album_public_flag_condition($c_member_id, $u = null, $force = null)
16{
17    $pf_cond = '';
18    if ($force) {
19        switch ($force) {
20        case 'friend':
21            $pf_cond = " AND c_album.public_flag <> 'private'";
22            break;
23        case 'private':
24            $pf_cond = " AND c_album.public_flag = 'public'";
25            break;
26        }
27    } else {
28        if (!is_null($u) && $c_member_id != $u) {
29            $is_friend = db_friend_is_friend($c_member_id, $u);
30            if ($is_friend) {
31                $pf_cond = " AND c_album.public_flag <> 'private'";
32            } else {
33                $pf_cond = " AND c_album.public_flag = 'public'";
34            }
35        }
36    }
37    return $pf_cond;
38}
39
40/**
41 * アルバム情報を取得
42 * @param int $c_album_id
43 */
44function db_album_get_c_album4c_album_id($c_album_id)
45{
46    $sql = 'SELECT * FROM c_album WHERE c_album_id = ?';
47    $params = array(intval($c_album_id));
48
49    $album = db_get_row($sql, $params);
50
51    return $album;
52}
53
54/**
55 * あるメンバーのアルバム一覧を取得
56 *
57 * @param int $c_member_id target_member_id
58 * @param int $count
59 * @param int $u viewer's member_id
60 * @param string $force
61 */
62function db_album_get_c_album_subject_list4c_member_id($c_member_id, $count= 10, $u = null, $force = null)
63{
64    $pf_condition = db_album_public_flag_condition($c_member_id, $u, $force);
65    $sql = 'SELECT * FROM c_album WHERE c_member_id = ? '
66         . $pf_condition
67         . ' ORDER BY u_datetime DESC';
68
69    $params = array(intval($c_member_id));
70    return db_get_all_limit($sql, 0, $count, $params);
71}
72
73/**
74 * アルバム写真を取得
75 * @param int $c_album_image_id
76 */
77function db_album_image_get_c_album_image4id($c_album_image_id)
78{
79    $sql = 'SELECT * FROM c_album_image WHERE c_album_image_id = ?';
80    $params = array(intval($c_album_image_id));
81
82    return db_get_row($sql,$params);
83}
84
85/**
86 * c_album_idをキーとしてc_albumデータが存在するか判定
87 * @param int $c_album_id
88 * @return bool true,false
89 */
90function p_common_is_active_c_album_id($c_album_id)
91{
92    $sql = 'SELECT c_album_id FROM c_album WHERE c_album_id = ?';
93    return (bool)db_get_one($sql, array(intval($c_album_id)));
94}
95
96/**
97 * c_album_image_idをキーとしてc_album_imageデータが存在するか判定
98 * @param int $c_album_image_id
99 * @return bool true,false
100 */
101function p_common_is_active_c_album_image_id($c_album_image_id)
102{
103    $sql = 'SELECT c_album_image_id FROM c_album_image WHERE c_album_image_id = ?';
104    $params = array(intval($c_album_image_id));
105
106    return (bool)db_get_one($sql,$params);
107}
108
109/**
110 * アルバムIDからアルバムに登録された写真を取得
111 *
112 * @param   int   $c_album_id
113 * @return  array
114 */
115function db_album_c_album_image_list4c_album_id($c_album_id, $page = 1, $page_size = 10)
116{
117    $sql = 'SELECT * FROM c_album_image WHERE c_album_id = ? ORDER BY c_album_image_id';
118    $params = array(intval($c_album_id));
119    $list = db_get_all_page($sql, $page, $page_size, $params);
120
121    $sql = 'SELECT COUNT(c_album_image_id) FROM c_album_image WHERE c_album_id = ?';
122    $params = array(intval($c_album_id));
123    $total_num = db_get_one($sql, $params);
124
125    if ($total_num != 0) {
126        $total_page_num =  ceil($total_num / $page_size);
127        if ($page >= $total_page_num) {
128            $next = false;
129        } else {
130            $next = true;
131        }
132
133        if ($page <= 1) {
134            $prev = false;
135        } else {
136            $prev = true;
137        }
138    }
139    return array($list, $prev, $next, $total_num);
140}
141
142/**
143 * 指定したアルバム写真の前の写真IDを取得する
144 *
145 * @param int $c_album_id
146 * @param int $c_album_image_id
147 */
148function db_album_image_c_album_image_id_prev4c_album_id($c_album_id, $c_album_image_id)
149{
150    $sql = 'SELECT c_album_image_id FROM c_album_image WHERE c_album_id = ? AND c_album_image_id < ? ORDER BY c_album_image_id DESC';
151    $params = array(intval($c_album_id), intval($c_album_image_id));
152    return db_get_one($sql, $params);
153}
154
155/**
156 * 指定したアルバム写真の次の写真IDを取得する
157 *
158 * @param int $c_album_id
159 * @param int $c_album_image_id
160 */
161function db_album_image_c_album_image_id_next4c_album_id($c_album_id, $c_album_image_id)
162{
163    $sql = 'SELECT c_album_image_id FROM c_album_image WHERE c_album_id = ? AND c_album_image_id > ? ORDER BY c_album_image_id';
164    $params = array(intval($c_album_id), intval($c_album_image_id));
165    return db_get_one($sql, $params);
166}
167
168/**
169 * c_albumの閲覧権限チェック
170 * @param int $c_album_id
171 * @param int $c_member_id
172 */
173function pne_check_album_public_flag($c_album_id, $c_member_id)
174{
175    $c_album = db_album_get_c_album4c_album_id($c_album_id);
176    if ($c_album['c_member_id'] == $c_member_id) {
177        return true;
178    }
179
180    switch ($c_album['public_flag']) {
181    case 'public':
182        $allowed = true;
183        break;
184    case 'friend':
185        $allowed = db_friend_is_friend($c_album['c_member_id'], $c_member_id);
186        break;
187    case 'private':
188    default:
189        $allowed = false;
190        break;
191    }
192
193    return $allowed;
194}
195
196/**
197 * 特定ユーザーのアルバムリスト取得
198 *
199 * @param int $c_member_id target_c_member_id
200 * @param int $page_size
201 * @param int $page
202 * @param int $u viewer's c_member_id
203 */
204function p_fh_album_list_fh_my_album_list4c_member_id($c_member_id, $page_size, $page, $u = null)
205{
206    $pf_cond = db_album_public_flag_condition($c_member_id, $u);
207    $sql = 'SELECT * FROM c_album WHERE c_member_id = ?'. $pf_cond.
208           ' ORDER BY r_datetime DESC';
209    $params = array(intval($c_member_id));
210    $list = db_get_all_page($sql,$page, $page_size,$params);
211
212    $sql = 'SELECT COUNT(c_album_id) FROM c_album WHERE c_member_id = ?' . $pf_cond;
213    $total_num = db_get_one($sql, $params);
214
215    if ($total_num != 0) {
216        $total_page_num =  ceil($total_num / $page_size);
217        if ($page >= $total_page_num) {
218            $next = false;
219        } else {
220            $next = true;
221        }
222
223        if ($page <= 1) {
224            $prev = false;
225        } else {
226            $prev = true;
227        }
228    }
229
230    return array($list, $prev, $next, $total_num);
231}
232
233/**
234 * アルバム検索
235 * 検索ポイントはアルバムタイトル・アルバム説明
236 * 空白(全角半角問わない)でand検索可
237 */
238function p_h_album_list_all_search_c_album4c_album($keyword, $page_size, $page, $c_member_id = '')
239{
240    $params = array();
241
242    $select = 'SELECT *';
243    $from = ' FROM c_album';
244
245    //自分のアルバムだけを対象にする事も出来る
246    if ($c_member_id) {
247        $where = ' WHERE c_member_id = ?';
248        $params[] = intval($c_member_id);
249    } else {
250        $where = " WHERE public_flag = 'public'";
251    }
252
253    //and検索を実装
254    //subject,body を検索
255    if ($keyword) {
256        //全角空白を半角に統一
257        $keyword = str_replace(' ', ' ', $keyword);
258
259        $keyword_list = explode(' ', $keyword);
260        foreach ($keyword_list as $word) {
261            $word = check_search_word($word);
262
263            $where .= ' AND (subject LIKE ? OR description LIKE ?)';
264            $params[] = '%'.$word.'%';
265            $params[] = '%'.$word.'%';
266        }
267    }
268    $order = " ORDER BY r_datetime DESC";
269
270    $sql = $select . $from . $where . $order;
271
272    $list = db_get_all_page($sql, $page, $page_size, $params);
273    foreach($list as $key => $value) {
274        $list[$key]['c_member'] = db_member_c_member_with_profile($value['c_member_id']);
275    }
276
277
278    $sql = 'SELECT COUNT(c_album_id)' . $from . $where;
279    $total_num = db_get_one($sql, $params);
280
281    if ($total_num != 0) {
282        $total_page_num =  ceil($total_num / $page_size);
283        if ($page >= $total_page_num) {
284            $next = false;
285        } else {
286            $next = true;
287        }
288        if ($page <= 1) {
289            $prev = false;
290        } else {
291            $prev = true;
292        }
293    }
294    return array($list , $prev , $next, $total_num);
295}
296
297/**
298 * フレンドの最新アルバムリスト
299 */
300function p_h_album_list_friend_h_album_list_friend4c_member_id($c_member_id, $page_size, $page)
301{
302    $friends = db_friend_c_member_id_list($c_member_id, true);
303    if (!$friends) {
304        return array(array(), false, false, 0);
305    }
306
307    $pf_cond = db_album_public_flag_condition($c_member_id, $u);
308    $from = "c_album, c_friend";
309    $where = "c_friend.c_member_id_from = ?" .
310            " AND c_album.c_member_id = c_friend.c_member_id_to" .
311            ' AND public_flag <> \'private\'';
312
313    $sql = "SELECT c_album.* FROM {$from} WHERE {$where}" .
314            " ORDER BY c_album.r_datetime DESC";
315    $params = array(intval($c_member_id));
316    $lst = db_get_all_page($sql, $page, $page_size, $params);
317
318    foreach ($lst as $key=>$value) {
319        $lst[$key]['c_member'] = db_member_c_member4c_member_id($value['c_member_id']);
320    }
321
322    $sql = "SELECT count(*) FROM {$from} WHERE {$where}";
323    $total_num = db_get_one($sql, $params);
324
325    if ($total_num != 0) {
326        $total_page_num =  ceil($total_num / $page_size);
327        if ($page >= $total_page_num) {
328            $next = false;
329        } else {
330            $next = true;
331        }
332
333        if ($page <= 1) {
334            $prev = false;
335        } else {
336            $prev = true;
337        }
338    }
339
340    return array($lst, $prev, $next, $total_num);
341}
342
343/**
344 * フレンド最新アルバムリスト取得
345 * アルバム公開範囲を考慮
346 *
347 * @param   int $c_member_id
348 * @param   int $limit
349 * @return  array
350 */
351function p_h_home_c_album_friend_list4c_member_id($c_member_id, $limit)
352{
353    $friends = db_friend_c_member_id_list($c_member_id, true);
354    if (!$friends) {
355        return array();
356    }
357    $ids = implode(',', array_map('intval', $friends));
358
359    $sql = 'SELECT * FROM c_album' .
360            ' WHERE c_member_id IN (' . $ids . ')' .
361            ' AND public_flag <> \'private\'' .
362            ' ORDER BY u_datetime DESC';
363
364    $c_album_friend_list = db_get_all_limit($sql, 0, $limit);
365
366    foreach ($c_album_friend_list as $key => $value) {
367        $c_member = db_member_c_member4c_member_id_LIGHT($value['c_member_id']);
368        $c_album_friend_list[$key]['nickname'] = $c_member['nickname'];
369    }
370
371    return $c_album_friend_list;
372}
373
374/**
375 * アルバムを追加
376 */
377function db_album_insert_c_album($c_member_id, $subject, $description,$public_flag)
378{
379    $data = array(
380        'c_member_id' => intval($c_member_id),
381        'subject' => $subject,
382        'description' => $description,
383        'public_flag' => $public_flag,
384        'u_datetime' => db_now(),
385        'r_datetime' => db_now(),
386        'album_cover_image' => '',
387    );
388    return db_insert('c_album', $data);
389}
390
391
392function db_album_update_c_album($c_album_id,$subject,$description,$public_flag,$image_filename)
393{
394    $data = array(
395        'subject' => $subject,
396        'description' => $description,
397        'public_flag' => $public_flag,
398        'u_datetime' => db_now(),
399    );
400    if ($image_filename) $data['album_cover_image'] = $image_filename;
401
402    $where = array(
403        'c_album_id' => intval($c_album_id),
404    );
405    return db_update('c_album', $data, $where);
406
407}
408
409function db_album_update_c_album_image($c_album_image_id,$image_filename,$image_description,$filesize)
410{
411    $data = array(
412        'image_description' => $image_description,
413    );
414
415     if ($image_filename) {
416        $data['image_filename'] = $image_filename;
417        $data['filesize'] = $filesize;
418     }
419
420    $where = array(
421        'c_album_image_id' => intval($c_album_image_id),
422    );
423
424    return db_update('c_album_image', $data, $where);
425
426}
427
428/**
429 * アルバムの情報を更新
430 */
431function db_album_update_c_album_cover($c_album_id,$subject,$description,$album_cover_image,$public_flag)
432{
433    $data = array(
434        'subject' => $subject,
435        'description' => $description,
436        'public_flag' => $public_flag,
437        'u_datetime' => db_now(),
438    );
439    if ($album_cover_image) $data['album_cover_image'] = $album_cover_image;
440
441    $where = array(
442        'c_album_id' => intval($c_album_id),
443    );
444
445    return db_update('c_album', $data, $where);
446}
447
448/**
449 * アルバムの表紙写真の名前を更新
450 */
451function db_album_update_c_album_album_cover_image($c_album_id,$album_cover_image)
452{
453    $data = array(
454        'album_cover_image' => $album_cover_image,
455        'u_datetime' => db_now(),
456    );
457
458    $where = array(
459        'c_album_id' => intval($c_album_id),
460    );
461    return db_update('c_album', $data, $where);
462}
463
464/**
465 * アルバムの更新日時を更新
466 * @param int $album_id
467 */
468function db_album_update_c_album_u_datetime($album_id)
469{
470    $data = array(
471        'u_datetime' => db_now(),
472    );
473
474    $where =array(
475        'c_album_id' => $album_id,
476    );
477    return db_update('c_album',$data,$where);
478}
479
480/**
481 * c_album_imageの新規登録
482 *
483 * @param int $c_album_id
484 * @param int $c_member_id
485 * @param string $image_filename
486 * @param string $image_description
487 * @param int $filesize
488 */
489function db_insert_c_album_image($c_album_id, $c_member_id, $image_filename, $image_description, $filesize = 0)
490{
491    $data = array(
492        'c_album_id' => $c_album_id,
493        'c_member_id' => $c_member_id,
494        'image_description' => $image_description,
495        'image_filename' => $image_filename,
496        'filesize' => $filesize,
497        'r_datetime' => db_now(),
498    );
499
500    $insert_id = db_insert('c_album_image', $data);
501    if ($insert_id) {
502        db_album_update_c_album_u_datetime($c_album_id);
503    }
504
505    return $insert_id;
506}
507
508/**
509 * アルバムの削除、写真も削除
510 * @param int $c_album_id
511 */
512function db_album_delete_c_album($c_album_id)
513{
514    $sql = 'SELECT image_filename FROM c_album_image WHERE c_album_id = ?';
515    $filename_list = db_get_col($sql, array($c_album_id), 'main');
516
517    //アルバムに登録された写真
518    foreach ($filename_list as $filename) {
519        db_album_image_data_delete($filename);
520    }
521
522    // アルバムの表紙
523    $sql = 'SELECT * FROM c_album WHERE c_album_id = ?';
524    $params = array(intval($c_album_id));
525    $c_album = db_get_row($sql, $params, 'main');
526    if ($c_album['album_cover_image']) {
527        db_album_image_data_delete($c_album['album_cover_image']);
528    }
529
530    $params = array(intval($c_album_id));
531
532    //アルバムと写真の関連
533    $sql = 'DELETE FROM c_album_image WHERE c_album_id = ?';
534    db_query($sql, $params);
535
536    // アルバム
537    $sql = 'DELETE FROM c_album WHERE c_album_id = ?';
538    db_query($sql, $params);
539
540    return;
541}
542
543/**
544 * c_album_image_idをキーとしてc_album_imageテーブルからデータを削除
545 */
546function db_album_delete_c_album_image($c_album_image_id)
547{
548    $sql = 'SELECT image_filename FROM c_album_image WHERE c_album_image_id = ?';
549    $filename = db_get_one($sql, array($c_album_image_id), 'main');
550    db_album_image_data_delete($filename);
551
552    $sql = 'DELETE FROM c_album_image WHERE c_album_image_id = ?';
553    $params = array(intval($c_album_image_id));
554
555    return db_query($sql, $params);
556}
557
558/**
559 * アルバム用の写真を登録
560 */
561function image_insert_c_image_album4tmp($prefix, $tmpfile)
562{
563    if (!$tmpfile || preg_match('/[^\.\w]/', $tmpfile)) return false;
564
565    $path_parts = pathinfo($tmpfile);
566    $ext = $path_parts['extension'];
567    $ext = strtolower($ext);
568
569    $allowed_ext = array('jpg', 'jpeg', 'gif', 'png');
570    if (!in_array($ext, $allowed_ext)) {
571        return false;
572    }
573
574    $filename = sprintf('%s_%s.%s', $prefix, time(), $ext);
575
576    if (!OPENPNE_TMP_IMAGE_DB) {
577        $img_tmp_dir_path = OPENPNE_VAR_DIR . '/tmp/';
578        $filepath = $img_tmp_dir_path . basename($tmpfile);
579
580        if (!is_readable($filepath)) {
581            return false;
582        }
583
584        $filesize = filesize($filepath);
585        $fp = fopen($filepath, 'rb');
586        $bin = fread($fp, $filesize);
587        fclose($fp);
588
589        // 写真かどうかのチェック
590        if (!@imagecreatefromstring($bin)) {
591            return false;
592        }
593    } else {
594        $c_tmp_image = db_image_c_tmp_image4filename($tmpfile);
595        $bin = base64_decode($c_tmp_image['bin']);
596        $filesize = strlen($bin);
597    }
598
599    if (db_image_insert_c_image_album($filename, $bin)) {
600        return array($filename, $filesize);
601    }
602
603    return false;
604}
605
606function db_image_insert_c_image_album($filename, $bin, $type = '')
607{
608    $db =& db_get_instance('image');
609
610    $data = array(
611        'filename'   => $filename,
612        'bin'        => base64_encode($bin),
613        'type'       => $type,
614        'r_datetime' => db_now(),
615    );
616    return $db->insert('c_image', $data, 'c_image_id');
617}
618
619function db_album_image_data_delete($image_filename)
620{
621    if (!$image_filename) return false;
622
623    db_album_image_delete_c_image($image_filename);
624
625    // cacheの削除
626    image_cache_delete($image_filename);
627}
628
629function db_album_image_delete_c_image($filename)
630{
631    $db =& db_get_instance('image');
632
633    $sql = 'DELETE FROM c_image WHERE filename = ?';
634    $params = array($filename);
635    return $db->query($sql, $params);
636}
637
638function db_image_is_c_album_image4filename($filename)
639{
640    if (!$filename) return false;
641
642    $db =& db_get_instance('image');
643
644    $sql = 'SELECT c_image_id FROM c_image WHERE filename = ?';
645    $params = array($filename);
646    return (bool)$db->get_one($sql, $params);
647}
648
649/**
650 * メンバーのすべてのアルバム写真のファイルサイズの合計を取得する
651 *
652 * @params int $c_member_id
653 * @return int
654 */
655function db_album_sum_filesize4c_member_id($c_member_id)
656{
657    $sql = 'SELECT filesize FROM c_album_image WHERE c_member_id = ?';
658    $list = db_get_col($sql, array($c_member_id));
659    return array_sum($list);
660}
661
662/**
663 * メンバーが写真を投稿可能かどうか
664 *
665 * メンバーのファイルサイズの合計が OPENPNE_ALBUM_LIMIT を超過していないかどうかを返す
666 * $new_filesize を指定した場合は、メンバーのファイルサイズの合計に $new_filesize を
667 * 加算したものが OPENPNE_ALBUM_LIMIT を超過していないかどうかを返す
668 *
669 * @params int $c_member_id
670 * @params int $new_filesize
671 * @return bool
672 */
673function db_album_is_insertable4c_member_id($c_member_id, $new_filesize = 0)
674{
675    if (!OPENPNE_ALBUM_LIMIT) {
676        return true;
677    }
678
679    $size = db_album_sum_filesize4c_member_id($c_member_id) + $new_filesize;
680
681    $mb = 1048576;
682    if (OPENPNE_ALBUM_LIMIT * $mb < $size) {
683        return false;
684    }
685
686    return true;
687}
688
689?>
Note: See TracBrowser for help on using the repository browser.