cfmgrv4 init...2

This commit is contained in:
최준흠 2024-10-07 18:58:38 +09:00
parent 9e3ea123ff
commit e8257f3813
14 changed files with 176 additions and 71 deletions

View File

@ -61,7 +61,7 @@ class AccountController extends CloudflareController
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'type', 'status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = ['type', 'status'];
$this->batchjob_fields = [];
return $this->list_procedure();
}
// Download

View File

@ -71,7 +71,7 @@ class UserController extends AdminController
private function init(string $action): void
{
$this->action = $action;
$this->fields = ['id', 'passwd', $this->getModel()::TITLE, 'email', 'mobile', 'role'];
$this->fields = ['id', 'passwd', 'confirmpassword', $this->getModel()::TITLE, 'email', 'mobile', 'role'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = ['role', 'status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);

View File

@ -88,6 +88,10 @@ class AccountHelper extends CommonHelper
]
) . " <span class=\"label_Accounts\">{$value}</span>";
break;
case 'type':
case 'status':
$value = $viewDatas['field_options'][$field][$value];
break;
default:
$value = parent::getFieldView($field, $viewDatas, $extras);
break;
@ -106,6 +110,9 @@ class AccountHelper extends CommonHelper
case 'delete':
$action = "";
break;
case 'batchjob':
$action = "";
break;
}
return $action;
}

View File

@ -266,7 +266,7 @@ abstract class CommonHelper
"name" => "batchjob_uids[]",
"value" => $pk,
"class" => "batchjobuids_checkboxs",
"checked" => in_array($pk, old("batchjob_uids", []))
"checked" => in_array($pk, old("batchjob_uids[]", []))
]);
$action = $checkbox . $this->getListButtonLink(
current_url() . '/' . $action . '/' . $viewDatas['entity']->getPK(),
@ -283,6 +283,12 @@ abstract class CommonHelper
$extras
);
break;
case 'batchjob':
$action = form_submit("batchjob_submit", '일괄처리', [
"class" => "btn btn-outline btn-warning",
"onclick" => "return submitBatchJob()"
]);
break;
}
return $action;
}

View File

