* * @author CIBoard (develop@ciboard.co.kr) */ /** * 게시물 작성, 수정, 답변에 관한 controller 입니다. */ class Board_write extends CB_Controller { /** * 모델을 로딩합니다 */ protected $models = array('Post', 'Post_link', 'Post_file', 'Post_extra_vars', 'Post_meta'); /** * 헬퍼를 로딩합니다 */ protected $helpers = array('form', 'array', 'dhtml_editor'); function __construct() { parent::__construct(); /** * 라이브러리를 로딩합니다 */ $this->load->library(array('querystring', 'accesslevel', 'email', 'notelib', 'point', 'imagelib')); } /** * 게시물 작성 페이지입니다 */ public function write($brd_key = '') { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_board_write_write'; $this->load->event($eventname); // 이벤트가 존재하면 실행합니다 Events::trigger('before', $eventname); if (empty($brd_key)) { show_404(); } $board_id = $this->board->item_key('brd_id', $brd_key); if (empty($board_id)) { show_404(); } $board = $this->board->item_all($board_id); $board['is_use_captcha'] = false; if( check_use_captcha($this->member, $board) ){ $board['is_use_captcha'] = true; } $alertmessage = $this->member->is_member() ? '회원님은 글을 작성할 수 있는 권한이 없습니다' : '비회원은 글을 작성할 수 있는 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오'; $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $this->accesslevel->check( element('access_write', $board), element('access_write_level', $board), element('access_write_group', $board), $alertmessage, $check ); // 이벤트가 존재하면 실행합니다 Events::trigger('after', $eventname); $this->_write_common($board); } /** * 게시물 답변 페이지입니다 */ public function reply($origin_id = 0) { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_board_write_reply'; $this->load->event($eventname); // 이벤트가 존재하면 실행합니다 Events::trigger('before', $eventname); /** * 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다 */ $origin_id = (int) $origin_id; if (empty($origin_id) OR $origin_id < 1) { show_404(); } $origin = $this->Post_model->get_one($origin_id); if ( ! element('post_id', $origin)) { show_404(); } $board = $this->board->item_all(element('brd_id', $origin)); if ( ! element('brd_id', $board)) { show_404(); } $alertmessage = $this->member->is_member() ? '회원님은 답변할 수 있는 권한이 없습니다' : '비회원은 답변할 수 있는 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오'; $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $this->accesslevel->check( element('access_reply', $board), element('access_reply_level', $board), element('access_reply_group', $board), $alertmessage, $check ); if (element('post_del', $origin)) { alert('삭제된 글에는 답변을 입력하실 수 없습니다'); return; } if (strlen(element('post_reply', $origin)) >= 10) { alert('더 이상 답변하실 수 없습니다.\\n답변은 10단계 까지만 가능합니다'); return; } $reply_len = strlen(element('post_reply', $origin)) + 1; if (element('reply_order', $board) !== 'desc') { $begin_reply_char = 'A'; $end_reply_char = 'Z'; $reply_number = +1; $this->db->select('MAX(SUBSTRING(post_reply, ' . $reply_len . ', 1)) as reply', false); $this->db->where('post_num', element('post_num', $origin)); $this->db->where('SUBSTRING(post_reply, ' . $reply_len . ', 1) <>', ''); if (element('post_id', $origin)) { $this->db->like('post_reply', element('post_reply', $origin), 'after'); } $result = $this->db->get('post'); $row = $result->row_array(); } else { $begin_reply_char = 'Z'; $end_reply_char = 'A'; $reply_number = -1; $this->db->select('MIN(SUBSTRING(post_reply, ' . $reply_len . ', 1)) as reply', false); $this->db->where('post_num', element('post_num', $origin)); $this->db->where('SUBSTRING(post_reply, ' . $reply_len . ', 1) <>', ''); if (element('post_id', $origin)) { $this->db->like('post_reply', element('post_reply', $origin), 'after'); } $result = $this->db->get('post'); $row = $result->row_array(); } if ( ! element('reply', $row)) { $reply_char = $begin_reply_char; } elseif (element('reply', $row) === $end_reply_char) { // A~Z은 26 입니다. alert('더 이상 답변하실 수 없습니다.\\n답변은 26개 까지만 가능합니다'); } else { $reply_char = chr(ord(element('reply', $row)) + $reply_number); } $reply = element('post_reply', $origin) . $reply_char; // 이벤트가 존재하면 실행합니다 Events::trigger('after', $eventname); $this->_write_common($board, $origin, $reply); } /** * 게시물 작성과 답변에 공통으로 쓰입니다 */ public function _write_common($board, $origin = '', $reply = '') { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_board_write_write_common'; $this->load->event($eventname); $param =& $this->querystring; $view = array(); $view['view'] = array(); // 이벤트가 존재하면 실행합니다 $view['view']['event']['before'] = Events::trigger('common_before', $eventname); $view['view']['post'] = array(); $view['view']['board'] = $board; $view['view']['board_key'] = element('brd_key', $board); $mem_id = (int) $this->member->item('mem_id'); $primary_key = $this->Post_model->primary_key; $view['view']['is_admin'] = $is_admin = $this->member->is_admin( array( 'board_id' => element('brd_id', $board), 'group_id' => element('bgr_id', $board), ) ); // 글 한개만 작성 가능 if (element('use_only_one_post', $board) && $is_admin === false) { if ($this->member->is_member() === false) { alert('비회원은 글을 작성할 수 있는 권한이 없습니다. 회원이사라면 로그인 후 이용해주세요'); } $mywhere = array( 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, ); $cnt = $this->Post_model->count_by($mywhere); if ($cnt) { alert('이 게시판은 한 사람이 하나의 글만 등록 가능합니다.'); } } // 글쓰기 기간제한 if (element('write_possible_days', $board) && $is_admin === false) { if ($this->member->is_member() === false) { alert('비회원은 글을 작성할 수 있는 권한이 없습니다. 회원이사라면 로그인 후 이용해주세요'); } if ((ctimestamp() - strtotime($this->member->item('mem_register_datetime'))) < element('write_possible_days', $board) * 86400 ) { alert('이 게시판은 회원가입한지 ' . element('write_possible_days', $board) . '일이 지난 회원만 게시물 작성이 가능합니다'); } } if ($this->session->userdata('lastest_post_time') && $this->cbconfig->item('new_post_second')) { if ($this->session->userdata('lastest_post_time') >= ( ctimestamp() - $this->cbconfig->item('new_post_second')) && $is_admin === false) { alert('너무 빠른 시간내에 게시물을 연속해서 올릴 수 없습니다.\\n\\n' . ($this->cbconfig->item('new_post_second') - (ctimestamp() - $this->session->userdata('lastest_post_time'))) . '초 후 글쓰기가 가능합니다'); } } if (element('use_point', $board) && $this->cbconfig->item('block_write_zeropoint') && element('point_write', $board) < 0 && ($this->member->item('mem_point') + element('point_write', $board)) < 0 ) { alert('회원님은 포인트가 부족하므로 글을 작성하실 수 없습니다. 글 작성시 ' . (element('point_write', $board) * -1) . ' 포인트가 차감됩니다'); return false; } // 이벤트가 존재하면 실행합니다 $view['view']['event']['step1'] = Events::trigger('common_step1', $eventname); $view['view']['post']['is_post_name'] = $is_post_name = ($this->member->is_member() === false) ? true : false; $view['view']['post']['post_title'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_post_default_title', $board) : element('post_default_title', $board); $view['view']['post']['post_content'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_post_default_content', $board) : element('post_default_content', $board); $view['view']['post']['can_post_notice'] = $can_post_notice = ($is_admin !== false) ? true : false; $view['view']['post']['can_post_secret'] = $can_post_secret = element('use_post_secret', $board) === '1' ? true : false; $view['view']['post']['post_secret'] = element('use_post_secret_selected', $board) ? '1' : ''; $view['view']['post']['can_post_receive_email'] = $can_post_receive_email = element('use_post_receive_email', $board) ? true : false; $extravars = element('extravars', $board); $form = json_decode($extravars, true); $use_subj_style = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_subject_style', $board) : element('use_subject_style', $board); /** * Validation 라이브러리를 가져옵니다 */ $this->load->library('form_validation'); /** * 전송된 데이터의 유효성을 체크합니다 */ $config = array( array( 'field' => 'post_title', 'label' => '제목', 'rules' => 'trim|required', ), array( 'field' => 'post_content', 'label' => '내용', 'rules' => 'trim|required', ), ); if ($form && is_array($form)) { foreach ($form as $key => $value) { if ( ! element('use', $value)) { continue; } $required = element('required', $value) ? '|required' : ''; if (element('field_type', $value) === 'checkbox') { $config[] = array( 'field' => element('field_name', $value) . '[]', 'label' => element('display_name', $value), 'rules' => 'trim' . $required, ); } else { $config[] = array( 'field' => element('field_name', $value), 'label' => element('display_name', $value), 'rules' => 'trim' . $required, ); } } } if ($is_post_name) { $config[] = array( 'field' => 'post_nickname', 'label' => '닉네임', 'rules' => 'trim|required|min_length[2]|max_length[20]|callback__mem_nickname_check', ); $config[] = array( 'field' => 'post_email', 'label' => '이메일', 'rules' => 'trim|required|valid_email|max_length[50]|callback__mem_email_check', ); $config[] = array( 'field' => 'post_homepage', 'label' => '홈페이지', 'rules' => 'prep_url|valid_url', ); } if ($this->member->is_member() === false) { $password_length = $this->cbconfig->item('password_length'); $config[] = array( 'field' => 'post_password', 'label' => '패스워드', 'rules' => 'trim|required|min_length[' . $password_length . ']|callback__mem_password_check', ); } if ( check_use_captcha($this->member, $board) ) { if ($this->cbconfig->item('use_recaptcha')) { $config[] = array( 'field' => 'g-recaptcha-response', 'label' => '자동등록방지문자', 'rules' => 'trim|required|callback__check_recaptcha', ); } else { $config[] = array( 'field' => 'captcha_key', 'label' => '자동등록방지문자', 'rules' => 'trim|required|callback__check_captcha', ); } } if ($use_subj_style) { $config[] = array( 'field' => 'post_title_color', 'label' => '제목색상', 'rules' => 'trim|exact_length[7]', ); $config[] = array( 'field' => 'post_title_font', 'label' => '제목폰트', 'rules' => 'trim', ); $config[] = array( 'field' => 'post_title_bold', 'label' => '제목볼드', 'rules' => 'trim|exact_length[1]', ); } if (element('use_category', $board) && $is_admin === false) { $config[] = array( 'field' => 'post_category', 'label' => '카테고리', 'rules' => 'trim|required', ); } $this->form_validation->set_rules($config); $form_validation = $this->form_validation->run(); $file_error = ''; $uploadfiledata = array(); if (element('use_upload_file', $board)) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $use_upload = $this->accesslevel->is_accessable( element('access_upload', $board), element('access_upload_level', $board), element('access_upload_group', $board), $check ); } else { $use_upload = false; } $view['view']['board']['use_upload'] = $use_upload; $view['view']['board']['upload_file_count'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_upload_file_num', $board) : element('upload_file_num', $board); $use_post_dhtml = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_post_dhtml', $board) : element('use_post_dhtml', $board); if ($use_post_dhtml) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $use_dhtml = $this->accesslevel->is_accessable( element('access_dhtml', $board), element('access_dhtml_level', $board), element('access_dhtml_group', $board), $check ); } else { $use_dhtml = false; } $view['view']['board']['use_dhtml'] = $use_dhtml; if ($use_subj_style) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $use_subject_style = $this->accesslevel->is_accessable( element('access_subject_style', $board), element('access_subject_style_level', $board), element('access_subject_style_group', $board), $check ); } else { $use_subject_style = false; } $view['view']['board']['use_subject_style'] = $use_subject_style; if (element('use_post_tag', $board)) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $can_tag_write = $this->accesslevel->is_accessable( element('access_tag_write', $board), element('access_tag_write_level', $board), element('access_tag_write_group', $board), $check ); } else { $can_tag_write = false; } $view['view']['board']['can_tag_write'] = $can_tag_write; $view['view']['board']['link_count'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_link_num', $board) : element('link_num', $board); $view['view']['board']['use_emoticon'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_post_emoticon', $board) : element('use_post_emoticon', $board); $view['view']['board']['use_specialchars'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_post_specialchars', $board) : element('use_post_specialchars', $board); $view['view']['board']['headercontent'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_header_content', $board) : element('header_content', $board); $view['view']['board']['footercontent'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_footer_content', $board) : element('footer_content', $board); // 이벤트가 존재하면 실행합니다 $view['view']['event']['step2'] = Events::trigger('common_step2', $eventname); if ($use_upload === true && $form_validation && element('use_upload_file', $board)) { $this->load->library('upload'); if (isset($_FILES) && isset($_FILES['post_file']) && isset($_FILES['post_file']['name']) && is_array($_FILES['post_file']['name'])) { $filecount = count($_FILES['post_file']['name']); $upload_path = config_item('uploads_dir') . '/post/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } $upload_path .= cdate('Y') . '/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } $upload_path .= cdate('m') . '/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } foreach ($_FILES['post_file']['name'] as $i => $value) { if ($value) { $uploadconfig = array(); $uploadconfig['upload_path'] = $upload_path; $uploadconfig['allowed_types'] = element('upload_file_extension', $board) ? element('upload_file_extension', $board) : '*'; $uploadconfig['max_size'] = element('upload_file_max_size', $board) * 1024; $uploadconfig['encrypt_name'] = true; $this->upload->initialize($uploadconfig); $_FILES['userfile']['name'] = $_FILES['post_file']['name'][$i]; $_FILES['userfile']['type'] = $_FILES['post_file']['type'][$i]; $_FILES['userfile']['tmp_name'] = $_FILES['post_file']['tmp_name'][$i]; $_FILES['userfile']['error'] = $_FILES['post_file']['error'][$i]; $_FILES['userfile']['size'] = $_FILES['post_file']['size'][$i]; if ($this->upload->do_upload()) { $filedata = $this->upload->data(); $uploadfiledata[$i] = array(); $uploadfiledata[$i]['pfi_filename'] = cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata); $uploadfiledata[$i]['pfi_originname'] = element('orig_name', $filedata); $uploadfiledata[$i]['pfi_filesize'] = intval(element('file_size', $filedata) * 1024); $uploadfiledata[$i]['pfi_width'] = element('image_width', $filedata) ? element('image_width', $filedata) : 0; $uploadfiledata[$i]['pfi_height'] = element('image_height', $filedata) ? element('image_height', $filedata) : 0; $uploadfiledata[$i]['pfi_type'] = str_replace('.', '', element('file_ext', $filedata)); $uploadfiledata[$i]['is_image'] = element('is_image', $filedata) ? 1 : 0; } else { $file_error = $this->upload->display_errors(); break; } } } } } /** * 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다. * 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다 */ if ($form_validation === false OR $file_error) { // 이벤트가 존재하면 실행합니다 $view['view']['event']['formrunfalse'] = Events::trigger('common_formrunfalse', $eventname); if ($file_error) { $view['view']['message'] = $file_error; } /** * primary key 정보를 저장합니다 */ $view['view']['primary_key'] = $primary_key; $extra_content = array(); $k= 0; if ($form && is_array($form)) { foreach ($form as $key => $value) { if ( ! element('use', $value)) { continue; } $required = element('required', $value) ? 'required' : ''; $extra_content[$k]['field_name'] = element('field_name', $value); $extra_content[$k]['display_name'] = element('display_name', $value); $extra_content[$k]['input'] = ''; //field_type : text, url, email, phone, textarea, radio, select, checkbox, date if (element('field_type', $value) === 'text' OR element('field_type', $value) === 'url' OR element('field_type', $value) === 'email' OR element('field_type', $value) === 'phone' OR element('field_type', $value) === 'date') { if (element('field_type', $value) === 'date') { $extra_content[$k]['input'] .= ''; } elseif (element('field_type', $value) === 'phone') { $extra_content[$k]['input'] .= ''; } else { $extra_content[$k]['input'] .= ''; } } elseif (element('field_type', $value) === 'textarea') { $extra_content[$k]['input'] .= ''; } elseif (element('field_type', $value) === 'radio') { $extra_content[$k]['input'] .= '
'; $options = explode("\n", element('options', $value)); $i =1; if ($options) { foreach ($options as $okey => $oval) { $radiovalue = $oval; $extra_content[$k]['input'] .= ' '; $i++; } } $extra_content[$k]['input'] .= '
'; } elseif (element('field_type', $value) === 'checkbox') { $extra_content[$k]['input'] .= '
'; $options = explode("\n", element('options', $value)); $i =1; if ($options) { foreach ($options as $okey => $oval) { $extra_content[$k]['input'] .= ' '; $i++; } } $extra_content[$k]['input'] .= '
'; } elseif (element('field_type', $value) === 'select') { $extra_content[$k]['input'] .= '
'; $extra_content[$k]['input'] .= ''; $extra_content[$k]['input'] .= '
'; } $k++; } } $view['view']['extra_content'] = $extra_content; if (element('use_category', $board)) { $this->load->model('Board_category_model'); $view['view']['category'] = $this->Board_category_model ->get_all_category(element('brd_id', $board)); } $view['view']['has_tempsave'] = false; if ($this->member->is_member() && element('use_tempsave', $board)) { $this->load->model('Tempsave_model'); $twhere = array( 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, ); $tempsave = $this->Tempsave_model ->get_one('', '', $twhere); if (element('tmp_id', $tempsave)) { $view['view']['has_tempsave'] = true; } } // 이벤트가 존재하면 실행합니다 $view['view']['event']['before_layout'] = Events::trigger('common_before_layout', $eventname); /** * 레이아웃을 정의합니다 */ $page_title = $this->cbconfig->item('site_meta_title_board_write'); $meta_description = $this->cbconfig->item('site_meta_description_board_write'); $meta_keywords = $this->cbconfig->item('site_meta_keywords_board_write'); $meta_author = $this->cbconfig->item('site_meta_author_board_write'); $page_name = $this->cbconfig->item('site_page_name_board_write'); $searchconfig = array( '{게시판명}', '{게시판아이디}', ); $replaceconfig = array( element('board_name', $board), element('brd_key', $board), ); $page_title = str_replace($searchconfig, $replaceconfig, $page_title); $meta_description = str_replace($searchconfig, $replaceconfig, $meta_description); $meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords); $meta_author = str_replace($searchconfig, $replaceconfig, $meta_author); $page_name = str_replace($searchconfig, $replaceconfig, $page_name); $layout_dir = element('board_layout', $board) ? element('board_layout', $board) : $this->cbconfig->item('layout_board'); $mobile_layout_dir = element('board_mobile_layout', $board) ? element('board_mobile_layout', $board) : $this->cbconfig->item('mobile_layout_board'); $use_sidebar = element('board_sidebar', $board) ? element('board_sidebar', $board) : $this->cbconfig->item('sidebar_board'); $use_mobile_sidebar = element('board_mobile_sidebar', $board) ? element('board_mobile_sidebar', $board) : $this->cbconfig->item('mobile_sidebar_board'); $skin_dir = element('board_skin', $board) ? element('board_skin', $board) : $this->cbconfig->item('skin_board'); $mobile_skin_dir = element('board_mobile_skin', $board) ? element('board_mobile_skin', $board) : $this->cbconfig->item('mobile_skin_board'); $layoutconfig = array( 'path' => 'board', 'layout' => 'layout', 'skin' => 'write', 'layout_dir' => $layout_dir, 'mobile_layout_dir' => $mobile_layout_dir, 'use_sidebar' => $use_sidebar, 'use_mobile_sidebar' => $use_mobile_sidebar, 'skin_dir' => $skin_dir, 'mobile_skin_dir' => $mobile_skin_dir, 'page_title' => $page_title, 'meta_description' => $meta_description, 'meta_keywords' => $meta_keywords, 'meta_author' => $meta_author, 'page_name' => $page_name, ); $view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type()); $this->data = $view; $this->layout = element('layout_skin_file', element('layout', $view)); $this->view = element('view_skin_file', element('layout', $view)); } else { /** * 유효성 검사를 통과한 경우입니다. * 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다 */ // 이벤트가 존재하면 실행합니다 $view['view']['event']['formruntrue'] = Events::trigger('common_formruntrue', $eventname); $content_type = $use_dhtml ? 1 : 0; if ($origin) { $post_num = element('post_num', $origin); $post_reply = $reply; } else { $post_num = $this->Post_model->next_post_num(); $post_reply = ''; } $metadata = array(); $post_title = $this->input->post('post_title', null, ''); $post_content = $this->input->post('post_content', null, ''); if (element('save_external_image', $board)) { $post_content = $this->imagelib->replace_external_image($post_content); } $updatedata = array( 'post_num' => $post_num, 'post_reply' => $post_reply, 'post_title' => $post_title, 'post_content' => $post_content, 'post_html' => $content_type, 'post_datetime' => cdate('Y-m-d H:i:s'), 'post_updated_datetime' => cdate('Y-m-d H:i:s'), 'post_ip' => $this->input->ip_address(), 'brd_id' => element('brd_id', $board), ); if ($mem_id) { if (element('use_anonymous', $board)) { $updatedata['mem_id'] = (-1) * $mem_id; $updatedata['post_userid'] = ''; $updatedata['post_username'] = '익명사용자'; $updatedata['post_nickname'] = '익명사용자'; $updatedata['post_email'] = ''; $updatedata['post_homepage'] = ''; } else { $updatedata['mem_id'] = $mem_id; $updatedata['post_userid'] = $this->member->item('mem_userid'); $updatedata['post_username'] = $this->member->item('mem_username'); $updatedata['post_nickname'] = $this->member->item('mem_nickname'); $updatedata['post_email'] = $this->member->item('mem_email'); $updatedata['post_homepage'] = $this->member->item('mem_homepage'); } } if ($is_post_name) { $updatedata['post_nickname'] = $this->input->post('post_nickname', null, ''); $updatedata['post_email'] = $this->input->post('post_email', null, ''); $updatedata['post_homepage'] = $this->input->post('post_homepage', null, ''); } if ($this->member->is_member() === false && $this->input->post('post_password')) { if ( ! function_exists('password_hash')) { $this->load->helper('password'); } $updatedata['post_password'] = password_hash($this->input->post('post_password'), PASSWORD_BCRYPT); } if ($can_post_notice) { $updatedata['post_notice'] = $this->input->post('post_notice', null, 0); } if ($can_post_secret) { $updatedata['post_secret'] = $this->input->post('post_secret') ? 1 : 0; } if (element('use_post_secret', $board) === '2') { $updatedata['post_secret'] = 1; } if ($can_post_receive_email) { $updatedata['post_receive_email'] = $this->input->post('post_receive_email') ? 1 : 0; } if ($use_subject_style) { $metadata['post_title_color'] = $this->input->post('post_title_color', null, ''); $metadata['post_title_font'] = $this->input->post('post_title_font', null, ''); $metadata['post_title_bold'] = $this->input->post('post_title_bold', null, ''); } if (element('use_category', $board)) { $updatedata['post_category'] = $this->input->post('post_category', null, ''); } $updatedata['post_device'] = ($this->cbconfig->get_device_type() === 'mobile') ? 'mobile' : 'desktop'; $post_id = $this->Post_model->insert($updatedata); if ($can_post_secret && $this->input->post('post_secret')) { $this->session->set_userdata( 'view_secret_' . $post_id, '1' ); } if ($mem_id > 0 && element('use_point', $board)) { $point = $this->point->insert_point( $mem_id, element('point_write', $board), element('board_name', $board) . ' ' . $post_id . ' 게시글 작성', 'post', $post_id, '게시글 작성' ); } $extradata = array(); if ($form && is_array($form)) { foreach ($form as $key => $value) { if ( ! element('use', $value)) { continue; } if (element('func', $value) === 'basic') { continue; } $extradata[element('field_name', $value)] = $this->input->post(element('field_name', $value), null, ''); } $this->Post_extra_vars_model ->save($post_id, element('brd_id', $board), $extradata); } if ($reply && $origin && $this->cbconfig->item('use_notification') && $this->cbconfig->item('notification_reply')) { $this->load->library('notificationlib'); $not_message = $updatedata['post_nickname'] . '님께서 [' . element('post_title', $origin) . '] 에 답변을 남기셨습니다'; $not_url = post_url(element('brd_key', $board), $post_id); $this->notificationlib->set_noti( element('mem_id', $origin), $mem_id, 'reply', $post_id, $not_message, $not_url ); } if (isset($metadata) && $metadata) { $this->Post_meta_model ->save($post_id, element('brd_id', $board), $metadata); } if (element('use_posthistory', $board)) { $this->load->model('Post_history_model'); $historydata = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, 'phi_title' => $post_title, 'phi_content' => $post_content, 'phi_content_html_type' => $content_type, 'phi_ip' => $this->input->ip_address(), 'phi_datetime' => cdate('Y-m-d H:i:s'), ); $this->Post_history_model->insert($historydata); } $post_link = $this->input->post('post_link'); if ($post_link && is_array($post_link) && count($post_link) > 0) { foreach ($post_link as $pkey => $pval) { if ($pval) { $linkupdate = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'pln_url' => prep_url($pval), ); $this->Post_link_model->insert($linkupdate); } } $postupdate = array( 'post_link_count' => count($post_link), ); $this->Post_model->update($post_id, $postupdate); } if ($this->member->is_member() && element('use_tempsave', $board)) { $this->load->model('Tempsave_model'); $tempwhere = array( 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, ); $this->Tempsave_model->delete_where($tempwhere); } $file_updated = false; if ($use_upload && $uploadfiledata && is_array($uploadfiledata) && count($uploadfiledata) > 0) { foreach ($uploadfiledata as $pkey => $pval) { if ($pval) { $fileupdate = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, 'pfi_originname' => element('pfi_originname', $pval), 'pfi_filename' => element('pfi_filename', $pval), 'pfi_filesize' => element('pfi_filesize', $pval), 'pfi_width' => element('pfi_width', $pval), 'pfi_height' => element('pfi_height', $pval), 'pfi_type' => element('pfi_type', $pval), 'pfi_is_image' => element('is_image', $pval), 'pfi_datetime' => cdate('Y-m-d H:i:s'), 'pfi_ip' => $this->input->ip_address(), ); $file_id = $this->Post_file_model->insert($fileupdate); if ( ! element('is_image', $pval)) { if (element('use_point', $board)) { $point = $this->point->insert_point( $mem_id, element('point_fileupload', $board), element('board_name', $board) . ' ' . $post_id . ' 파일 업로드', 'fileupload', $file_id, '파일 업로드' ); } } $file_updated = true; } } } $result = $this->Post_file_model->get_post_file_count($post_id); $postupdatedata = array(); if ($result && is_array($result)) { foreach ($result as $value) { if (element('pfi_is_image', $value)) { $postupdatedata['post_image'] = element('cnt', $value); } else { $postupdatedata['post_file'] = element('cnt', $value); } } $this->Post_model->update($post_id, $postupdatedata); } if (element('use_post_tag', $board) && $can_tag_write) { $this->load->model('Post_tag_model'); $deletewhere = array( 'post_id' => $post_id, ); $this->Post_tag_model->delete_where($deletewhere); if ($this->input->post('post_tag')) { $tags = explode(',', $this->input->post('post_tag')); if ($tags && is_array($tags)) { foreach ($tags as $key => $value) { $value = trim($value); if ($value) { $tagdata = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'pta_tag' => $value, ); $this->Post_tag_model->insert($tagdata); } } } } } $emailsendlistadmin = array(); $notesendlistadmin = array(); $smssendlistadmin = array(); $emailsendlistpostwriter = array(); $notesendlistpostwriter = array(); $smssendlistpostwriter = array(); if (element('send_email_post_super_admin', $board) OR element('send_note_post_super_admin', $board) OR element('send_sms_post_super_admin', $board)) { $mselect = 'mem_id, mem_email, mem_nickname, mem_phone'; $superadminlist = $this->Member_model->get_superadmin_list($mselect); } if (element('send_email_post_group_admin', $board) OR element('send_note_post_group_admin', $board) OR element('send_sms_post_group_admin', $board)) { $this->load->model('Board_group_admin_model'); $groupadminlist = $this->Board_group_admin_model ->get_board_group_admin_member(element('bgr_id', $board)); } if (element('send_email_post_board_admin', $board) OR element('send_note_post_board_admin', $board) OR element('send_sms_post_board_admin', $board)) { $this->load->model('Board_admin_model'); $boardadminlist = $this->Board_admin_model ->get_board_admin_member(element('brd_id', $board)); } if (element('send_email_post_super_admin', $board) && $superadminlist) { foreach ($superadminlist as $key => $value) { $emailsendlistadmin[$value['mem_id']] = $value; } } if (element('send_email_post_group_admin', $board) && $groupadminlist) { foreach ($groupadminlist as $key => $value) { $emailsendlistadmin[$value['mem_id']] = $value; } } if (element('send_email_post_board_admin', $board) && $boardadminlist) { foreach ($boardadminlist as $key => $value) { $emailsendlistadmin[$value['mem_id']] = $value; } } if (element('send_email_post_writer', $board) && $this->member->item('mem_receive_email')) { $emailsendlistpostwriter['mem_email'] = $updatedata['post_email']; } if (element('send_note_post_super_admin', $board) && $superadminlist) { foreach ($superadminlist as $key => $value) { $notesendlistadmin[$value['mem_id']] = $value; } } if (element('send_note_post_group_admin', $board) && $groupadminlist) { foreach ($groupadminlist as $key => $value) { $notesendlistadmin[$value['mem_id']] = $value; } } if (element('send_note_post_board_admin', $board) && $boardadminlist) { foreach ($boardadminlist as $key => $value) { $notesendlistadmin[$value['mem_id']] = $value; } } if (element('send_note_post_writer', $board) && $this->member->item('mem_use_note')) { $notesendlistpostwriter['mem_id'] = $mem_id; } if (element('send_sms_post_super_admin', $board) && $superadminlist) { foreach ($superadminlist as $key => $value) { $smssendlistadmin[$value['mem_id']] = $value; } } if (element('send_sms_post_group_admin', $board) && $groupadminlist) { foreach ($groupadminlist as $key => $value) { $smssendlistadmin[$value['mem_id']] = $value; } } if (element('send_sms_post_board_admin', $board) && $boardadminlist) { foreach ($boardadminlist as $key => $value) { $smssendlistadmin[$value['mem_id']] = $value; } } if (element('send_sms_post_writer', $board) && $this->member->item('mem_phone') && $this->member->item('mem_receive_sms')) { $smssendlistpostwriter['mem_id'] = $mem_id; $smssendlistpostwriter['mem_nickname'] = $this->member->item('mem_nickname'); $smssendlistpostwriter['mem_phone'] = $this->member->item('mem_phone'); } $searchconfig = array( '{홈페이지명}', '{회사명}', '{홈페이지주소}', '{게시글제목}', '{게시글내용}', '{게시글작성자닉네임}', '{게시글작성자아이디}', '{게시글작성시간}', '{게시글주소}', '{게시판명}', '{게시판주소}', ); $autolink = element('use_auto_url', $board) ? true : false; $popup = element('content_target_blank', $board) ? true : false; $replaceconfig = array( $this->cbconfig->item('site_title'), $this->cbconfig->item('company_name'), site_url(), $post_title, display_html_content($post_content, $content_type, element('post_image_width', $board), $autolink, $popup), $updatedata['post_nickname'], $updatedata['post_userid'], cdate('Y-m-d H:i:s'), post_url(element('brd_key', $board), $post_id), element('brd_name', $board), board_url(element('brd_key', $board)), ); $replaceconfig_escape = array( html_escape($this->cbconfig->item('site_title')), html_escape($this->cbconfig->item('company_name')), site_url(), html_escape($post_title), display_html_content($post_content, $content_type, element('post_image_width', $board), $autolink, $popup), html_escape($updatedata['post_nickname']), $updatedata['post_userid'], cdate('Y-m-d H:i:s'), post_url(element('brd_key', $board), $post_id), html_escape(element('brd_name', $board)), board_url(element('brd_key', $board)), ); if ($emailsendlistadmin) { $title = str_replace( $searchconfig, $replaceconfig, $this->cbconfig->item('send_email_post_admin_title') ); $content = str_replace( $searchconfig, $replaceconfig_escape, $this->cbconfig->item('send_email_post_admin_content') ); foreach ($emailsendlistadmin as $akey => $aval) { $this->email->clear(true); $this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name')); $this->email->to(element('mem_email', $aval)); $this->email->subject($title); $this->email->message($content); $this->email->send(); } } if ($emailsendlistpostwriter) { $title = str_replace( $searchconfig, $replaceconfig, $this->cbconfig->item('send_email_post_writer_title') ); $content = str_replace( $searchconfig, $replaceconfig_escape, $this->cbconfig->item('send_email_post_writer_content') ); $this->email->clear(true); $this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name')); $this->email->to(element('mem_email', $emailsendlistpostwriter)); $this->email->subject($title); $this->email->message($content); $this->email->send(); } if ($notesendlistadmin) { $title = str_replace( $searchconfig, $replaceconfig, $this->cbconfig->item('send_note_post_admin_title') ); $content = str_replace( $searchconfig, $replaceconfig_escape, $this->cbconfig->item('send_note_post_admin_content') ); foreach ($notesendlistadmin as $akey => $aval) { $note_result = $this->notelib->send_note( $sender = 0, $receiver = element('mem_id', $aval), $title, $content, 1 ); } } if ($notesendlistpostwriter && element('mem_id', $notesendlistpostwriter)) { $title = str_replace( $searchconfig, $replaceconfig, $this->cbconfig->item('send_note_post_writer_title') ); $content = str_replace( $searchconfig, $replaceconfig_escape, $this->cbconfig->item('send_note_post_writer_content') ); $note_result = $this->notelib->send_note( $sender = 0, $receiver = element('mem_id', $notesendlistpostwriter), $title, $content, 1 ); } if ($smssendlistadmin) { if (file_exists(APPPATH . 'libraries/Smslib.php')) { $this->load->library(array('smslib')); $content = str_replace( $searchconfig, $replaceconfig, $this->cbconfig->item('send_sms_post_admin_content') ); $sender = array( 'phone' => $this->cbconfig->item('sms_admin_phone'), ); $receiver = array(); foreach ($smssendlistadmin as $akey => $aval) { $receiver[] = array( 'mem_id' => element('mem_id', $aval), 'name' => element('mem_nickname', $aval), 'phone' => element('mem_phone', $aval), ); } $smsresult = $this->smslib->send($receiver, $sender, $content, $date = '', '게시글 작성 알림'); } } if ($smssendlistpostwriter) { if (file_exists(APPPATH . 'libraries/Smslib.php')) { $this->load->library(array('smslib')); $content = str_replace( $searchconfig, $replaceconfig, $this->cbconfig->item('send_sms_post_writer_content') ); $sender = array( 'phone' => $this->cbconfig->item('sms_admin_phone'), ); $receiver = array(); $receiver[] = $smssendlistpostwriter; $smsresult = $this->smslib->send($receiver, $sender, $content, $date = '', '게시글 작성 알림'); } } if ( ! element('post_secret', $updatedata)) { // 네이버 신디케이션 보내기 $this->_naver_syndi($post_id, $board, '입력'); // 네이버 블로그 자동글쓰기 if ($is_admin !== false && $this->cbconfig->item('use_naver_blog_post') && element('use_naver_blog_post', $board)) { $this->load->helper('naver_blog_post'); naver_blog_post($post_title, display_html_content($post_content, $content_type, element('post_image_width', $board), $autolink, $popup), $board); } } $this->session->set_flashdata( 'message', '게시물이 정상적으로 입력되었습니다' ); $this->session->set_userdata( 'lastest_post_time', ctimestamp() ); // 이벤트가 존재하면 실행합니다 Events::trigger('common_after', $eventname); /** * 게시물의 신규입력 또는 수정작업이 끝난 후 뷰 페이지로 이동합니다 */ $redirecturl = post_url(element('brd_key', $board), $post_id); redirect($redirecturl); } } /** * 게시물 수정 페이지입니다 */ public function modify($post_id = 0) { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_board_write_modify'; $this->load->event($eventname); $view = array(); $view['view'] = array(); // 이벤트가 존재하면 실행합니다 $view['view']['event']['before'] = Events::trigger('before', $eventname); /** * 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다 */ $post_id = (int) $post_id; if (empty($post_id) OR $post_id < 1) { show_404(); } /** * 수정 페이지일 경우 기존 데이터를 가져옵니다 */ $post = $this->Post_model->get_one($post_id); if ( ! element('post_id', $post)) { show_404(); } if (element('post_del', $post)) { alert('삭제된 글은 수정하실 수 없습니다'); return false; } $post['extravars'] = $this->Post_extra_vars_model->get_all_meta($post_id); $post['meta'] = $this->Post_meta_model->get_all_meta($post_id); $post['post_content'] = html_purifier($post['post_content']); $view['view']['post'] = $post; $board = $this->board->item_all(element('brd_id', $post)); if ( ! element('brd_id', $board)) { show_404(); } $view['view']['board'] = $board; $view['view']['board_key'] = element('brd_key', $board); $mem_id = (int) $this->member->item('mem_id'); $postwhere = array( 'post_id' => $post_id, ); $view['view']['link'] = $link = $this->Post_link_model ->get('', '', $postwhere, '', '', 'pln_id', 'ASC'); $view['view']['file'] = $file = $this->Post_file_model ->get('', '', $postwhere, '', '', 'pfi_id', 'ASC'); if ($file && is_array($file)) { foreach ($file as $key => $value) { $view['view']['file'][$key]['download_link'] = site_url('postact/download/' . element('pfi_id', $value)); } } $view['view']['is_admin'] = $is_admin = $this->member->is_admin( array( 'board_id' => element('brd_id', $board), 'group_id' => element('bgr_id', $board), ) ); if (element('protect_post_day', $board) > 0 && $is_admin === false) { if (ctimestamp() - strtotime(element('post_datetime', $post)) >= element('protect_post_day', $board) * 86400) { alert('이 게시판은 ' . element('protect_post_day', $board) . '일 이상된 게시글의 수정을 금지합니다'); return false; } } if (element('protect_comment_num', $board) > 0 && $is_admin === false) { if (element('protect_comment_num', $board) <= element('post_comment_count', $post)) { alert(element('protect_comment_num', $board) . '개 이상의 댓글이 달린 게시글은 수정할 수 없습니다'); return false; } } if (element('mem_id', $post)) { if ($is_admin === false && $mem_id !== abs(element('mem_id', $post))) { alert('회원님은 이 글을 수정할 권한이 없습니다'); return false; } } else { if ($is_admin !== false) { $this->session->set_userdata( 'can_modify_' . element('post_id', $post), '1' ); } if ( ! $this->session->userdata('can_modify_' . element('post_id', $post)) && $this->input->post('modify_password')) { if ( ! function_exists('password_hash')) { $this->load->helper('password'); } if ( password_verify($this->input->post('modify_password'), element('post_password', $post))) { $this->session->set_userdata( 'can_modify_' . element('post_id', $post), '1' ); redirect(current_url()); } else { $view['view']['message'] = '패스워드가 잘못 입력되었습니다'; } } if ( ! $this->session->userdata('can_modify_' . element('post_id', $post))) { // 이벤트가 존재하면 실행합니다 $view['view']['event']['before_password_layout'] = Events::trigger('before_password_layout', $eventname); /** * 레이아웃을 정의합니다 */ $view['view']['info'] = '게시글 수정을 위한 패스워드 입력페이지입니다.
패스워드를 입력하시면 게시글 수정이 가능합니다'; $page_title = element('board_name', $board) . ' 글수정'; $layout_dir = element('board_layout', $board) ? element('board_layout', $board) : $this->cbconfig->item('layout_board'); $mobile_layout_dir = element('board_mobile_layout', $board) ? element('board_mobile_layout', $board) : $this->cbconfig->item('mobile_layout_board'); $use_sidebar = element('board_sidebar', $board) ? element('board_sidebar', $board) : $this->cbconfig->item('sidebar_board'); $use_mobile_sidebar = element('board_mobile_sidebar', $board) ? element('board_mobile_sidebar', $board) : $this->cbconfig->item('mobile_sidebar_board'); $skin_dir = element('board_skin', $board) ? element('board_skin', $board) : $this->cbconfig->item('skin_board'); $mobile_skin_dir = element('board_mobile_skin', $board) ? element('board_mobile_skin', $board) : $this->cbconfig->item('mobile_skin_board'); $layoutconfig = array( 'path' => 'board', 'layout' => 'layout', 'skin' => 'password', 'layout_dir' => $layout_dir, 'mobile_layout_dir' => $mobile_layout_dir, 'use_sidebar' => $use_sidebar, 'use_mobile_sidebar' => $use_mobile_sidebar, 'skin_dir' => $skin_dir, 'mobile_skin_dir' => $mobile_skin_dir, 'page_title' => $page_title, ); $view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type()); $this->data = $view; $this->layout = element('layout_skin_file', element('layout', $view)); $this->view = element('view_skin_file', element('layout', $view)); return true; } } if (element('use_upload_file', $board)) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $use_upload = $this->accesslevel->is_accessable( element('access_upload', $board), element('access_upload_level', $board), element('access_upload_group', $board), $check ); } else { $use_upload = false; } $view['view']['board']['use_upload'] = $use_upload; $view['view']['board']['upload_file_count'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_upload_file_num', $board) : element('upload_file_num', $board); $use_post_dhtml = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_post_dhtml', $board) : element('use_post_dhtml', $board); if ($use_post_dhtml) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $use_dhtml = $this->accesslevel->is_accessable( element('access_dhtml', $board), element('access_dhtml_level', $board), element('access_dhtml_group', $board), $check ); } else { $use_dhtml = false; } $view['view']['board']['use_dhtml'] = $use_dhtml; $use_subj_style = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_subject_style', $board) : element('use_subject_style', $board); if ($use_subj_style) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $use_subject_style = $this->accesslevel->is_accessable( element('access_subject_style', $board), element('access_subject_style_level', $board), element('access_subject_style_group', $board), $check ); } else { $use_subject_style = false; } $view['view']['board']['use_subject_style'] = $use_subject_style; if (element('use_post_tag', $board)) { $check = array( 'group_id' => element('bgr_id', $board), 'board_id' => element('brd_id', $board), ); $can_tag_write = $this->accesslevel->is_accessable( element('access_tag_write', $board), element('access_tag_write_level', $board), element('access_tag_write_group', $board), $check ); } else { $can_tag_write = false; } $view['view']['board']['can_tag_write'] = $can_tag_write; $view['view']['board']['link_count'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_link_num', $board) : element('link_num', $board); $view['view']['board']['use_emoticon'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_post_emoticon', $board) : element('use_post_emoticon', $board); $view['view']['board']['use_specialchars'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('use_mobile_post_specialchars', $board) : element('use_post_specialchars', $board); $extravars = element('extravars', $board); $form = json_decode($extravars, true); $view['view']['board']['headercontent'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_header_content', $board) : element('header_content', $board); $view['view']['board']['footercontent'] = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('mobile_footer_content', $board) : element('footer_content', $board); $view['view']['post']['is_post_name'] = $is_post_name = ($this->member->is_member() === false OR ($is_admin !== false && $mem_id !== abs(element('mem_id', $post)))) ? true : false; $view['view']['post']['can_post_notice'] = $can_post_notice = ($is_admin !== false) ? true : false; $view['view']['post']['can_post_secret'] = $can_post_secret = element('use_post_secret', $board) === '1' ? true : false; $view['view']['post']['can_post_receive_email'] = $can_post_receive_email = element('use_post_receive_email', $board) ? true : false; $primary_key = $this->Post_model->primary_key; // 이벤트가 존재하면 실행합니다 $view['view']['event']['step1'] = Events::trigger('step1', $eventname); /** * Validation 라이브러리를 가져옵니다 */ $this->load->library('form_validation'); /** * 전송된 데이터의 유효성을 체크합니다 */ $config = array( array( 'field' => 'post_id', 'label' => 'POSTID', 'rules' => 'trim|required|numeric', ), array( 'field' => 'post_title', 'label' => '제목', 'rules' => 'trim|required', ), array( 'field' => 'post_content', 'label' => '내용', 'rules' => 'trim|required', ), ); if ($form && is_array($form)) { foreach ($form as $key => $value) { if ( ! element('use', $value)) { continue; } $required = element('required', $value) ? '|required' : ''; if (element('field_type', $value) === 'checkbox') { $config[] = array( 'field' => element('field_name', $value) . '[]', 'label' => element('display_name', $value), 'rules' => 'trim' . $required, ); } else { $config[] = array( 'field' => element('field_name', $value), 'label' => element('display_name', $value), 'rules' => 'trim' . $required, ); } } } if ($is_post_name) { $config[] = array( 'field' => 'post_nickname', 'label' => '닉네임', 'rules' => 'trim|required|min_length[2]|max_length[20]|callback__mem_nickname_check', ); $config[] = array( 'field' => 'post_email', 'label' => '이메일', 'rules' => 'trim|valid_email|max_length[50]|callback__mem_email_check', ); $config[] = array( 'field' => 'post_homepage', 'label' => '홈페이지', 'rules' => 'prep_url|valid_url', ); } if ($this->member->is_member() === false) { $password_length = $this->cbconfig->item('password_length'); $config[] = array( 'field' => 'post_password', 'label' => '패스워드', 'rules' => 'trim|required|min_length[' . $password_length . ']|callback__mem_password_check', ); if ($this->cbconfig->item('use_recaptcha')) { $config[] = array( 'field' => 'g-recaptcha-response', 'label' => '자동등록방지문자', 'rules' => 'trim|required|callback__check_recaptcha', ); } else { $config[] = array( 'field' => 'captcha_key', 'label' => '자동등록방지문자', 'rules' => 'trim|required|callback__check_captcha', ); } } if ($use_subject_style) { $config[] = array( 'field' => 'post_title_color', 'label' => '제목색상', 'rules' => 'trim|exact_length[7]', ); $config[] = array( 'field' => 'post_title_font', 'label' => '제목폰트', 'rules' => 'trim', ); $config[] = array( 'field' => 'post_title_bold', 'label' => '제목볼드', 'rules' => 'trim|exact_length[1]', ); } if (element('use_category', $board) && $is_admin === false) { $config[] = array( 'field' => 'post_category', 'label' => '카테고리', 'rules' => 'trim|required', ); } $this->form_validation->set_rules($config); $form_validation = $this->form_validation->run(); $file_error = ''; $uploadfiledata = array(); $uploadfiledata2 = array(); if ($use_upload === true && $form_validation && element('use_upload_file', $board)) { $this->load->library('upload'); if (isset($_FILES) && isset($_FILES['post_file']) && isset($_FILES['post_file']['name']) && is_array($_FILES['post_file']['name'])) { $filecount = count($_FILES['post_file']['name']); $upload_path = config_item('uploads_dir') . '/post/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } $upload_path .= cdate('Y') . '/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } $upload_path .= cdate('m') . '/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } foreach ($_FILES['post_file']['name'] as $i => $value) { if ($value) { $uploadconfig = array(); $uploadconfig['upload_path'] = $upload_path; $uploadconfig['allowed_types'] = element('upload_file_extension', $board) ? element('upload_file_extension', $board) : '*'; $uploadconfig['max_size'] = element('upload_file_max_size', $board) * 1024; $uploadconfig['encrypt_name'] = true; $this->upload->initialize($uploadconfig); $_FILES['userfile']['name'] = $_FILES['post_file']['name'][$i]; $_FILES['userfile']['type'] = $_FILES['post_file']['type'][$i]; $_FILES['userfile']['tmp_name'] = $_FILES['post_file']['tmp_name'][$i]; $_FILES['userfile']['error'] = $_FILES['post_file']['error'][$i]; $_FILES['userfile']['size'] = $_FILES['post_file']['size'][$i]; if ($this->upload->do_upload()) { $filedata = $this->upload->data(); $uploadfiledata[$i] = array(); $uploadfiledata[$i]['pfi_filename'] = cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata); $uploadfiledata[$i]['pfi_originname'] = element('orig_name', $filedata); $uploadfiledata[$i]['pfi_filesize'] = intval(element('file_size', $filedata) * 1024); $uploadfiledata[$i]['pfi_width'] = element('image_width', $filedata) ? element('image_width', $filedata) : 0; $uploadfiledata[$i]['pfi_height'] = element('image_height', $filedata) ? element('image_height', $filedata) : 0; $uploadfiledata[$i]['pfi_type'] = str_replace('.', '', element('file_ext', $filedata)); $uploadfiledata[$i]['is_image'] = element('is_image', $filedata) ? element('is_image', $filedata) : 0; } else { $file_error = $this->upload->display_errors(); break; } } } } if (isset($_FILES) && isset($_FILES['post_file_update']) && isset($_FILES['post_file_update']['name']) && is_array($_FILES['post_file_update']['name']) && $file_error === '') { $filecount = count($_FILES['post_file_update']['name']); $upload_path = config_item('uploads_dir') . '/post/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } $upload_path .= cdate('Y') . '/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } $upload_path .= cdate('m') . '/'; if (is_dir($upload_path) === false) { mkdir($upload_path, 0707); $file = $upload_path . 'index.php'; $f = @fopen($file, 'w'); @fwrite($f, ''); @fclose($f); @chmod($file, 0644); } foreach ($_FILES['post_file_update']['name'] as $i => $value) { if ($value) { $uploadconfig = array(); $uploadconfig['upload_path'] = $upload_path; $uploadconfig['allowed_types'] = element('upload_file_extension', $board) ? element('upload_file_extension', $board) : '*'; $uploadconfig['max_size'] = element('upload_file_max_size', $board) * 1024; $uploadconfig['encrypt_name'] = true; $this->upload->initialize($uploadconfig); $_FILES['userfile']['name'] = $_FILES['post_file_update']['name'][$i]; $_FILES['userfile']['type'] = $_FILES['post_file_update']['type'][$i]; $_FILES['userfile']['tmp_name'] = $_FILES['post_file_update']['tmp_name'][$i]; $_FILES['userfile']['error'] = $_FILES['post_file_update']['error'][$i]; $_FILES['userfile']['size'] = $_FILES['post_file_update']['size'][$i]; if ($this->upload->do_upload()) { $filedata = $this->upload->data(); $oldpostfile = $this->Post_file_model->get_one($i); if ((int) element('post_id', $oldpostfile) !== (int) element('post_id', $post)) { alert('잘못된 접근입니다'); } @unlink(config_item('uploads_dir') . '/post/' . element('pfi_filename', $oldpostfile)); $uploadfiledata2[$i] = array(); $uploadfiledata2[$i]['pfi_id'] = $i; $uploadfiledata2[$i]['pfi_filename'] = cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata); $uploadfiledata2[$i]['pfi_originname'] = element('orig_name', $filedata); $uploadfiledata2[$i]['pfi_filesize'] = intval(element('file_size', $filedata) * 1024); $uploadfiledata2[$i]['pfi_width'] = element('image_width', $filedata) ? element('image_width', $filedata) : 0; $uploadfiledata2[$i]['pfi_height'] = element('image_height', $filedata) ? element('image_height', $filedata) : 0; $uploadfiledata2[$i]['pfi_type'] = str_replace('.', '', element('file_ext', $filedata)); $uploadfiledata2[$i]['is_image'] = element('is_image', $filedata) ? element('is_image', $filedata) : 0; } else { $file_error = $this->upload->display_errors(); break; } } } } } /** * 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다. * 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다 */ if ($form_validation === false OR $file_error) { // 이벤트가 존재하면 실행합니다 $view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname); /** * primary key 정보를 저장합니다 */ $view['view']['primary_key'] = $primary_key; if ($file_error) { $view['view']['message'] = $file_error; } if (element('use_post_tag', $board) && $can_tag_write) { $this->load->model('Post_tag_model'); $view['view']['post']['post_tag'] = ''; $postwhere = array( 'post_id' => $post_id, ); $tag = $this->Post_tag_model->get('', '', $postwhere, '', '', 'pta_id', 'ASC'); if ($tag && is_array($tag)) { foreach ($tag as $key => $value) { if (element('pta_tag', $value)) { $view['view']['post']['post_tag'] .= trim(element('pta_tag', $value)) . ','; } } } } $extra_content = ''; $k = 0; if ($form && is_array($form)) { foreach ($form as $key => $value) { if ( ! element('use', $value)) { continue; } $required = element('required', $value) ? 'required' : ''; $item = element(element('field_name', $value), element('extravars', $post)); $extra_content[$k]['field_name'] = element('field_name', $value); $extra_content[$k]['display_name'] = element('display_name', $value); $extra_content[$k]['input'] = ''; //field_type : text, url, email, phone, textarea, radio, select, checkbox, date if (element('field_type', $value) === 'text' OR element('field_type', $value) === 'url' OR element('field_type', $value) === 'email' OR element('field_type', $value) === 'phone' OR element('field_type', $value) === 'date') { if (element('field_type', $value) === 'date') { $extra_content[$k]['input'] .= ''; } elseif (element('field_type', $value) === 'phone') { $extra_content[$k]['input'] .= ''; } else { $extra_content[$k]['input'] .= ''; } } elseif (element('field_type', $value) === 'textarea') { $extra_content[$k]['input'] .= ''; } elseif (element('field_type', $value) === 'radio') { $extra_content[$k]['input'] .= '
'; $options = explode("\n", element('options', $value)); $i =1; if ($options) { foreach ($options as $okey => $oval) { $oval = trim($oval); $radiovalue = $oval; $extra_content[$k]['input'] .= ' '; $i++; } } $extra_content[$k]['input'] .= '
'; } elseif (element('field_type', $value) === 'checkbox') { $extra_content[$k]['input'] .= '
'; $options = explode("\n", element('options', $value)); $item = json_decode($item, true); $i =1; if ($options) { foreach ($options as $okey => $oval) { $oval = trim($oval); $chkvalue = is_array($item) && in_array($oval, $item) ? $oval : ''; $extra_content[$k]['input'] .= ' '; $i++; } } $extra_content[$k]['input'] .= '
'; } elseif (element('field_type', $value) === 'select') { $extra_content[$k]['input'] .= '
'; $extra_content[$k]['input'] .= ''; $extra_content[$k]['input'] .= '
'; } $k++; } } $view['view']['extra_content'] = $extra_content; if (element('use_category', $board)) { $this->load->model('Board_category_model'); $view['view']['category'] = $this->Board_category_model ->get_all_category(element('brd_id', $board)); } // 이벤트가 존재하면 실행합니다 $view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname); /** * 레이아웃을 정의합니다 */ $page_title = $this->cbconfig->item('site_meta_title_board_modify'); $meta_description = $this->cbconfig->item('site_meta_description_board_modify'); $meta_keywords = $this->cbconfig->item('site_meta_keywords_board_modify'); $meta_author = $this->cbconfig->item('site_meta_author_board_modify'); $page_name = $this->cbconfig->item('site_page_name_board_modify'); $searchconfig = array( '{게시판명}', '{게시판아이디}', '{글제목}', '{작성자명}', ); $replaceconfig = array( element('board_name', $board), element('brd_key', $board), element('post_title', $post), element('post_nickname', $post), ); $page_title = str_replace($searchconfig, $replaceconfig, $page_title); $meta_description = str_replace($searchconfig, $replaceconfig, $meta_description); $meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords); $meta_author = str_replace($searchconfig, $replaceconfig, $meta_author); $page_name = str_replace($searchconfig, $replaceconfig, $page_name); $layout_dir = element('board_layout', $board) ? element('board_layout', $board) : $this->cbconfig->item('layout_board'); $mobile_layout_dir = element('board_mobile_layout', $board) ? element('board_mobile_layout', $board) : $this->cbconfig->item('mobile_layout_board'); $use_sidebar = element('board_sidebar', $board) ? element('board_sidebar', $board) : $this->cbconfig->item('sidebar_board'); $use_mobile_sidebar = element('board_mobile_sidebar', $board) ? element('board_mobile_sidebar', $board) : $this->cbconfig->item('mobile_sidebar_board'); $skin_dir = element('board_skin', $board) ? element('board_skin', $board) : $this->cbconfig->item('skin_board'); $mobile_skin_dir = element('board_mobile_skin', $board) ? element('board_mobile_skin', $board) : $this->cbconfig->item('mobile_skin_board'); $layoutconfig = array( 'path' => 'board', 'layout' => 'layout', 'skin' => 'write', 'layout_dir' => $layout_dir, 'mobile_layout_dir' => $mobile_layout_dir, 'use_sidebar' => $use_sidebar, 'use_mobile_sidebar' => $use_mobile_sidebar, 'skin_dir' => $skin_dir, 'mobile_skin_dir' => $mobile_skin_dir, 'page_title' => $page_title, 'meta_description' => $meta_description, 'meta_keywords' => $meta_keywords, 'meta_author' => $meta_author, 'page_name' => $page_name, ); $view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type()); $this->data = $view; $this->layout = element('layout_skin_file', element('layout', $view)); $this->view = element('view_skin_file', element('layout', $view)); } else { /** * 유효성 검사를 통과한 경우입니다. * 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다 */ if( $this->input->post($primary_key) != $post_id ){ // $_POST['post_id'] 값과 $_GET['post_id'] 값이 틀린 경우입니다. } // 이벤트가 존재하면 실행합니다 $view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname); $content_type = $use_dhtml ? 1 : 0; $post_title = $this->input->post('post_title', null, ''); $post_content = $this->input->post('post_content', null, ''); if (element('save_external_image', $board)) { $post_content = $this->imagelib->replace_external_image($post_content); } $metadata = array(); $updatedata = array( 'post_title' => $post_title, 'post_content' => $post_content, 'post_html' => $content_type, 'post_updated_datetime' => cdate('Y-m-d H:i:s'), 'post_update_mem_id' => $mem_id, ); if ($is_post_name) { $updatedata['post_nickname'] = $this->input->post('post_nickname', null, ''); $updatedata['post_email'] = $this->input->post('post_email', null, ''); $updatedata['post_homepage'] = $this->input->post('post_homepage', null, ''); } if ($this->member->is_member() === false) { if ($this->input->post('post_password')) { if ( ! function_exists('password_hash')) { $this->load->helper('password'); } $updatedata['post_password'] = password_hash($this->input->post('post_password'), PASSWORD_BCRYPT); } } if ($can_post_notice) { $updatedata['post_notice'] = $this->input->post('post_notice', null, 0); } if ($can_post_secret) { $updatedata['post_secret'] = $this->input->post('post_secret') ? 1 : 0; } if (element('use_post_secret', $board) === '2') { $updatedata['post_secret'] = 1; } if ($can_post_receive_email) { $updatedata['post_receive_email'] = $this->input->post('post_receive_email') ? 1 : 0; } if ($use_subject_style) { $metadata['post_title_color'] = $this->input->post('post_title_color', null, ''); $metadata['post_title_font'] = $this->input->post('post_title_font', null, ''); $metadata['post_title_bold'] = $this->input->post('post_title_bold', null, ''); } if (element('use_category', $board)) { $updatedata['post_category'] = $this->input->post('post_category', null, ''); } $extradata = array(); if ($form && is_array($form)) { foreach ($form as $key => $value) { if ( ! element('use', $value)) { continue; } if (element('func', $value) === 'basic') { continue; } $extradata[element('field_name', $value)] = $this->input->post(element('field_name', $value), null, ''); } $this->Post_extra_vars_model->save($post_id, element('brd_id', $board), $extradata); } if (isset($metadata) && $metadata) { $this->Post_meta_model ->save($post_id, element('brd_id', $board), $metadata); } if (element('use_posthistory', $board)) { $this->load->model('Post_history_model'); $historydata = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, 'phi_title' => $post_title, 'phi_content' => $post_content, 'phi_content_html_type' => $content_type, 'phi_ip' => $this->input->ip_address(), 'phi_datetime' => cdate('Y-m-d H:i:s'), ); $this->Post_history_model->insert($historydata); } $post_link_update = $this->input->post('post_link_update'); $link_count = 0; if ($post_link_update && is_array($post_link_update) && count($post_link_update) > 0) { foreach ($post_link_update as $pkey => $pval) { if ($pval) { $linkupdate = array( 'pln_url' => prep_url($pval), ); $this->Post_link_model->update($pkey, $linkupdate); $link_count++; } else { $this->Post_link_model->delete($pkey); } } } $post_link = $this->input->post('post_link'); if ($post_link && is_array($post_link) && count($post_link) > 0) { foreach ($post_link as $pkey => $pval) { if ($pval) { $linkupdate = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'pln_url' => prep_url($pval), ); $this->Post_link_model->insert($linkupdate); $link_count++; } } } $updatedata['post_link_count'] = $link_count; $file_updated = false; $file_changed = false; if ($use_upload && $uploadfiledata && is_array($uploadfiledata) && count($uploadfiledata) > 0) { foreach ($uploadfiledata as $pkey => $pval) { if ($pval) { $fileupdate = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'mem_id' => $mem_id, 'pfi_originname' => element('pfi_originname', $pval), 'pfi_filename' => element('pfi_filename', $pval), 'pfi_filesize' => element('pfi_filesize', $pval), 'pfi_width' => element('pfi_width', $pval), 'pfi_height' => element('pfi_height', $pval), 'pfi_type' => element('pfi_type', $pval), 'pfi_is_image' => element('is_image', $pval), 'pfi_datetime' => cdate('Y-m-d H:i:s'), 'pfi_ip' => $this->input->ip_address(), ); $file_id = $this->Post_file_model->insert($fileupdate); if ( ! element('is_image', $pval)) { if (element('use_point', $board)) { $point = $this->point->insert_point( $mem_id, element('point_fileupload', $board), element('board_name', $board) . ' ' . $post_id . ' 파일 업로드', 'fileupload', $file_id, '파일 업로드' ); } } $file_updated = true; } } $file_changed = true; } if ($use_upload && $uploadfiledata2 && is_array($uploadfiledata2) && count($uploadfiledata2) > 0) { foreach ($uploadfiledata2 as $pkey => $pval) { if ($pval) { $fileupdate = array( 'mem_id' => $mem_id, 'pfi_originname' => element('pfi_originname', $pval), 'pfi_filename' => element('pfi_filename', $pval), 'pfi_filesize' => element('pfi_filesize', $pval), 'pfi_width' => element('pfi_width', $pval), 'pfi_height' => element('pfi_height', $pval), 'pfi_type' => element('pfi_type', $pval), 'pfi_is_image' => element('is_image', $pval), 'pfi_datetime' => cdate('Y-m-d H:i:s'), 'pfi_ip' => $this->input->ip_address(), ); $this->Post_file_model->update($pkey, $fileupdate); if ( ! element('is_image', $pval)) { if (element('use_point', $board)) { $point = $this->point->insert_point( $mem_id, element('point_fileupload', $board), element('board_name', $board) . ' ' . $post_id . ' 파일 업로드', 'fileupload', $pkey, '파일 업로드' ); } } else { $this->point->delete_point( $mem_id, 'fileupload', $pkey, '파일 업로드' ); } $file_changed = true; } } } if ($use_upload && $this->input->post('post_file_del')) { foreach ($this->input->post('post_file_del') as $key => $val) { if ($val === '1' && ! isset($uploadfiledata2[$key])) { $oldpostfile = $this->Post_file_model->get_one($key); if ( ! element('post_id', $oldpostfile) OR (int) element('post_id', $oldpostfile) !== (int) element('post_id', $post)) { alert('잘못된 접근입니다.'); } @unlink(config_item('uploads_dir') . '/post/' . element('pfi_filename', $oldpostfile)); $this->Post_file_model->delete($key); $this->point->delete_point( $mem_id, 'fileupload', $key, '파일 업로드' ); $file_changed = true; } } } $updatedata['post_image'] = 0; $updatedata['post_file'] = 0; $result = $this->Post_file_model->get_post_file_count($post_id); if ($result && is_array($result)) { $total_cnt = 0; foreach ($result as $value) { if (element('pfi_is_image', $value)) { $updatedata['post_image'] = element('cnt', $value); $total_cnt += element('cnt', $value); } else { $updatedata['post_file'] = element('cnt', $value); $total_cnt += element('cnt', $value); } } } if (element('use_post_tag', $board) && $can_tag_write) { $this->load->model('Post_tag_model'); $deletewhere = array( 'post_id' => $post_id, ); $this->Post_tag_model->delete_where($deletewhere); if ($this->input->post('post_tag')) { $tags = explode(',', $this->input->post('post_tag')); if ($tags && is_array($tags)) { foreach ($tags as $key => $value) { $value = trim($value); if ($value) { $tagdata = array( 'post_id' => $post_id, 'brd_id' => element('brd_id', $board), 'pta_tag' => $value, ); $this->Post_tag_model->insert($tagdata); } } } } } // 이벤트가 존재하면 실행합니다 Events::trigger('before_post_update', $eventname); $this->Post_model->update($post_id, $updatedata); // 네이버 신디케이션 보내기 if ( ! element('post_secret', $updatedata)) { $this->_naver_syndi($post_id, $board, '수정'); } // 이벤트가 존재하면 실행합니다 Events::trigger('after', $eventname); $this->session->set_flashdata( 'message', '게시물이 정상적으로 수정되었습니다' ); /** * 게시물의 신규입력 또는 수정작업이 끝난 후 뷰 페이지로 이동합니다 */ $param =& $this->querystring; $redirecturl = post_url(element('brd_key', $board), $post_id) . '?' . $param->output(); redirect($redirecturl); } } /** * 게시물 작성시 비회원이 작성한 경우 닉네임체크합니다 */ public function _mem_nickname_check($str) { $this->load->helper('chkstring'); if (chkstring($str, _HANGUL_ + _ALPHABETIC_ + _NUMERIC_) === false) { $this->form_validation->set_message( '_mem_nickname_check', '닉네임은 공백없이 한글, 영문, 숫자만 입력 가능합니다' ); return false; } if (preg_match("/[\,]?{$str}/i", $this->cbconfig->item('denied_nickname_list'))) { $this->form_validation->set_message( '_mem_nickname_check', $str . ' 은(는) 예약어로 사용하실 수 없는 닉네임입니다' ); return false; } return true; } /** * 게시물 작성시 비회원이 작성한 경우 이메일체크합니다 */ public function _mem_email_check($str) { list($emailid, $emaildomain) = explode('@', $str); $denied_list = explode(',', $this->cbconfig->item('denied_email_list')); $emaildomain = trim($emaildomain); $denied_list = array_map('trim', $denied_list); if (in_array($emaildomain, $denied_list)) { $this->form_validation->set_message( '_mem_email_check', $emaildomain . ' 은(는) 사용하실 수 없는 이메일입니다' ); return false; } return true; } /** * 게시물 작성시 비회원이 작성한 경우 또는 게시판에서 캡챠를 사용시 captcha체크합니다 */ public function _check_captcha($str) { $captcha = $this->session->userdata('captcha'); if ( ! is_array($captcha) OR ! element('word', $captcha) OR strtolower(element('word', $captcha)) !== strtolower($str)) { $this->session->unset_userdata('captcha'); $this->form_validation->set_message( '_check_captcha', '자동등록방지코드가 잘못되었습니다' ); return false; } return true; } /** * 회원가입시 recaptcha 체크하는 함수입니다 */ public function _check_recaptcha($str) { $url = 'https://www.google.com/recaptcha/api/siteverify'; $data = array( 'secret' => $this->cbconfig->item('recaptcha_secret'), 'response' => $str, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, sizeof($data)); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); $obj = json_decode($result); if ((string) $obj->success !== '1') { $this->form_validation->set_message( '_check_recaptcha', '자동등록방지코드가 잘못되었습니다' ); return false; } return true; } /** * 패스워드가 환경설정에 정한 글자수를 채웠는지를 체크합니다 */ public function _mem_password_check($str) { $uppercase = $this->cbconfig->item('password_uppercase_length'); $number = $this->cbconfig->item('password_numbers_length'); $specialchar = $this->cbconfig->item('password_specialchars_length'); $this->load->helper('chkstring'); $str_uc = count_uppercase($str); $str_num = count_numbers($str); $str_spc = count_specialchars($str); if ($str_uc < $uppercase OR $str_num < $number OR $str_spc < $specialchar) { $description = '비밀번호는 '; if ($str_uc < $uppercase) { $description .= ' ' . $uppercase . '개 이상의 대문자'; } if ($str_num < $number) { $description .= ' ' . $number . '개 이상의 숫자'; } if ($str_spc < $specialchar) { $description .= ' ' . $specialchar . '개 이상의 특수문자'; } $description .= '를 포함해야 합니다'; $this->form_validation->set_message( '_mem_password_check', $description ); return false; } return true; } /** * 네이버 신디케이션 전송 관련 함수입니다 */ public function _naver_syndi($post_id, $board, $status='') { if ( ! $this->cbconfig->item('naver_syndi_key')) { return; } // curl library 가 지원되어야 합니다. if ( ! function_exists('curl_init')) { return; } // 이 게시판은 신디케이션 기능을 사용하지 않습니다 if ( ! element('use_naver_syndi', $board)) { return; } // 비회원이 읽기가 가능한 게시판만 신디케이션을 지원합니다 if (element('access_view', $board)) { return; } // 1:1 게시판은 신디케이션을 지원하지 않습니다 if (element('use_personal', $board)) { return; } $httpheader = 'Authorization: Bearer ' . $this->cbconfig->item('naver_syndi_key'); $ping_url = urlencode(site_url('postact/naversyndi/' . $post_id)); $client_opt = array( CURLOPT_URL => 'https://apis.naver.com/crawl/nsyndi/v2', CURLOPT_POST => true, CURLOPT_POSTFIELDS => 'ping_url=' . $ping_url, CURLOPT_RETURNTRANSFER => true, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 10, CURLOPT_HTTPHEADER => array('Host: apis.naver.com', 'Pragma: no-cache', 'Accept: */*', $httpheader) ); $ch = curl_init(); curl_setopt_array($ch, $client_opt); $exec = curl_exec($ch); curl_close($ch); if ($this->cbconfig->item('use_naver_syndi_log')) { $this->load->library('simplexml'); //use the method to parse the data from xml $xmlData = $this->simplexml->xml_parse($exec); $mem_id = (int) $this->member->item('mem_id'); $logdata = array( 'post_id' => $post_id, 'mem_id' => $mem_id, 'pns_status' => $status, 'pns_return_code' => element('error_code', $xmlData, ''), 'pns_return_message' => element('message', $xmlData, ''), 'pns_receipt_number' => element('receipt_number', $xmlData, ''), 'pns_datetime' => cdate('Y-m-d H:i:s'), ); $this->load->model('Post_naver_syndi_log_model'); $this->Post_naver_syndi_log_model->insert($logdata); } return $exec; } }