lang($this->class_path . '.label.' . $field) . ' 선택', ...lang($this->class_path . '.' . strtoupper($field)), ]; break; } return $options; } final protected function getFormFieldOptions(array $fields, array $options = []): array { foreach ($fields as $field) { if (is_array($field)) { throw new \Exception(__FUNCTION__ . "에서 field array 입니다.\n" . var_export($field, true)); } $options = $this->getFormFieldOption($field, $options); } return $options; } //전송된 데이터 protected function getFormData(string $field, array $formDatas): array { switch ($field) { default: $formDatas[$field] = $this->request->getVar($field); break; } return $formDatas; } final protected function getFormDatas(array $formDatas = []): array { foreach ($this->fields as $field) { $formDatas = $this->getFormData($field, $formDatas); } return $formDatas; } private function validateFormDatas(array $fields): void { //변경할 값 확인 : Upload된 파일 검증시 $this->request->getVar()보다 먼처 체크필요 $this->validation = service('validation'); $this->validation->setRules($this->getModel()->getFieldRules($fields)); if (!$this->validation->withRequest($this->request)->run()) { throw new \Exception("{$this->class_name}의 {$this->action} 작업 데이터 검증 오류발생\n" . implode( "\n", $this->validation->getErrors() )); } } // 생성 protected function create_validate(): void { $this->validateFormDatas($this->fields); } protected function create_form_process(): void { } final protected function create_form_procedure(): RedirectResponse|string { try { helper(['form']); $this->create_form_process(); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); $this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; return view( strtolower($this->class_path) . "/create", data: ['viewDatas' => $this->getViewDatas()] ); } catch (\Exception $e) { log_message("error", $e->getMessage()); return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/")->with(SESSION_NAMES['RETURN_MSG'], $e->getMessage()); } } protected function create_process(): void { } final protected function create_procedure(): RedirectResponse { try { //Transaction Start $this->getModel()->transStart(); $this->create_process(); return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/"); } catch (\Exception $e) { //Transaction Rollback $this->getModel()->transRollback(); log_message("error", $e->getMessage()); $this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage()); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); return redirect()->back()->withInput(); } } // 수정 protected function modify_validate(): void { $this->validateFormDatas($this->fields); } protected function modify_form_process(): void { } final protected function modify_form_procedure(): RedirectResponse|string { try { helper(['form']); $this->modify_form_process(); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); $this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; return view( strtolower($this->class_path) . "/modify", data: ['viewDatas' => $this->getViewDatas()] ); } catch (\Exception $e) { log_message("error", $e->getMessage()); return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/")->with(SESSION_NAMES['RETURN_MSG'], $e->getMessage()); } } protected function modify_process(): void { } final protected function modify_procedure(): RedirectResponse { try { //Transaction Start $this->getModel()->transStart(); $this->modify_process(); return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/"); } catch (\Exception $e) { //Transaction Rollback $this->getModel()->transRollback(); log_message("error", $e->getMessage()); $this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage()); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); return redirect()->back()->withInput(); } } // 리스트 private function list_condition_process($isTotalCount = false): void { //조건절 처리 foreach ($this->filter_fields as $field) { $this->$field = $this->request->getVar($field) ?: DEFAULTS['EMPTY']; if ($this->$field !== DEFAULTS['EMPTY']) { $this->getModel()->setList_FieldFilter($field, $this->$field); } } //검색어 처리 $this->word = $this->request->getVar('word') ?: DEFAULTS['EMPTY']; if ($this->word !== DEFAULTS['EMPTY']) { $this->getModel()->setList_WordFilter($this->word); } //검색일 처리 $this->start = $this->request->getVar('start') ?: DEFAULTS['EMPTY']; $this->end = $this->request->getVar('end') ?: DEFAULTS['EMPTY']; $this->getModel()->setList_DateFilter($this->start, $this->end); if (!$isTotalCount) { //Sorting 처리 $this->order_field = $this->request->getVar('order_field') ?: DEFAULTS['EMPTY']; $this->order_value = $this->request->getVar('order_value') ?: DEFAULTS['EMPTY']; if ($this->order_field !== DEFAULTS['EMPTY'] && $this->order_value !== DEFAULTS['EMPTY']) { $this->getModel()->setList_OrderBy("{$this->order_field} {$this->order_value}"); } } } //Totalcount 처리 private function list_total_process(): int { $this->list_condition_process(true); $total_count = $this->getModel()->countAllResults(); // echo $this->getModel()->getLastQuery(); return $total_count; } //PageNation 처리 private function list_pagination_process($pager_group = 'default', int $segment = 0, $template = 'default_full'): string { //Page, Per_page필요부분 $this->page = (int)$this->request->getVar('page') ?: 1; $this->per_page = (int)$this->request->getVar('per_page') ?: intval(getenv("mvc.default.list.per_page")); //줄수 처리용 $page_options = array("" => "줄수선택"); for ($i = $this->per_page; $i <= $this->total_count; $i += $this->per_page) { $page_options[$i] = $i; } $this->page_options = $page_options; // 1.Views/Pagers/에 bootstrap_full.php,bootstrap_simple.php 생성 // 2.app/Config/Pager.php/$templates에 'bootstrap_full => 'Pagers\bootstrap_full', // 'bootstrap_simple' => 'Pagers\bootstrap_simple', 추가 $pager = service("pager"); // $this->getModel()->paginate($this->per_page, $pager_group, $this->page, $segment); $pager->makeLinks( $this->page, $this->per_page, $this->total_count, $template, $segment, $pager_group ); $this->page = $pager->getCurrentPage($pager_group); $this->total_page = $pager->getPageCount($pager_group); return $pager->links($pager_group, $template); } private function list_entitys_process(): array { $this->list_condition_process(); if ($this->page) { $this->getModel()->limit( $this->per_page, $this->page * $this->per_page - $this->per_page ); } $entitys = $this->getModel()->findAll(); // echo $this->getModel()->getLastQuery(); return $entitys; } final protected function list_procedure(): string { try { helper(['form']); $this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; //URL처리 $this->uri = $this->request->getUri(); //total 처리 $this->total_count = $this->list_total_process(); //pagenation 처리 $this->pagination = $this->list_pagination_process(); //모델 처리 $this->entitys = $this->list_entitys_process(); //setting return_url to session flashdata $this->session->setFlashdata(SESSION_NAMES['RETURN_URL'], current_url() . '?' . $this->request->getUri()->getQuery() ?: ""); return view( strtolower($this->class_path) . "/index", ['viewDatas' => $this->getViewDatas()] ); } catch (\Exception $e) { log_message("error", $e->getMessage()); return alert_CommonHelper($e->getMessage(), "back"); // return redirect()->back()->with('return_message', $e->getMessage()); } } }