You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
5.5 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. <?php
  2. /**
  3. * Class Board_model
  4. * ----------------------------------------------------------
  5. * 게시판 관련 모델
  6. */
  7. class Board_model extends WB_Model
  8. {
  9. function __construct()
  10. {
  11. parent::__construct();
  12. $this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file', 'key_prefix' => PROJECT));
  13. }
  14. /**
  15. * 내용중 외부서버의 이미지를 내부서버로 복제한다.
  16. * @param $content
  17. */
  18. function copy_external_image($content, $user_agent)
  19. {
  20. // 외부서버의 이미지를 내부 서버로 복제한다.
  21. preg_match_all('/<img(.*)src="([^ "]*)"([^>]*)>/',$content, $matches_img);
  22. if(isset($matches_img[2]) && count($matches_img[2]) > 0)
  23. {
  24. foreach($matches_img[2] as $img) {
  25. $img = preg_replace('/\?.*/', '', $img);
  26. $img_server = parse_url($img);
  27. $cdn_server = parse_url(base_url());
  28. // 만약 같은서버에 올려진 파일이라면 지나간다.
  29. if (isset($img_server['host']) && $img_server['host'] === $cdn_server['host']) {
  30. continue;
  31. }
  32. // 파일의 확장자를 구한다.
  33. $read_img = $img;
  34. $fileinfo = pathinfo($read_img);
  35. $ext = (isset($fileinfo['extension']) && $fileinfo['extension']) ? $fileinfo['extension'] : "";
  36. // curl로 파일을 복사해온다.
  37. $ch = curl_init();
  38. curl_setopt($ch, CURLOPT_URL, $read_img);
  39. curl_setopt($ch, CURLOPT_HEADER, 0);
  40. curl_setopt($ch, CURLOPT_REFERER, $read_img);
  41. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  42. curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
  43. curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  44. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  45. $img_content = curl_exec ($ch);
  46. $curl_info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
  47. make_dir(DIR_UPLOAD . DIRECTORY_SEPARATOR . "editor", TRUE);
  48. $file_path_add = "./";
  49. $new_file_src = DIR_UPLOAD . "/editor/" .date('Y/m') ."/" .md5(time().$img) . ($ext?".".$ext:"");
  50. $new_url = base_url($new_file_src);
  51. $fh = fopen($file_path_add.$new_file_src, 'w');
  52. fwrite($fh, $img_content);
  53. fclose($fh);
  54. curl_close($ch);
  55. $imagesize = getimagesize($file_path_add.$new_file_src);
  56. if( $imagesize) {
  57. // 기존 html의 경로 바꾸기
  58. $content = str_replace( $img, $new_url, $content );
  59. }
  60. }
  61. }
  62. return $content;
  63. }
  64. /**
  65. * 패러미터 정보를 가져온다.
  66. * @return string
  67. */
  68. /**
  69. * 게시글에 포함된 첨부파일 목록을 가져온다.
  70. * @param $brd_key
  71. * @param $post_idx
  72. * @return array
  73. */
  74. function get_attach_list($brd_key, $post_idx)
  75. {
  76. if(empty($brd_key) OR empty($post_idx)) return array();
  77. $file_list = $this->db->where('att_target_type', 'BOARD')->where('att_target', $post_idx)->get('attach')->result_array();
  78. foreach($file_list as &$f)
  79. {
  80. $f['link'] = base_url("board/{$brd_key}/download/{$post_idx}/{$f['att_idx']}");
  81. }
  82. return $file_list;
  83. }
  84. /**********************************************************
  85. * 첨부파일 삭제
  86. * @param $bfi_idx
  87. * @return mixed
  88. *********************************************************/
  89. function attach_remove($att_idx)
  90. {
  91. if(empty($att_idx)) return false;
  92. $this->db->where("att_idx", $att_idx);
  93. $result = $this->db->get('attach');
  94. $attach = $result->row_array();
  95. if(! $attach) return false;
  96. if( file_exists(FCPATH. $attach['att_filepath']) )
  97. {
  98. @unlink(FCPATH.$attach['att_filepath']);
  99. }
  100. $this->db->where("att_idx", $att_idx);
  101. $this->db->delete("attach");
  102. }
  103. /**
  104. * 해당 게시판에 관리자 권한이 있는지 확인한다.
  105. * @param $brd_key
  106. * @param $member_idx
  107. * @return bool
  108. */
  109. function is_admin($brd_key, $member_idx)
  110. {
  111. if( empty($member_idx) OR $member_idx == 0 )
  112. {
  113. return FALSE;
  114. }
  115. $result = (int)$this->db->select('COUNT(*) AS cnt')->where('ath_type','BOARD')->where('ath_key', $brd_key)->where('mem_idx', $member_idx)->get('member_auth')->row(0)->cnt;
  116. return ( $result > 0 );
  117. }
  118. /**
  119. * 해당 게시글의 코멘트가 몇개인지 확인한다.
  120. * @param $brd_key
  121. * @param $post_idx
  122. */
  123. function get_comment_count($brd_key, $post_idx)
  124. {
  125. $count = (int)$this->db->select('COUNT(*) AS cnt')->from('board_comment')->where_in('cmt_status', array('Y','B'))->where('brd_key',$brd_key)->where('post_idx',$post_idx)->get()->row(0)->cnt;
  126. return $count;
  127. }
  128. /**
  129. * 해당 게시물의 댓글수를 최신화 한다
  130. * @param $brd_key
  131. * @param $post_idx
  132. */
  133. function update_post_comment_count($brd_key, $post_idx)
  134. {
  135. $count = $this->get_comment_count($brd_key, $post_idx);
  136. $this->db->where('brd_key', $brd_key);
  137. $this->db->where('post_idx', $post_idx);
  138. $this->db->set('post_count_comment', (int)$count);
  139. return $this->db->update('board_post');
  140. }
  141. }