Files
cm-app-web/application/controllers/Board_write.php

2478 lines
87 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Board_write class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @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'] .= '<input type="text" id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input datepicker" value="' . set_value(element('field_name', $value)) . '" readonly="readonly" ' . $required . ' />';
} elseif (element('field_type', $value) === 'phone') {
$extra_content[$k]['input'] .= '<input type="text" id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input validphone" value="' . set_value(element('field_name', $value)) . '" ' . $required . ' />';
} else {
$extra_content[$k]['input'] .= '<input type="' . element('field_type', $value) . '" id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input" value="' . set_value(element('field_name', $value)) . '" ' . $required . '/>';
}
} elseif (element('field_type', $value) === 'textarea') {
$extra_content[$k]['input'] .= '<textarea id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input" ' . $required . '>' . set_value(element('field_name', $value)) . '</textarea>';
} elseif (element('field_type', $value) === 'radio') {
$extra_content[$k]['input'] .= '<div class="checkbox">';
$options = explode("\n", element('options', $value));
$i =1;
if ($options) {
foreach ($options as $okey => $oval) {
$radiovalue = $oval;
$extra_content[$k]['input'] .= '<label for="' . element('field_name', $value) . '_' . $i . '"><input type="radio" name="' . element('field_name', $value) . '" id="' . element('field_name', $value) . '_' . $i . '" value="' . $radiovalue . '" ' . set_radio(element('field_name', $value), $radiovalue) . ' /> ' . $oval . ' </label> ';
$i++;
}
}
$extra_content[$k]['input'] .= '</div>';
} elseif (element('field_type', $value) === 'checkbox') {
$extra_content[$k]['input'] .= '<div class="checkbox">';
$options = explode("\n", element('options', $value));
$i =1;
if ($options) {
foreach ($options as $okey => $oval) {
$extra_content[$k]['input'] .= '<label for="' . element('field_name', $value) . '_' . $i . '"><input type="checkbox" name="' . element('field_name', $value) . '[]" id="' . element('field_name', $value) . '_' . $i . '" value="' . $oval . '" ' . set_checkbox(element('field_name', $value), $oval) . ' /> ' . $oval . ' </label> ';
$i++;
}
}
$extra_content[$k]['input'] .= '</div>';
} elseif (element('field_type', $value) === 'select') {
$extra_content[$k]['input'] .= '<div class="input-group">';
$extra_content[$k]['input'] .= '<select name="' . element('field_name', $value) . '" class="form-control input" ' . $required . '>';
$extra_content[$k]['input'] .= '<option value="" >선택하세요</option> ';
$options = explode("\n", element('options', $value));
if ($options) {
foreach ($options as $okey => $oval) {
$extra_content[$k]['input'] .= '<option value="' . $oval . '" ' . set_select(element('field_name', $value), $oval) . ' >' . $oval . '</option> ';
}
}
$extra_content[$k]['input'] .= '</select>';
$extra_content[$k]['input'] .= '</div>';
}
$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'] = '게시글 수정을 위한 패스워드 입력페이지입니다.<br />패스워드를 입력하시면 게시글 수정이 가능합니다';
$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'] .= '<input type="text" id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input datepicker" value="' . set_value(element('field_name', $value), $item) . '" readonly="readonly" ' . $required . ' />';
} elseif (element('field_type', $value) === 'phone') {
$extra_content[$k]['input'] .= '<input type="text" id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input validphone" value="' . set_value(element('field_name', $value), $item) . '" ' . $required . ' />';
} else {
$extra_content[$k]['input'] .= '<input type="' . element('field_type', $value) . '" id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input" value="' . set_value(element('field_name', $value), $item) . '" ' . $required . ' />';
}
} elseif (element('field_type', $value) === 'textarea') {
$extra_content[$k]['input'] .= '<textarea id="' . element('field_name', $value) . '" name="' . element('field_name', $value) . '" class="form-control input" ' . $required . ' >' . set_value(element('field_name', $value), $item) . '</textarea>';
} elseif (element('field_type', $value) === 'radio') {
$extra_content[$k]['input'] .= '<div class="checkbox">';
$options = explode("\n", element('options', $value));
$i =1;
if ($options) {
foreach ($options as $okey => $oval) {
$oval = trim($oval);
$radiovalue = $oval;
$extra_content[$k]['input'] .= '<label for="' . element('field_name', $value) . '_' . $i . '"><input type="radio" name="' . element('field_name', $value) . '" id="' . element('field_name', $value) . '_' . $i . '" value="' . $radiovalue . '" ' . set_radio(element('field_name', $value), $radiovalue, ($item === $radiovalue ? true : false)) . ' /> ' . $oval . ' </label> ';
$i++;
}
}
$extra_content[$k]['input'] .= '</div>';
} elseif (element('field_type', $value) === 'checkbox') {
$extra_content[$k]['input'] .= '<div class="checkbox">';
$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'] .= '<label for="' . element('field_name', $value) . '_' . $i . '"><input type="checkbox" name="' . element('field_name', $value) . '[]" id="' . element('field_name', $value) . '_' . $i . '" value="' . $oval . '" ' . set_checkbox(element('field_name', $value), $oval, ($chkvalue === $oval ? true : false)) . ' /> ' . $oval . ' </label> ';
$i++;
}
}
$extra_content[$k]['input'] .= '</div>';
} elseif (element('field_type', $value) === 'select') {
$extra_content[$k]['input'] .= '<div class="input-group">';
$extra_content[$k]['input'] .= '<select name="' . element('field_name', $value) . '" class="form-control input" ' . $required . '>';
$extra_content[$k]['input'] .= '<option value="" >선택하세요</option> ';
$options = explode("\n", element('options', $value));
if ($options) {
foreach ($options as $okey => $oval) {
$oval = trim($oval);
$extra_content[$k]['input'] .= '<option value="' . $oval . '" ' . set_select(element('field_name', $value), $oval, ($item === $oval ? true : false)) . ' >' . $oval . '</option> ';
}
}
$extra_content[$k]['input'] .= '</select>';
$extra_content[$k]['input'] .= '</div>';
}
$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;
}
}