dbms/app/Controllers/Admin/UserController.php
2025-07-02 13:21:18 +09:00

172 lines
7.2 KiB
PHP

<?php
namespace App\Controllers\Admin;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Validation\Validation;
use Psr\Log\LoggerInterface;
use App\Helpers\UserHelper;
use App\Services\UserService;
class UserController extends AdminController
{
private $_service = null;
private $_helper = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->content_title = lang("{$this->getService()->getClassName()}.title");
$this->class_path .= $this->getService()->getClassName();
$this->uri_path .= strtolower($this->getService()->getClassName('/')) . '/';
// $this->view_path .= strtolower($this->getService()->getClassName()) . DIRECTORY_SEPARATOR;
}
final public function getService(): UserService
{
if (!$this->_service) {
$this->_service = new UserService();
}
return $this->_service;
}
public function getHelper(): UserHelper
{
if (!$this->_helper) {
$this->_helper = new UserHelper();
}
return $this->_helper;
}
//Index,FieldForm관련
protected function getResultSuccess(string $message = MESSAGES["SUCCESS"], ?string $actionTemplate = null): RedirectResponse|string
{
switch ($this->getAction()) {
case 'individual_modify':
$this->getMyLogService()->save($this->getService()->getClassName(), __FUNCTION__, $message);
$result = $this->view($this->entity->getPK());
break;
case 'individual_modify_form':
$this->control = $this->getControlDatas();
$this->getHelper()->setViewDatas($this->getViewDatas());
$actionTemplate = $this->request->getVar('ActionTemplate') ?? $actionTemplate;
if ($actionTemplate) {
$view_file = $this->view_path . $actionTemplate . DIRECTORY_SEPARATOR . $this->getAction();
} else {
$view_file = $this->view_path . $this->getAction();
}
$result = view($view_file, ['viewDatas' => $this->getViewDatas()]);
break;
default:
$result = parent::getResultSuccess($message, $actionTemplate);
break;
}
return $result;
}
protected function setValidation(Validation $validation, string $field, string $rule): Validation
{
switch ($field) {
case 'role':
//아래 Rule Array는 필드명.* checkbox를 사용
$validation->setRule("{$field}.*", $field, $rule);
break;
default:
$validation = parent::setValidation($validation, $field, $rule);
break;
}
return $validation;
}
//Index,FieldForm관련.
protected function individual_modify_form_process(mixed $entity): mixed
{
return $entity;
}
final public function individual_modify_form(mixed $uid): RedirectResponse|string
{
try {
//각 Field 초기화
$fields = [
'formFields' => ['id', 'passwd', 'confirmpassword', 'name', 'email', 'mobile'],
];
// $this->getMyAuth()->pushCurrentUrl($this->request->getUri()->getPath() . ($this->request->getUri()->getQuery() ? "?" . $this->request->getUri()->getQuery() : ""));
$this->initAction(__FUNCTION__, $fields);
//FieldRule정의
foreach ($this->getFormFields() as $field) {
$this->setFieldRule($field, $this->getFormFieldRule($this->getAction(), $field));
}
helper(['form']);
//filter_fields에 해당하는 값이 있을 경우 정의
foreach ($this->getFilterFields() as $field) {
$value = $this->request->getVar($field);
if ($value) {
$this->$field = $value;
}
}
//기존 Entity 가져오기
$entity = $this->getService()->getEntity($uid);
if (!$entity) {
throw new \Exception("{$uid}에 대한 정보를 찾을수 없습니다.");
}
$this->entity = $this->individual_modify_form_process($entity);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return $this->getResultSuccess();
} catch (\Exception $e) {
return $this->getResultFail($e->getMessage());
}
}
protected function individual_modify_process(mixed $entity, array $formDatas): mixed
{
//데이터 검증
$formDatas = $this->doValidate($this->getFieldRules(), $formDatas);
return $this->getService()->modify($entity, $formDatas);
}
final public function individual_modify(int $uid): RedirectResponse|string
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
//각 Field 초기화
$fields = [
'formFields' => ['id', 'passwd', 'confirmpassword', 'name', 'email', 'mobile'],
];
$this->initAction(__FUNCTION__, $fields);
//FieldRule정의
foreach ($this->getFormFields() as $field) {
$this->setFieldRule($field, $this->getFormFieldRule($this->getAction(), $field));
}
//입력값정의
$formDatas = [];
foreach ($this->getFormFields() as $field) {
$formDatas[$field] = $this->request->getPost($field);
}
//기존 Entity 가져오기
$entity = $this->getService()->getEntity($uid);
if (!$entity) {
throw new \Exception("{$uid}에 대한 정보를 찾을수 없습니다.");
}
$this->entity = $this->individual_modify_process($entity, $formDatas);
$this->getService()->getModel()->transCommit();
return $this->getResultSuccess();
} catch (\Exception $e) {
$this->getService()->getModel()->transRollback();
return $this->getResultFail($e->getMessage());
}
}
protected function setFilterConditionForList(): void
{
foreach ($this->getFilterFields() as $field) {
$this->$field = $this->request->getVar($field);
if ($this->$field !== null && $this->$field !== '') {
if ($field === 'role') {
$where = "FIND_IN_SET(" . $this->getService()->getModel()->escape($this->$field) . ", {$this->getService()->getModel()->getTable()}.{$field}) > 0";
//FIND_IN_SET()은 MySQL 함수이므로 CodeIgniter가 이를 일반 컬럼명으로 착각하고 escape하게 되면 오류가 발생합니다. 따라서 ->where($sql, null, false)로 명시하여 escape를 꺼줘야 정상 작동
$this->getService()->getModel()->where($where, null, false);
} else {
$this->getService()->getModel()->where("{$this->getService()->getModel()->getTable()}.{$field}", $this->$field);
}
}
}
}
}