@ -2,9 +2,9 @@
namespace App\Models\Cloudflare;
use App\Models\CommonModel;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\AccountEntity;
use App\Entities\Cloudflare\ZoneEntity;
use App\Models\CommonModel;
class ZoneModel extends CommonModel
{
@ -103,7 +103,9 @@ class ZoneModel extends CommonModel
//List 검색용
public function setList_WordFilter(string $word, $field = null): void
{
//Join을 해서 Record의 content(IP검색)을 하기위함
//Record의 content(IP검색)을 하기위함
//Join 방식사용
$this->select(self::TABLE . '.*')->distinct();
$this->join(RecordModel::TABLE, sprintf(
"%s.%s=%s.%s",
self::TABLE,
@ -113,8 +115,12 @@ class ZoneModel extends CommonModel
));
parent::setList_WordFilter($word, $field);
$this->orLike(RecordModel::TABLE . '.content', $word, 'both');
// $subquery = $this->db->table(RecordModel::TABLE)->select(RecordModel::PARENT)->like('content', $word, 'both');
// $this->orWhereIn(self::PK, $subquery);
//Subquery 방식사용
// $recordModel = new RecordModel();
// $recordModel->like(RecordModel::TABLE . '.content', $word, 'both');
// $zone_uids = $recordModel->select(RecordModel::PARENT)->findAll();
// $zone_uids = array_column($zone_uids, RecordModel::PARENT);
// $this->orWhereIn(self::TABLE . '.' . self::PK, array_values($zone_uids));
}
public function setList_OrderBy(string $order = ""): void
{

View File

@ -80,15 +80,6 @@ abstract class CommonModel extends Model
case $this->getTitleField():
$rule = "required|string";
break;
case "passwd":
$rule = $action == "create" ? "required" : "if_exist" . "|trim|string";
break;
case "confirmpassword":
$rule = $action == "create" ? "required" : "if_exist" . "|trim|string|matches[passwd]";
break;
case "email":
$rule = "if_exist|trim|valid_email";
break;
case 'image':
$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;
@ -135,7 +126,7 @@ abstract class CommonModel extends Model
return $this->asObject($this->returnType)->findAll();
}
//create , modify 직전 작업용 작업
final protected function convertEntityData(string $field, array $formDatas): mixed
protected function convertEntityData(string $field, array $formDatas): mixed
{
switch ($field) {
case $this->getPKField():
@ -154,13 +145,7 @@ abstract class CommonModel extends Model
$value = $formDatas[$field];
}
break;
case "passwd":
$value = password_hash($formDatas[$field], PASSWORD_DEFAULT);
break;
case "confirmpassword":
$value = password_hash($formDatas[$field], PASSWORD_DEFAULT);
break;
case "content":
case "editor": //content등 textarea를 사용한 Field
$value = htmlentities($formDatas[$field], ENT_QUOTES);
break;
default:
@ -192,7 +177,7 @@ abstract class CommonModel extends Model
{
//Field에 맞는 Validation Rule 재정의
$this->setValidationRules($this->getFieldRules('create', $this->allowedFields));
//저장하기 전에 데이터 값 변경이 필요한 Field
//저장하기 전에 데이터 값 변경이 필요한 Field
foreach (array_keys($formDatas) as $field) {
$entity->$field = $this->convertEntityData($field, $formDatas);
}
@ -209,7 +194,7 @@ abstract class CommonModel extends Model
{
//Field에 맞는 Validation Rule 재정의
$this->setValidationRules($this->getFieldRules('modify', $this->allowedFields));
//저장하기 전에 데이터 값 변경이 필요한 Field
//저장하기 전에 데이터 값 변경이 필요한 Field
foreach (array_keys($formDatas) as $field) {
$entity->$field = $this->convertEntityData($field, $formDatas);
}

View File

@ -40,19 +40,39 @@ class UserModel extends CommonModel
$rule = "required|trim|min_length[4]|max_length[20]";
$rule .= $action == "create" ? "|is_unique[{$this->table}.{$field}]" : "";
break;
case "passwd":
$rule = "required|trim|string";
break;
case "confirmpassword":
$rule = "required|trim|string|matches[passwd]";
break;
case "email":
$rule = "if_exist|trim|valid_email";
$rule = "required|trim|valid_email";
break;
case "role":
$rule = "required|trim|string";
break;
case "passwd":
default:
$rule = parent::getFieldRule($action, $field);
break;
}
return $rule;
}
protected function convertEntityData(string $field, array $formDatas): mixed
{
switch ($field) {
case "passwd":
$value = password_hash($formDatas[$field], PASSWORD_DEFAULT);
break;
case "confirmpassword":
$value = password_hash($formDatas[$field], PASSWORD_DEFAULT);
break;
default:
$value = parent::convertEntityData($field, $formDatas);
break;
}
return $value;
}
public function getEntityByPK(string $uid): null|UserEntity
{

View File

@ -1,24 +1,26 @@
<?= $this->extend("layouts/{$viewDatas['layout']}/{$viewDatas['action_form']}") ?>
<?= $this->section('content') ?>
<link href="/css/<?= $viewDatas['layout'] ?>/content.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/css/<?= $viewDatas['layout'] ?>/form.css" media="screen" rel="stylesheet" type="text/css" />
<?= form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="action_form table table-bordered">
<?php $cnt = 1 ?>
<?php foreach ($viewDatas['fields'] as $field): ?>
<div class="action_form">
<table class=" table table-bordered">
<?php $cnt = 1 ?>
<?php foreach ($viewDatas['fields'] as $field): ?>
<tr>
<th nowrap class="text-end"><?= $viewDatas['helper']->getFieldLabel($field, $viewDatas) ?></th>
<td nowrap class="text-start">
<?= $viewDatas['helper']->getFieldForm($field, old($field), $viewDatas) ?>
<div><?= validation_show_error($field); ?></div>
</td>
<?php $cnt++ ?>
</tr>
<?php endforeach; ?>
<tr>
<th nowrap class="text-end"><?= $viewDatas['helper']->getFieldLabel($field, $viewDatas) ?></th>
<td nowrap class="text-start">
<?= $viewDatas['helper']->getFieldForm($field, old($field), $viewDatas) ?>
<div><?= validation_show_error($field); ?></div>
<td colspan="<?= $cnt * 2 ?>" class="text-center">
<?= form_submit('', '입력', array("class" => "btn btn-outline btn-primary")); ?>
</td>
<?php $cnt++ ?>
</tr>
<?php endforeach; ?>
<tr>
<td valign=" bottom" colspan="<?= $cnt * 2 ?>">
<?= form_submit('', '입력', array("class" => "btn btn-outline btn-primary")); ?>
</td>
</tr>
</table>
<?= form_close(); ?>
</table>
<?= form_close(); ?>
</div>
<?= $this->endSection() ?>

View File

@ -1,7 +1,7 @@
<?= $this->extend("layouts/{$viewDatas['layout']}") ?>
<?= $this->section('content') ?>
<link href="/css/<?= $viewDatas['layout'] ?>/index.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/<?= $viewDatas['layout'] ?>/index.js"></script>
<link href="/css/common/resizeTable.css" media="screen" rel="stylesheet" type="text/css" />
<?= form_open(current_url(), array("method" => "get")) ?>
<nav class="index_top navbar navbar-expand-lg">
<div class="container-fluid">
@ -62,9 +62,9 @@
<ul class="nav justify-content-center">
<li class="nav-item"><?= form_checkbox(array("id" => "batchjobuids_checkbox")) ?>ALL</li>
<?php foreach ($viewDatas['batchjob_fields'] as $field): ?>
<?= $viewDatas['helper']->getFieldForm($field, DEFAULTS['EMPTY'], $viewDatas) ?>
<?= $viewDatas['helper']->getFieldForm($field, DEFAULTS['EMPTY'], $viewDatas, ["id" => $field]) ?>
<?php endforeach ?>
<li class="nav-item"><?= form_submit("", '일괄처리', ["class" => "btn btn-outline btn-warning"]) ?></li>
<li class="nav-item"><?= $viewDatas['helper']->getListButton('batchjob', $viewDatas) ?></li>
<li class="nav-item"><?= $viewDatas['helper']->getListButton('create', $viewDatas) ?></li>
</ul>
<?= form_close() ?>
@ -75,6 +75,29 @@
<?= $this->include('templates/' . $viewDatas['layout'] . '/' . $viewDatas['action_form']); ?>
<?php endif ?>
</div>
<link href="/css/common/resizeTable.css" media="screen" rel="stylesheet" type="text/css" />
<script>
function submitBatchJob() {
var validate = false;
//batchjob용 선택사항 검증
<?php foreach ($viewDatas['batchjob_fields'] as $field): ?>
var element = document.getElementById('<?= $field ?>');
if (element.options[element.selectedIndex].value != "") {
validate = true;
}
<?php endforeach ?>
if (!validate) {
alert('변경항목은 하나 이상을 선택하셔야합니다.');
return false;
}
//적용받는 uids가 한개라도 선택되었다면 true
var checkboxes = document.querySelectorAll('input[name="batchjob_uids[]"]:checked');
if (checkboxes.length === 0) {
alert('적용할 리스트를 선택해주세요.');
validate = false;
}
return validate;
}
</script>
<script type="text/javascript" src="/js/common/resizeTable.js"></script>
<script type="text/javascript" src="/js/<?= $viewDatas['layout'] ?>/index.js"></script>
<?= $this->endSection() ?>

View File

@ -1,24 +1,26 @@
<?= $this->extend("layouts/{$viewDatas['layout']}/{$viewDatas['action_form']}") ?>
<?= $this->section('content') ?>
<link href="/css/<?= $viewDatas['layout'] ?>/content.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/css/<?= $viewDatas['layout'] ?>/form.css" media="screen" rel="stylesheet" type="text/css" />
<?= form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="action_form table table-bordered">
<?php $cnt = 1 ?>
<?php foreach ($viewDatas['fields'] as $field): ?>
<div class="action_form">
<table class="table table-bordered">
<?php $cnt = 1 ?>
<?php foreach ($viewDatas['fields'] as $field): ?>
<tr>
<th nowrap class="text-end"><?= $viewDatas['helper']->getFieldLabel($field, $viewDatas) ?></th>
<td nowrap class="text-start">
<?= $viewDatas['helper']->getFieldForm($field, old($field) ?? $viewDatas['entity']->$field, $viewDatas) ?>
<div><?= validation_show_error($field); ?></div>
</td>
<?php $cnt++ ?>
</tr>
<?php endforeach; ?>
<tr>
<th nowrap class="text-end"><?= $viewDatas['helper']->getFieldLabel($field, $viewDatas) ?></th>
<td nowrap class="text-start">
<?= $viewDatas['helper']->getFieldForm($field, old($field) ?? $viewDatas['entity']->$field, $viewDatas) ?>
<div><?= validation_show_error($field); ?></div>
<td colspan="<?= $cnt * 2 ?>" class="text-center">
<?= form_submit('', '수정', array("class" => "btn btn-outline btn-primary")); ?>
</td>
<?php $cnt++ ?>
</tr>
<?php endforeach; ?>
<tr>
<td valign=" bottom" colspan="<?= $cnt * 2 ?>">
<?= form_submit('', '수정', array("class" => "btn btn-outline btn-primary")); ?>
</td>
</tr>
</table>
<?= form_close(); ?>
</table>
<?= form_close(); ?>
</div>
<?= $this->endSection() ?>

View File

@ -27,8 +27,7 @@
<b><?= ICONS['LOGIN'] . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['name'] ?></b>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<?php $viewDatas['list_action_url'] = "/admin/user/modify/" . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['uid'] ?>
<li><?= $viewDatas['helper']->getListButtonLink("modify", ICONS['SETUP'] . "정보수정", $viewDatas, ["class" => "dropdown-item"]) ?></li>
<li><?= $viewDatas['helper']->getListButtonLink("/admin/user/modify/" . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['uid'], ICONS['SETUP'] . "정보수정", $viewDatas, ["class" => "dropdown-item"]) ?></li>
<li>
<hr class="dropdown-divider">
</li>

View File

@ -27,8 +27,7 @@
<b><?= ICONS['LOGIN'] . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['name'] ?></b>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<?php $viewDatas['list_action_url'] = "/admin/user/modify/" . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['uid'] ?>
<li><?= $viewDatas['helper']->getListButtonLink("modify", ICONS['SETUP'] . "정보수정", $viewDatas, ["class" => "dropdown-item"]) ?></li>
<li><?= $viewDatas['helper']->getListButtonLink("/user/modify/" . $viewDatas['session']->get(SESSION_NAMES['AUTH'])['uid'], ICONS['SETUP'] . "정보수정", $viewDatas, ["class" => "dropdown-item"]) ?></li>
<li>
<hr class="dropdown-divider">
</li>

28
public/css/admin/form.css Normal file
View File

@ -0,0 +1,28 @@
/* create,modify,view 페이지용 */
div.action_form {
/* 블록 요소로 변경 */
margin-left: auto;
/* 자동 여백을 이용한 가로 가운데 정렬 */
margin-right: auto;
/* 자동 여백을 이용한 가로 가운데 정렬 */
/* border: 1px solid blue; */
/* table-layout: fixed; 고정 레이아웃 */
border-collapse: collapse;
/* 테두리 결합 */
}
div.action_form table {}
div.action_form table th {
background-color: #f0f0f0;
}
div.action_form table td {
text-align: center;
word-wrap: break-word;
/* 긴 단어 강제 줄바꿈 */
white-space: normal;
/* 자동 줄바꿈 */
}
/* create,modify,view 페이지용 */

28
public/css/front/form.css Normal file
View File

@ -0,0 +1,28 @@
/* create,modify,view 페이지용 */
div.action_form {
/* 블록 요소로 변경 */
margin-left: auto;
/* 자동 여백을 이용한 가로 가운데 정렬 */
margin-right: auto;
/* 자동 여백을 이용한 가로 가운데 정렬 */
/* border: 1px solid blue; */
/* table-layout: fixed; 고정 레이아웃 */
border-collapse: collapse;
/* 테두리 결합 */
}
div.action_form table {}
div.action_form table th {
background-color: #f0f0f0;
}
div.action_form table td {
text-align: center;
word-wrap: break-word;
/* 긴 단어 강제 줄바꿈 */
white-space: normal;
/* 자동 줄바꿈 */
}
/* create,modify,view 페이지용 */