_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 setFormFields(array $fields): void { foreach ($fields as $field) { $this->_formFields[$field] = $this->getFormFieldLabel($field); } } //$fields 매치된것만 반환, []->전체 final public function getFormFields(array $fields = []): array { // 1. $fields 배열이 비어있는지 확인합니다. // getFormFields('create') 와 같이 호출될 경우 $fields는 빈 배열[]이 됩니다. if (empty($fields)) { // 비어있다면, _formFields 전체를 반환합니다. return $this->_formFields; } // $fields의 값(원하는 필드명)을 키로 변환합니다. // 예: ['test1'] -> ['test1' => 0] $fieldsAsKeys = array_flip($fields); // _formFields와 $fieldsAsKeys 간의 키를 비교하여 교집합을 반환합니다. // 즉, $fields에 지정된 필드 정의만 추출됩니다. return array_intersect_key($this->_formFields, $fieldsAsKeys); } final public function setFormRules(string $action, array $fields): void { foreach ($fields as $field) { $this->_formRules[$field] = $this->getFormRule($action, $field); } } //$fields 매치된것만 반환, []->전체 final public function getFormRules(array $fields = []): array { if (empty($fields)) { return $this->_formRules; } $fieldsAsKeys = array_flip($fields); return array_intersect_key($this->_formRules, $fieldsAsKeys); } final public function setFormOptions(array $fields): void { foreach ($fields as $field) { $this->_formOptions[$field] = $this->getFormOption($field); } // dd($this->_formOptions[$field]); } //$fields 매치된것만 반환, []->전체 final public function getFormOptions(array $fields = []): array { if (empty($fields)) { return $this->_formOptions; } $fieldsAsKeys = array_flip($fields); return array_intersect_key($this->_formOptions, $fieldsAsKeys); } final public function setFormFilters(array $fields): void { $this->_formFilters = $fields; } final public function getFormFilters(): array { return $this->_formFilters; } final public function setBatchjobFilters(array $fields): void { $this->_batchjobFilters = $fields;; } final public function getBatchjobFilters(): array { return $this->_batchjobFilters; } final public function getBatchjobButtons(array $buttions = [ 'batchjob' => '일괄 처리', 'batchjob_delete' => '일괄 삭제', ]): array { return $buttions; } //Validation용 public function validate(array $formDatas): bool { $validation = service('validation'); $dynamicRules = []; foreach ($this->getFormRules() as $field => $rule) { //field별 추가 커스텀 룰 적용 list($field, $rule) = $this->getValidationRule($field, $rule); $dynamicRules[$field] = $rule; } $validation->setRules($dynamicRules); return $validation->run($formDatas); } //필수함수 //사용자정의 함수 protected function getValidationRule(string $field, string $rule): array { return array($field, $rule); } public function getFormFieldLabel(string $field, ?string $label = null): string { switch ($field) { default: $label = $label ?? lang("{$this->getAttribute('class_path')}.label.{$field}"); break; } return $label; } public function getFormRule(string $action, string $field): string { switch ($field) { case $this->getAttribute('pk_field'): if (!$this->$this->getAttribute('useAutoIncrement')) { $rule = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; $rule .= in_array($action, ["create"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; } else { $rule = "required|numeric"; } break; case $this->getAttribute('title_field'): $rule = "required|trim|string"; break; case "code": // a-zA-Z → 영문 대소문자,0-9 → 숫자,가-힣 → 한글 완성형,\- → 하이픈 $rule = "required|regex_match[/^[a-zA-Z0-9가-힣\-]+$/]|min_length[4]|max_length[20]"; $rule .= in_array($action, ["create"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; break; case 'picture': $rule = "is_image[{$field}]|mime_in[{$field},image/jpg,image/jpeg,image/gif,image/png,image/webp]|max_size[{$field},300]|max_dims[{$field},2048,768]"; break; case "updated_at": case "created_at": case "deleted_at": $rule = "permit_empty|trim|valid_date"; break; default: $rule = "permit_empty|trim|string"; break; } return $rule; } public function getFormOption(string $field, array $options = ['options' => [], 'extras' => [], 'atttributes' => []]): array { $tempOptions = ['' => lang("{$this->getAttribute('class_path')}.label.{$field}") . " 선택"]; switch ($field) { case 'user_uid': foreach (service('userservice')->getEntities() as $entity) { $tempOptions[$entity->getPK()] = $entity->getTitle(); // $options['attributes'][$entity->getPK()] = ['data-role' => implode(DEFAULTS['DELIMITER_ROLE'], $entity->getRole())]; } $options['options'] = $tempOptions; break; case 'clientinfo_uid': foreach (service('clientervice')->getEntities() as $entity) { $tempOptions[$entity->getPK()] = $entity->getTitle(); // $options['attributes'][$entity->getPK()] = ['data-role' => implode(DEFAULTS['DELIMITER_ROLE'], $entity->getRole())]; } $options['options'] = $tempOptions; break; default: foreach (lang($this->getAttribute('class_path') . "." . strtoupper($field)) as $key => $label) { $tempOptions[$key] = $label; } $options['options'] = $tempOptions; break; } return $options; } }