_attributes = $attributes; } final public function getAttribute(string $key): string { if (!array_key_exists($key, $this->_attributes)) { throw new RuntimeException(__METHOD__ . "에서 오류발생: {$key}에 해당하는 속성이 정의되지 않았습니다."); } return $this->_attributes[$key]; } final public function form_dropdown_common(string $field, mixed $value, array $viewDatas, array $extras = [], array $attributes = [], bool $isAll = false): string { // 필터 옵션이 없으면 빈 배열로 초기화 if (!array_key_exists($field, $viewDatas['control']['formOptions'])) { return ""; // 필터 옵션이 없으면 빈 문자열 반환 } $extra = ""; foreach ($extras as $extra_tag => $extra_value) { $extra .= sprintf(" %s=\"%s\"", $extra_tag, $extra_value); } // $formOptions는 필터 옵션 배열로, key는 필터 엔티티의 PK, value는 필터 엔티티 객체 $html = sprintf("'; return $html; } //필수함수 protected function form_dropdown_common_process(string $field, mixed $value, array $viewDatas, array $extras = [], array $attributes = [], bool $isAll = false): string { $html = ""; switch ($field) { default: foreach ($viewDatas['control']['formOptions'][$field] as $option_key => $option_value) { $isSelected = $option_key == $value ? ' selected' : ''; $isDisabled = ""; $attribute = ""; $label = ""; if ($option_value instanceof CommonEntity) { if ($option_key != $value && $option_value->getStatus() != $option_value::DEFAULT_STATUS && !$isAll) { continue; } foreach ($attributes as $attribute_name => $attribute_value) { $attribute .= sprintf(" %s=\"%s\"", $attribute_name, $option_value->$attribute_value); } $label = $option_value->getCustomTitle(); } else { $label = $option_value; } $html .= sprintf("", $option_key, $isSelected, $isDisabled, $attribute, $label); } break; } return $html; } public function getFieldLabel(string $field, string $label, array $viewDatas, array $extras = []): string { switch ($field) { default: // required가 있으면 class 추가 $extras = (strpos($viewDatas['control']['formRules'][$field], 'required') !== false) ? ["class" => "text-danger", "required" => "", ...$extras] : $extras; $label = $label ?: form_label(lang("{$this->getAttribute('class_path')}.label.{$field}"), $field, ['class' => 'form-label-sm', ...$extras]); break; } return $label; } public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string { switch ($field) { case 'email': $form = form_input($field, $value ?? "", [ "class" => "form-control", 'style' => 'width:100%;', "placeholder" => "예)test@example.com", ...$extras ]); break; case 'mobile': case 'phone': $form = form_input($field, $value ?? "", [ "class" => "form-control", 'style' => 'width:100%;', "placeholder" => "예)010-0010-0010", ...$extras ]); break; case 'role': if (!is_array($viewDatas['control']['formOptions'][$field])) { throw new \Exception(__METHOD__ . "에서 {$field}의 field_options가 array형태가 아닙니다."); } // create, modify, create_form, modify_form일때 checkbox로 표시 if (in_array($viewDatas['control']['action'], ['create_form', 'modify_form'])) { $forms = []; foreach ($viewDatas['control']['formOptions'][$field] as $key => $label) { if ($key !== '') { // 빈값은 제외 $values = is_array($value) ? $value : explode(DEFAULTS["DELIMITER_ROLE"], $value); //form_check에는 "class" => "form-control" 쓰면 않되거나 form-check를 써야함 $forms[] = form_checkbox("{$field}[]", $key, in_array($key, $values), $extras) . $label; } } $form = implode(" ", $forms); } else { $form = form_dropdown($field, $value, $viewDatas, $extras); } break; case 'issue_at': case 'expired_at': case 'billing_at': case 'start_at': case 'end_at': case 'updated_at': case 'created_at': case 'deleted_at': $extras['class'] = array_key_exists('class', $extras) ? $extras['class'] . ' calender' : 'calender'; $form = form_input($field, $value ?? "", $extras); break; case 'description': case 'content': case 'detail': case 'history': $extras['class'] = array_key_exists('class', $extras) ? $extras['class'] . ' tinymce' : 'tinymce'; $form = form_textarea($field, html_entity_decode($value ?? "", ENT_QUOTES, 'UTF-8'), [ "class" => "form-control", 'style' => 'width:100%;', ...$extras ]); break; default: if (in_array($field, $viewDatas['control']['formFilters'])) { if (str_contains($field, "_uid")) { $extras['class'] = array_key_exists('class', $extras) ? $extras['class'] . ' select-field' : 'select-field'; } $form = $this->form_dropdown_common($field, $value, $viewDatas, $extras); } else { $form = form_input($field, $value ?? "", [ "class" => "form-control", 'style' => 'width:100%;', ...$extras ]); } break; } return $form; } public function getFieldView(string $field, mixed $value, array $viewDatas, array $extras = []): string|null { switch ($field) { case 'clientinfo_uid': if (array_key_exists($value, $viewDatas['control']['formOptions'][$field])) { $value = "" . $viewDatas['control']['formOptions'][$field][$value]->getTitle() . ""; } break; case 'role': $roles = []; foreach (explode(DEFAULTS["DELIMITER_ROLE"], $value) as $key) { $roles[] = $viewDatas['control']['formOptions'][$field][$key] ?? ""; } $value = implode(" , ", $roles); break; case 'description': case 'content': case 'detail': case 'history': if (in_array($viewDatas['control']['action'], ['view', 'index'])) { $value = html_entity_decode($value, ENT_QUOTES, 'UTF-8'); } break; case 'issue_at': case 'expired_at': case 'billing_at': case 'start_at': case 'end_at': case 'updated_at': case 'created_at': case 'deleted_at': $value = $value ? date("Y-m-d", strtotime($value)) : ""; break; default: if (in_array($field, $viewDatas['control']['formFilters'])) { if (str_contains($field, "_uid")) { $value = array_key_exists($value, $viewDatas['control']['formOptions'][$field]) && $viewDatas['control']['formOptions'][$field][$value] ? $viewDatas['control']['formOptions'][$field][$value]->getTitle() : ""; } else { $value = array_key_exists($value, $viewDatas['control']['formOptions'][$field]) ? $viewDatas['control']['formOptions'][$field][$value] : ""; } } break; } if (is_array($value)) { throw new \Exception(__METHOD__ . "에서 오류: {$field}의 값이 Array형태입니다"); } return $value; } public function getListFilter(string $field, mixed $value, array $viewDatas, array $extras = []): string { switch ($field) { default: if (in_array($field, $viewDatas['control']['formFilters'])) { if (str_contains($field, "_uid")) { $extras['class'] = array_key_exists('class', $extras) ? $extras['class'] . ' select-field' : 'select-field'; } $attributes = []; $isAll = true; $filter = $this->form_dropdown_common($field, $value, $viewDatas, $extras, $attributes, $isAll); } else { $filter = array_key_exists($value, $viewDatas['control']['formOptions'][$field]) ? $viewDatas['control']['formOptions'][$field][$value] : ""; } break; } return $filter; } public function getListLabel(string $field, string $label, array $viewDatas, array $extras = []): string { switch ($field) { default: $label = $this->getFieldLabel($field, $label, $viewDatas, $extras); if (isset($viewDatas['order_field']) && $viewDatas['order_field'] == $field) { $label .= $viewDatas['order_value'] == 'ASC' ? ICONS["UP"] : ICONS["DOWN"]; } $query = $viewDatas['uri']->getQuery(['except' => ['order_field', 'order_value']]); $query .= empty($query) ? "" : "&"; $query .= "order_field={$field}&order_value="; $query .= isset($viewDatas['order_value']) && $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $label = anchor(current_url() . "?" . $query, $label); form_dropdown('per_page', $viewDatas['page_options'], $viewDatas['per_page'], ['onChange' => 'this.form.submit()']); break; } return $label; } public function getListButton(string $action, string $label, array $viewDatas, array $extras = []): string { switch ($action) { case 'create': $action = form_label( $label ? $label : '입력', $action, [ "data-src" => current_url() . '/' . $action . '?' . $viewDatas['uri']->getQuery(), "data-bs-toggle" => "modal", "data-bs-target" => "#modal_action_form", "class" => "btn btn-sm btn-primary form-label-sm", ...$extras ] ); break; case 'modify': $oldBatchJobUids = old("batchjob_uids", null); $oldBatchJobUids = is_array($oldBatchJobUids) ? $oldBatchJobUids : [$oldBatchJobUids]; $checkbox = form_checkbox([ "id" => "checkbox_uid_{$viewDatas['entity']->getPK()}", "name" => "batchjob_uids[]", "value" => $viewDatas['entity']->getPK(), "class" => "batchjobuids_checkboxs", "checked" => in_array($viewDatas['entity']->getPK(), $oldBatchJobUids) ]); $action = $checkbox . form_label( $label ? $label : '수정', $action, [ "data-src" => current_url() . '/' . $action . '/' . $viewDatas['entity']->getPK() . '?' . $viewDatas['uri']->getQuery(), "data-bs-toggle" => "modal", "data-bs-target" => "#modal_action_form", 'class' => 'form-label-sm', ...$extras ] ); break; case 'view': $action = form_label( $label ? $label : ICONS['SEARCH'], $action, [ "data-src" => current_url() . '/' . $action . '/' . $viewDatas['entity']->getPK() . '?' . $viewDatas['uri']->getQuery(), "data-bs-toggle" => "modal", "data-bs-target" => "#modal_action_form", "class" => "btn btn-sm btn-primary form-label-sm", ...$extras ] ); break; case 'delete': $action = anchor( current_url() . '/' . $action . '/' . $viewDatas['entity']->getPK(), $label ? $label : ICONS['DELETE'], [ "class" => "btn btn-sm btn-danger form-label-sm", ...$extras ] ); break; case 'batchjob': $action = form_submit("batchjob_submit", $label ? $label : '일괄처리', [ "formaction" => current_url() . '/batchjob', "class" => "btn btn-sm btn-warning form-label-sm", ...$extras, // "onclick" => "return submitBatchJob()" ]); break; case 'batchjob_delete': $action = form_submit("batchjob_submit", $label ? $label : '일괄삭제', [ "formaction" => current_url() . '/batchjob_delete', "class" => "btn btn-sm btn-danger form-label-sm", ...$extras, // "onclick" => "return submitBatchJobDelete()" ]); break; default: $action = ""; break; } return $action; } }