* * @author CIBoard (develop@ciboard.co.kr) */ /** * 관리자>환경설정>스케쥴러 관리 controller 입니다. */ class Scheduler extends CB_Controller { /** * 관리자 페이지 상의 현재 디렉토리입니다 * 페이지 이동시 필요한 정보입니다 */ public $pagedir = 'config/scheduler'; /** * 모델을 로딩합니다 */ protected $models = array('Config'); /** * 이 컨트롤러의 메인 모델 이름입니다 */ protected $modelname = 'Config_model'; /** * 헬퍼를 로딩합니다 */ protected $helpers = array('form', 'array'); function __construct() { parent::__construct(); } /** * 스케쥴러 관리 페이지입니다 */ public function index() { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_admin_config_scheduler_index'; $this->load->event($eventname); $view = array(); $view['view'] = array(); // 이벤트가 존재하면 실행합니다 $view['view']['event']['before'] = Events::trigger('before', $eventname); /** * Validation 라이브러리를 가져옵니다 */ $this->load->library('form_validation'); /** * 전송된 데이터의 유효성을 체크합니다 */ $config = array( array( 'field' => 's', 'label' => '스케쥴러', 'rules' => 'trim', ), ); $this->form_validation->set_rules($config); /** * 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다. * 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다 */ if ($this->form_validation->run() === false) { // 이벤트가 존재하면 실행합니다 $view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname); } else { /** * 유효성 검사를 통과한 경우입니다. * 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다 */ // 이벤트가 존재하면 실행합니다 $view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname); $updatedata = $this->input->post(); if ( ! isset($updatedata['library_name']) OR ! is_array($updatedata['library_name'])) { $savedata = array( 'scheduler' => '', ); $this->Config_model->save($savedata); $view['view']['alert_message'] = '정상적으로 저장되었습니다'; } else { $array_count_values = array_count_values($updatedata['library_name']); $fail = false; if ($fail === false) { foreach ($array_count_values as $akey => $aval) { if ($aval > 1) { $view['view']['warning_message'] = $akey . ' 값이 ' . $aval . ' 회 중복 입력되었습니다. 라이브러리명이 중복되지 않게 입력해주세요'; $fail = true; break; } } } if ($fail === false) { foreach (element('library_name', $updatedata) as $fkey => $fval) { if (empty($fval)) { $view['view']['warning_message'] = '비어있는 라이브러리명이 있습니다. 라이브러리 값을 빠뜨리지 말고 입력해주세요'; $fail = true; break; } } } if ($fail === false) { $order = 0; $update = array(); $alldata = $this->Config_model->get_all_meta(); $origindata = json_decode(element('scheduler', $alldata), true); foreach (element('key', $updatedata) as $key => $value) { if ($value) { $update[$value] = array( 'library_name' => element($order, element('library_name', $updatedata)), 'interval_field_name' => element($value, element('interval_field_name', $updatedata)), 'lasttime' => element('lasttime', element(element($order, element('library_name', $updatedata)), $origindata)), ); } else { $update[$updatedata['library_name'][$order]] = array( 'library_name' => element($order, element('library_name', $updatedata)), 'interval_field_name' => element($key, element('interval_field_name', $updatedata)), ); } $order++; } $savedata = array( 'scheduler' => json_encode($update), ); $this->Config_model->save($savedata); $view['view']['alert_message'] = '정상적으로 저장되었습니다'; } } } $getdata = $this->Config_model->get_all_meta(); $getdata['result'] = json_decode(element('scheduler', $getdata), true); $getdata['scheduler_interval'] = json_decode(element('scheduler_interval', $getdata), true); if ( ! element('scheduler_interval', $getdata) ) { alert('스케쥴 주기명을 먼저 생성하신 후에 스케쥴러 등록이 가능합니다. 스케쥴 주기명 생성 페이지로 이동합니다', admin_url($this->pagedir . '/interval')); } if ($getdata['result'] && is_array($getdata['result'])) { foreach ($getdata['result'] as $key => $value) { $getdata['result'][$key]['class_exists'] = ''; if (file_exists(APPPATH . 'libraries/Scheduler/' . $key . '.php')) { $this->load->library('Scheduler/' . $key); if (class_exists($key)) { $getdata['result'][$key]['class_exists'] = '1'; } } $getdata['result'][$key]['lastexecutetime'] = element('lasttime', $value) ? cdate("Y-m-d H:i:s", element('lasttime', $value)) : '-'; $getdata['result'][$key]['nextexecutetime'] = '-'; if ( element('lasttime', $value) && ($scheduler_interval = element('scheduler_interval', $getdata)) && ($field_name = element(element('interval_field_name', $value), $scheduler_interval)) && element('interval', $field_name) ) { $nexttime = element('lasttime', $value) + element('interval', $field_name); $getdata['result'][$key]['nextexecutetime'] = $nexttime ? cdate("Y-m-d H:i:s", $nexttime) : '-'; } } } $view['view']['data'] = $getdata; // 이벤트가 존재하면 실행합니다 $view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname); /** * 어드민 레이아웃을 정의합니다 */ $layoutconfig = array('layout' => 'layout', 'skin' => 'index'); $view['layout'] = $this->managelayout->admin($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)); } /** * 스케쥴러 주기 관리 페이지입니다 */ public function interval() { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_admin_config_scheduler_interval'; $this->load->event($eventname); $view = array(); $view['view'] = array(); // 이벤트가 존재하면 실행합니다 $view['view']['event']['before'] = Events::trigger('before', $eventname); /** * Validation 라이브러리를 가져옵니다 */ $this->load->library('form_validation'); /** * 전송된 데이터의 유효성을 체크합니다 */ $config = array( array( 'field' => 's', 'label' => '스케쥴러', 'rules' => 'trim', ), ); $this->form_validation->set_rules($config); /** * 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다. * 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다 */ if ($this->form_validation->run() === false) { // 이벤트가 존재하면 실행합니다 $view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname); } else { /** * 유효성 검사를 통과한 경우입니다. * 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다 */ // 이벤트가 존재하면 실행합니다 $view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname); $updatedata = $this->input->post(); if ( ! isset($updatedata['field_name']) OR ! is_array($updatedata['field_name'])) { $savedata = array( 'scheduler_interval' => '', ); $this->Config_model->save($savedata); $view['view']['alert_message'] = '정상적으로 저장되었습니다'; } else { $array_count_values = array_count_values($updatedata['field_name']); $fail = false; if ($fail === false) { foreach ($array_count_values as $akey => $aval) { if ($aval > 1) { $view['view']['warning_message'] = $akey . ' 값이 ' . $aval . ' 회 중복 입력되었습니다. ID 값이 중복되지 않게 입력해주세요'; $fail = true; break; } } } if ($fail === false) { foreach (element('field_name', $updatedata) as $fkey => $fval) { if (empty($fval)) { $view['view']['warning_message'] = '비어있는 ID 값이 있습니다. ID 값을 빠뜨리지 말고 입력해주세요'; $fail = true; break; } } } if ($fail === false) { foreach (element('display_name', $updatedata) as $fkey => $fval) { if (empty($fval)) { $view['view']['warning_message'] = '비어있는 주기명이 있습니다. 입력항목제목 값을 빠뜨리지 말고 입력해주세요'; $fail = true; break; } } } if ($fail === false) { $order = 0; $update = array(); foreach (element('key', $updatedata) as $key => $value) { if ($value) { $update[$value] = array( 'field_name' => element($order, element('field_name', $updatedata)), 'interval' => element($order, element('interval', $updatedata)), 'display_name' => element($order, element('display_name', $updatedata)), ); } else { $update[$updatedata['field_name'][$order]] = array( 'field_name' => element($order, element('field_name', $updatedata)), 'interval' => element($order, element('interval', $updatedata)), 'display_name' => element($order, element('display_name', $updatedata)), ); } $order++; } $savedata = array( 'scheduler_interval' => json_encode($update), ); $this->Config_model->save($savedata); $view['view']['alert_message'] = '정상적으로 저장되었습니다'; } } } $getdata = $this->Config_model->get_all_meta(); $getdata['scheduler'] = json_decode(element('scheduler', $getdata), true); $getdata['result'] = json_decode(element('scheduler_interval', $getdata), true); if ($getdata['scheduler'] && is_array($getdata['scheduler'])) { foreach ($getdata['scheduler'] as $key => $value) { if ( ! isset($getdata['result'][element('interval_field_name', $value)]['registered_scheduler'])) { $getdata['result'][element('interval_field_name', $value)]['registered_scheduler'] = 0; } $getdata['result'][element('interval_field_name', $value)]['registered_scheduler']++; } } $view['view']['data'] = $getdata; // 이벤트가 존재하면 실행합니다 $view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname); /** * 어드민 레이아웃을 정의합니다 */ $layoutconfig = array('layout' => 'layout', 'skin' => 'interval'); $view['layout'] = $this->managelayout->admin($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)); } /** * 스케쥴러 실행 페이지입니다 */ public function execute($libraryname) { // 이벤트 라이브러리를 로딩합니다 $eventname = 'event_admin_config_scheduler_execute'; $this->load->event($eventname); // 이벤트가 존재하면 실행합니다 Events::trigger('before', $eventname); if (file_exists(APPPATH . 'libraries/Scheduler/' . $libraryname . '.php')) { $this->load->library('Scheduler/' . $libraryname); $s = new $libraryname(); if (method_exists($s, 'scheduler')) { $s->scheduler(); $scheduler_data = $this->cbconfig->item('scheduler'); $scheduler_array = json_decode($scheduler_data, true); $interval_data = $this->cbconfig->item('scheduler_interval'); $interval_array = json_decode($interval_data, true); $scheduler_array[$libraryname]['lasttime'] = ctimestamp(); $savedata['scheduler'] = json_encode($scheduler_array); $this->load->model('Config_model'); $this->Config_model->save($savedata); exit(json_encode(array('success' => 'ok', 'message' => $libraryname . ' 라이브러리가 실행되었습니다.'))); } else { exit(json_encode(array('success' => 'fail', 'message' => $libraryname . ' 클래스 안에 scheduler 메소드가 존재하지 않습니다.'))); } } else { exit(json_encode(array('success' => 'fail', 'message' => $libraryname . ' 라이브러리가 존재하지 않습니다.'))); } } }