Automation init...4

This commit is contained in:
최준흠 2024-09-24 17:09:29 +09:00
parent 29cbb53e04
commit 2d41c92d98
20 changed files with 808 additions and 438 deletions

View File

@ -35,11 +35,14 @@ $routes->group('mangboard', ['namespace' => 'App\Controllers\Mangboard'], functi
$routes->group('cloudflare', ['namespace' => 'App\Controllers\Cloudflare'], function ($routes) {
$routes->group('account', function ($routes) {
$routes->get('/', 'AccountController::index');
$routes->get('create', 'AccountController::create_form');
$routes->post('create', 'AccountController::create');
});
$routes->group('zone', function ($routes) {
$routes->get('/', 'ZoneController::index');
$routes->get('create', 'ZoneController::create_form');
$routes->post('create/(:uuid)', 'RecordController::create/$1');
});
$routes->group('record', function ($routes) {
$routes->get('/', 'RecordController::index');
$routes->post('create/(:uuid)', 'RecordController::create/$1');
});
});

View File

@ -2,55 +2,70 @@
namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\RedirectResponse;
use App\Libraries\MyCloudflare\Account;
use App\Traits\AuthTrait;
use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\AccountEntity;
class AccountController extends MVController
class AccountController extends CloudflareController
{
use AuthTrait;
private $_model = null;
private $_myLibrary = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name = "Cloudflare/Account";
$this->class_name .= "Account";
$this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title");
$this->session = $this->session_AuthTrait();
helper($this->class_name);
}
final protected function getModel(): AccountModel
final protected function getMyLibrary(): Account
{
if ($this->_model === null) {
$this->_model = new AccountModel();
if ($this->_myLibrary === null) {
$this->_myLibrary = new Account();
}
return $this->_model;
return $this->_myLibrary;
}
protected function create_init(): void
{
$this->fields = [$this->getModel()::TITLE, 'apikey', 'status'];
$this->fields = [$this->getMyLibrary()->getMyStorage()::TITLE, 'apikey', 'status'];
$this->filter_fields = ['status'];
$this->action = DB_ACTION["CREATE"];
$this->getModel()->setAction($this->action);
$this->action = DB_ACTION['CREATE'];
$this->getMyLibrary()->getMyStorage()->setAction($this->action);
}
public function create_form(): RedirectResponse|string
// public function create_form(): RedirectResponse|string
// {
// $this->create_init();
// return $this->create_form_process();
// }
protected function create_process_submit(): void
{
return $this->create_form_process();
}
protected function create_process_submit(): AccountEntity
{
$account = new Account();
return $account->create($this->formDatas);
$entity = $this->getMyLibrary()->create($this->formDatas);
}
public function create(): RedirectResponse
{
$this->create_init();
$this->formDatas = [];
$this->getFormDatas();
$this->convertFormDatas();
$this->validateFormDatas();
return parent::create_process();
}
protected function index_init(): void
{
$this->fields = [$this->getMyLibrary()->getMyStorage()::TITLE, 'apikey', 'status'];
$this->filter_fields = ['status'];
$this->action = DB_ACTION['CREATE'];
$this->getMyLibrary()->getMyStorage()->setAction($this->action);
helper(['form']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
}
public function index(): string
{
$this->create_init();
return parent::list_process();
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Models\Cloudflare\AccountModel;
use App\Models\Cloudflare\API\RecordModel;
use App\Models\Cloudflare\ZoneModel;
use App\Traits\AuthTrait;
abstract class CloudflareController extends MVController
{
use AuthTrait;
private $_accountModel = null;
private $_zoneModel = null;
private $_recordModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name = "Cloudflare/";
$this->layout = LAYOUTS['admin'];
$this->session = $this->session_AuthTrait();
}
final protected function getAccountModel(): AccountModel
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
}
return $this->_accountModel;
}
final protected function getZoneModel(): ZoneModel
{
if ($this->_zoneModel === null) {
$this->_zoneModel = new ZoneModel();
}
return $this->_zoneModel;
}
final protected function getRecordModel(): RecordModel
{
if ($this->_recordModel === null) {
$this->_recordModel = new RecordModel();
}
return $this->_recordModel;
}
protected function modify_process_submit(): void
{
}
}

View File

@ -2,75 +2,108 @@
namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\RedirectResponse;
use App\Traits\AuthTrait;
use App\Libraries\MySocket\CloudflareSocket;
use App\Libraries\MyCloudflare\Record;
use App\Models\Cloudflare\ZoneModel;
use App\Models\Cloudflare\AccountModel;
use App\Models\Cloudflare\API\RecordModel;
use App\Entities\Cloudflare\RecordEntity;
class RecordController extends MVController
class RecordController extends CloudflareController
{
use AuthTrait;
private $_model = null;
private $_accountModel = null;
private $_zoneModel = null;
private $_myLibrary = null;
private $_account_entity = null;
private $_zone_entity = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->session = $this->session_AuthTrait();
$this->class_name = 'Record';
$this->class_name .= "Record";
$this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title");
helper($this->class_name);
}
final protected function getModel(): RecordModel
final protected function getMyLibrary(): Record
{
if ($this->_model === null) {
$this->_model = new RecordModel();
if ($this->_myLibrary === null) {
$this->_myLibrary = new Record($this->_account_entity, $this->_zone_entity);
}
return $this->_model;
return $this->_myLibrary;
}
final protected function getAccountModel(): AccountModel
protected function getFormFieldInputOption(string $field, array $options = []): array
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
switch ($field) {
case $this->getMyLibrary()->getMyStorage()::PARENT:
$options = [
DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택'
];
$this->getZoneModel()->where('status', DEFAULTS['STATUS']);
$options = $this->getZoneModel()->getFormFieldInputOption($field, $options);
break;
default:
$options = parent::getFormFieldInputOption($field, $options);
break;
}
return $this->_accountModel;
return $options;
}
final protected function getZoneModel(): ZoneModel
//전송된 데이터
protected function getFormData(string $field): void
{
if ($this->_zoneModel === null) {
$this->_zoneModel = new ZoneModel();
switch ($field) {
case 'hosts':
$this->formDatas[$field] = explode("\n", $this->request->getVar($field));
if (!is_array($this->formDatas[$field]) || !count($this->formDatas[$field])) {
throw new \Exception("호스트명이 정의되지 않았습니다.");
}
break;
default:
$this->formDatas[$field] = $this->request->getVar($field);
break;
}
}
//전송된 데이터 검증
protected function validateFormData(string $field): void
{
switch ($field) {
case 'hosts':
break;
default:
parent::validateFormData($field);
break;
}
return $this->_zoneModel;
}
protected function create_init(): void
{
$this->fields = ['id', 'apikey'];
$this->filter_fields = ['status'];
$this->action = 'create';
$this->getModel()->setAction($this->action);
$this->fields = [
$this->getMyLibrary()->getMyStorage()::PARENT,
'type',
'content',
'proxied',
'hosts',
];
$this->filter_fields = [$this->getMyLibrary()->getMyStorage()::PARENT, 'type', 'proxied'];
$this->action = 'create';
$this->getMyLibrary()->getMyStorage()->setAction($this->action);
}
public function create_form(): RedirectResponse|string
// public function create_form(): RedirectResponse|string
// {
// return $this->create_form_process();
// }
protected function create_process_submit(): void
{
return $this->create_form_process();
//Record생성
foreach ($this->formDatas['hosts'] as $host) {
$this->getMyLibrary()->create($host, $this->formDatas);
}
}
protected function create_process_submit(): RecordEntity
{
$zone_entity = $this->getZoneModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$account_entity = $this->getAccountModel()->getEntityByPK($zone_entity->getParent());
$Record = new Record($account_entity, $zone_entity);
return $Record->create($this->formDatas);
}
public function create(): RedirectResponse
public function create(string $zone_uid): RedirectResponse
{
$this->_zone_entity = $this->getZoneModel()->getEntityByPK($zone_uid);
$this->_account_entity = $this->getAccountModel()->getEntityByPK($this->_zone_entity->getParent());
$this->formDatas = [];
$this->getFormDatas();
$this->convertFormDatas();
$this->validateFormDatas();
return parent::create_process();
}
}

View File

@ -2,78 +2,143 @@
namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\RedirectResponse;
use App\Traits\AuthTrait;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Libraries\MyCloudflare\Zone;
use App\Models\Cloudflare\ZoneModel;
use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\ZoneEntity;
use App\Libraries\MyCloudflare\Record;
class ZoneController extends MVController
class ZoneController extends CloudflareController
{
use AuthTrait;
private $_model = null;
private $_accountModel = null;
private $_myLibrary = null;
private $_account_entity = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->session = $this->session_AuthTrait();
$this->class_name = "Zone";
$this->class_name .= "Zone";
$this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title");
helper($this->class_name);
}
final protected function getModel(): ZoneModel
final protected function getMyLibrary(): Zone
{
if ($this->_model === null) {
$this->_model = new ZoneModel();
if ($this->_myLibrary === null) {
$this->_myLibrary = new Zone($this->_account_entity);
}
return $this->_model;
return $this->_myLibrary;
}
final protected function getAccountModel(): AccountModel
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
}
return $this->_accountModel;
}
protected function getFormFieldOption(string $field, array $options = []): array
protected function getFormFieldInputOption(string $field, array $options = []): array
{
switch ($field) {
case ZoneModel::PARENT:
case $this->getMyLibrary()->getMyStorage()::PARENT:
$options = [
DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택'
];
$options = $this->getAccountModel()->getFilterFieldOption($field, $options);
$this->getAccountModel()->where('status', DEFAULTS['STATUS']);
$options = $this->getAccountModel()->getFormFieldInputOption($field, $options);
break;
case 'type':
case 'proxied':
$options = [
DEFAULTS['EMPTY'] => lang("Cloudflare/Record.label." . $field) . ' 선택',
...lang("Cloudflare/Record.label." . strtoupper($field)),
];
break;
default:
$options = parent::getFormFieldOption($field, $options);
$options = parent::getFormFieldInputOption($field, $options);
break;
}
return $options;
}
protected function getFormFieldRule(string $field, array $rules): array
{
if (is_array($field)) {
throw new \Exception(__FUNCTION__ . "=> field가 array 입니다.\n" . var_export($field, true));
}
switch ($field) {
default:
$rules[$field] = $this->getMyLibrary()->getMyStorage()->getFieldRule($field, $rules);
;
break;
}
return $rules;
}
//전송된 데이터
protected function getFormData(string $field): void
{
switch ($field) {
case 'domains':
$this->formDatas[$field] = explode("\n", $this->request->getVar($field));
if (!is_array($this->formDatas[$field]) || !count($this->formDatas[$field])) {
throw new \Exception("도메인명이 정의되지 않았습니다.");
}
break;
case 'hosts':
$this->formDatas[$field] = $this->request->getVar($field);
if (!is_array($this->formDatas[$field]) || !count($this->formDatas[$field])) {
throw new \Exception("호스트명이 정의되지 않았습니다");
}
break;
default:
$this->formDatas[$field] = $this->request->getVar($field);
break;
}
}
//전송된 데이터 검증
protected function validateFormData(string $field): void
{
switch ($field) {
case 'domains':
case 'hosts':
break;
default:
parent::validateFormData($field);
break;
}
}
protected function create_init(): void
{
$this->fields = [$this->getModel()::PARENT, $this->getModel()::TITLE, 'status', 'type'];
$this->filter_fields = [$this->getModel()::PARENT, 'status', 'type'];
$this->action = 'create';
$this->getModel()->setAction($this->action);
$this->fields = [
$this->getMyLibrary()->getMyStorage()::PARENT,
'domains',
'hosts',
'type',
'content',
'proxied',
];
$this->filter_fields = [$this->getMyLibrary()->getMyStorage()::PARENT, 'type', 'proxied'];
$this->action = 'create';
$this->getMyLibrary()->getMyStorage()->setAction($this->action);
}
public function create_form(): RedirectResponse|string
// public function create_form(): RedirectResponse|string
// {
// return $this->create_form_process();
// }
protected function create_process_submit(): void
{
return $this->create_form_process();
foreach ($this->formDatas['domains'] as $domain) {
//Zone생성
$zone_entity = $this->getMyLibrary()->create($domain);
//Record생성
$record = new Record($this->_account_entity, $zone_entity);
foreach ($this->formDatas['hosts'] as $host) {
$record->create($host, [
'type' => $this->formDatas['type'],
'content' => $this->formDatas['content'],
'proxied' => $this->formDatas['proxied'],
]);
}
}
}
protected function create_process_submit(): ZoneEntity
{
$account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$zone = new Zone($account_entity);
return $zone->create($this->formDatas);
}
public function create(): RedirectResponse
public function create(string $account_uid): RedirectResponse
{
$this->_account_entity = $this->getAccountModel()->getEntityByPK($account_uid);
$this->formDatas = [];
$this->getFormDatas();
$this->convertFormDatas();
$this->validateFormDatas();
return parent::create_process();
}
}

View File

@ -14,17 +14,14 @@ abstract class MVController extends CommonController
parent::initController($request, $response, $logger);
helper('common');
}
abstract protected function create_init(): void;
abstract protected function getModel(): mixed;
//Field별 Form Option용
protected function getFormFieldOption(string $field, array $options = []): array
abstract protected function getMyLibrary(): mixed;
abstract protected function create_process_submit(): void;
abstract protected function modify_process_submit(): void;
//Field별 Form Input Option용
protected function getFormFieldInputOption(string $field, array $options = []): array
{
switch ($field) {
default:
$temps = lang($this->class_name . '.' . strtoupper($field));
if (!is_array($temps)) {
throw new \Exception(__FUNCTION__ . "에서 {$field}의 데이터가 array가 아닙니다.\n" . var_export($temps, true));
}
$options = [
"" => lang($this->class_name . '.label.' . $field) . ' 선택',
...lang($this->class_name . '.' . strtoupper($field)),
@ -33,13 +30,14 @@ abstract class MVController extends CommonController
}
return $options;
}
//Field별 Form Input용
protected function getFormFieldInput(string $field, string $value, array $inputs = []): array
{
switch ($field) {
case 'status':
$inputs[$field] = form_dropdown(
$field,
$this->getFormFieldOption($field),
$this->getFormFieldInputOption($field),
$value
);
break;
@ -53,7 +51,7 @@ abstract class MVController extends CommonController
}
return $inputs;
}
final public function getFormFieldInputs(array $inputs = []): array
final protected function getFormFieldInputs(array $inputs = []): array
{
foreach ($this->fields as $field) {
if (is_array($field)) {
@ -63,6 +61,7 @@ abstract class MVController extends CommonController
}
return $inputs;
}
//전송된 데이터 Rule
protected function getFormFieldRule(string $field, array $rules): array
{
if (is_array($field)) {
@ -70,38 +69,33 @@ abstract class MVController extends CommonController
}
switch ($field) {
default:
$rules[$field] = $this->_model->getFieldRule($field, $rules);
;
$rules[$field] = $this->getMyLibrary()->getMyStorage()->getFieldRule($field, $rules);
break;
}
return $rules;
}
final public function getFormFieldRules(array $rules = []): array
final protected function getFormFieldRules(array $rules = []): array
{
foreach ($this->fields as $field) {
$rules = $this->getFormFieldRule($field, $rules);
}
return $rules;
}
//전송된 데이터 검증
protected function validateFormData(): void
{
//변경할 값 확인 : Upload된 파일 검증시 $this->request->getVar()보다 먼처 체크필요
$validation = service('validation');
$validation->setRules($this->getModel()->getFieldRules($this->fields));
if (!$validation->withRequest($this->request)->run()) {
throw new \Exception("데이터 검증 오류발생\n" . implode("\n", $validation->getErrors()));
}
}
//전송된 데이터
protected function getFormData(string $field): void
{
switch ($field) {
default:
$this->formDatas[$field] = rtrim($this->request->getVar($field));
$this->formDatas[$field] = $this->request->getVar($field);
break;
}
}
final protected function getFormDatas(): void
{
foreach ($this->fields as $field) {
$this->getFormData($field);
}
}
//전송된 데이터 재정의
protected function convertFormData(string $field): void
{
@ -110,12 +104,41 @@ abstract class MVController extends CommonController
break;
}
}
final public function create_form_process(): RedirectResponse|string
final protected function convertFormDatas(): void
{
foreach ($this->fields as $field) {
$this->convertFormData($field);
}
}
//전송된 데이터 검증
protected function validateFormData(string $field): void
{
switch ($field) {
default:
if (
!$this->validation->check(
$this->formDatas[$field],
$this->getMyLibrary()->getMyStorage()->getFieldRule($field)
)
) {
throw new \Exception("데이터 검증 오류발생\n" . implode("\n", $this->validation->getError()));
}
break;
}
}
final protected function validateFormDatas(): void
{
//변경할 값 확인 : Upload된 파일 검증시 $this->request->getVar()보다 먼처 체크필요
$this->validation = service('validation');
foreach ($this->fields as $field) {
$this->validateFormData($field);
}
}
// 생성
final protected function create_form_process(): RedirectResponse|string
{
helper(['form']);
try {
$this->create_init();
$this->forminputs = $this->getFormFieldInputs();
$this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
@ -128,29 +151,152 @@ abstract class MVController extends CommonController
return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/")->with(SESSION_NAMES['RETURN_MSG'], $e->getMessage());
}
}
abstract protected function create_process_submit(): mixed;
final protected function create_process(): mixed
{
$this->getModel()->transStart();
$this->getMyLibrary()->getMyStorage()->transStart();
try {
$this->create_init();
$this->validateFormData();
foreach ($this->fields as $field) {
$this->getFormData($field);
}
foreach ($this->fields as $field) {
$this->convertFormData($field);
}
$entity = $this->create_process_submit();
log_message("notice", __FUNCTION__ . "=>{$entity->getTitle()} 작업을 완료하였습니다.");
$this->create_process_submit();
return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/");
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
$this->getMyLibrary()->getMyStorage()->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();
}
}
// 수정
final protected function modify_form_process(): RedirectResponse|string
{
helper(['form']);
try {
$this->forminputs = $this->getFormFieldInputs();
$this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
strtolower($this->class_name) . "/modify",
['viewDatas' => $this->getAttributes()]
);
} 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());
}
}
final protected function modify_process(): mixed
{
$this->getMyLibrary()->getMyStorage()->transStart();
try {
$this->modify_process_submit();
return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/");
} catch (\Exception $e) {
//Transaction Rollback
$this->getMyLibrary()->getMyStorage()->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 list_condition($isTotalCount = false): void
{
//조건절 처리
foreach ($this->filter_fields as $field) {
$this->$field = $this->request->getVar($field) ?? DEFAULTS['EMPTY'];
if ($this->$field !== DEFAULTS['EMPTY']) {
$this->getMyLibrary()->getMyStorage()->setList_FieldFilter($field, $this->$field);
}
}
//검색어 처리
$this->word = $this->request->getVar('word') ?? DEFAULTS['EMPTY'];
if ($this->word !== DEFAULTS['EMPTY']) {
$this->getMyLibrary()->getMyStorage()->setList_WordFilter($this->word);
}
//검색일 처리
$this->start = $this->request->getVar('start') ?? DEFAULTS['EMPTY'];
$this->end = $this->request->getVar('end') ?? DEFAULTS['EMPTY'];
if ($this->start !== DEFAULTS['EMPTY'] && $this->end !== DEFAULTS['EMPTY']) {
$this->getMyLibrary()->getMyStorage()->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->getMyLibrary()->getMyStorage()->setList_OrderBy("{$this->order_field} {$this->order_value}");
}
}
}
//Totalcount 처리
protected function list_total(): int
{
$this->list_condition(true);
return $this->getMyLibrary()->getMyStorage()->countAllResults();
}
//PageNation 처리
protected function list_pagination($pager_group = 'default', int $segment = 0, $template = 'bootstrap_full'): string
{
//Page, Per_page필요부분
$this->page = (int)$this->request->getVar('page') ?: 1;
$this->per_page = (int)$this->request->getVar('per_page') ?: $this->_per_page;
//줄수 처리용
$this->pageOptions = array("" => "줄수선택");
for ($i = 10; $i <= $this->total_count + $this->per_page; $i += 10) {
$this->pageOptions[$i] = $i;
}
// 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 = \Config\Services::pager();
// $this->getMyLibrary()->getMyStorage()->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);
}
protected function list_entitys(): array
{
$this->list_condition();
if (array_key_exists('page', $this->_viewDatas)) {
$this->getMyLibrary()->getMyStorage()->limit(
$this->per_page,
$this->page * $this->per_page - $this->per_page
);
}
return $this->getMyLibrary()->getMyStorage()->findAll();
}
public function list_process(): string
{
try {
//URL처리
$this->uri = $this->request->getUri();
//total 처리
$this->total_count = $this->list_total();
//pagenation 처리
$this->pagination = $this->list_pagination();
//모델 처리
$this->entitys = $this->list_entitys();
// dd($this->getMyLibrary()->getMyStorage()->getLastQuery());
//setting return_url to session flashdata
$this->session->setFlashdata(SESSION_NAMES['RETURN_URL'], current_url() . '?' . $this->request->getUri()->getQuery() ?: "");
return view(
strtolower($this->class_name) . "/index",
['viewDatas' => $this->getAttributes()]
);
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return alert_CommonHelper($e->getMessage(), "back");
// return redirect()->back()->with('return_message', $e->getMessage());
}
}
}

View File

@ -1,47 +1,47 @@
<?php
return [
'title' => "Record정보",
'label' => [
'uid' => "번호",
'zone_uid' => "도메인",
'type' => "Type",
'host' => "호스트명",
'content' => "IP정보",
'ttl' => "TTL",
'proxiable' => "proxiable",
'fixed' => "CDN잠금",
'proxied' => "CDN기능",
'locked' => "서비스",
'title' => "Record정보",
'label' => [
'uid' => "번호",
'zone_uid' => "도메인",
'type' => "Type",
'host' => "호스트명",
'content' => "IP정보",
'ttl' => "TTL",
'proxiable' => "proxiable",
'fixed' => "CDN잠금",
'proxied' => "CDN기능",
'locked' => "서비스",
'updated_at' => "수정일",
'created_at' => "작성일"
'created_at' => "작성일",
],
"ZONE_UID" => [],
"TYPE" => [
'A' => 'A',
'AAAA' => 'AAAA(ipv6)',
"ZONE_UID" => [],
"TYPE" => [
'A' => 'A',
'AAAA' => 'AAAA(ipv6)',
'CNAME' => 'CNAME',
'MX' => 'MX',
'SRV' => 'SRV',
'PTR' => 'PTR',
'SPF' => 'SPF',
'TXT' => 'TXT',
'NS' => 'NS',
'INFO' => 'INFO',
'NS' => 'NS',
'MX' => 'MX',
'PTR' => 'PTR',
'SPF' => 'SPF',
'TXT' => 'TXT',
'SRV' => 'SRV',
'INFO' => 'INFO',
],
"PROXIABLE" => [
"on" => "사용",
"on" => "사용",
"off" => "사용 않함",
],
"FIXED" => [
"on" => "사용",
"off" => "사용 않함",
"FIXED" => [
"on" => "고정 사용",
"off" => "고정 사용 않함",
],
"PROXIED" => [
"on" => "사용",
"off" => "사용 않함",
"PROXIED" => [
"on" => "CDN 사용",
"off" => "CDN 사용 않함",
],
"LOCKED" => [
"on" => "운영중",
"LOCKED" => [
"on" => "운영중",
"off" => "잠김",
],
];

View File

@ -14,7 +14,7 @@ class Account extends MyCloudflare
{
parent::__construct();
}
final protected function getMyStorage(): AccountModel
final public function getMyStorage(): AccountModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new AccountModel();
@ -47,7 +47,6 @@ class Account extends MyCloudflare
}
public function create(array $formDatas): AccountEntity
{
throw new \Exception(var_dump($formDatas));
//Socket용
$cf = $this->getMySocket()->request($formDatas['apikey'])
->post('accounts', [

View File

@ -15,7 +15,7 @@ abstract class MyCloudflare extends CommonLibrary
}
abstract protected function getArrayByResult($result): array;
abstract protected function reload_entity($cf): mixed;
abstract protected function getMyStorage(): mixed;
abstract public function getMyStorage(): mixed;
final protected function getMySocket(): CloudflareSocket
{
if ($this->_mySocket === null) {
@ -30,7 +30,7 @@ abstract class MyCloudflare extends CommonLibrary
if (count($cfs)) {
$cnt = 1;
foreach ($cfs as $cf) {
$entity = $this->reload_entity($cf);
$entity = $this->reload_entity($cf);
$entity_uids[] = $entity->getPK();
log_message("debug", "{$cnt}번째: {$entity->getTitle()} 저장");
$cnt++;
@ -44,17 +44,17 @@ abstract class MyCloudflare extends CommonLibrary
}
final protected function reload_cfs(Guzzle $request, $uri): array
{
$page = 1; //Page는 1부터 시작해야함
$page = 1; //Page는 1부터 시작해야함
$perpage_max = getenv("cfmgr.request.perpage.max");
$cfs = [];
$cfs = [];
do {
$query = [
'page' => $page,
'page' => $page,
'per_page' => $perpage_max,
'match' => 'all'
'match' => 'all',
];
$cf = $request->get($uri, $query);
$cf = json_decode($cf->getBody());
$cf = $request->get($uri, $query);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}

View File

@ -18,13 +18,13 @@ class Record extends MyCloudflare
{
parent::__construct();
$this->_account_entity = $account_entity;
$this->_zone_entity = $zone_entity;
$this->_zone_entity = $zone_entity;
}
protected function getRequest(): Guzzle
{
return $this->getMySocket()->request($this->_account_entity->getAPIKey());
}
final protected function getMyStorage(): RecordModel
final public function getMyStorage(): RecordModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new RecordModel();
@ -33,15 +33,15 @@ class Record extends MyCloudflare
}
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->zone_id;
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->zone_id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['type'] = $result->type;
$formDatas['content'] = $result->content;
$formDatas['ttl'] = (int) $result->ttl;
$formDatas['proxiable'] = $result->proxiable ? "on" : "off";
$formDatas['proxied'] = $result->proxied ? "on" : "off";
$formDatas['locked'] = "on";
$formDatas['type'] = $result->type;
$formDatas['content'] = $result->content;
$formDatas['ttl'] = (int)$result->ttl;
$formDatas['proxiable'] = $result->proxiable ? "on" : "off";
$formDatas['proxied'] = $result->proxied ? "on" : "off";
$formDatas['locked'] = "on";
if (isset($result->locked) && $result->locked) {
$formDatas['locked'] = "off";
}
@ -49,13 +49,13 @@ class Record extends MyCloudflare
$formDatas['created_at'] = $result->created_on;
return $formDatas;
}
public function create(array $formDatas): RecordEntity
public function create(string $host, array $formDatas): RecordEntity
{
//Socket용
//도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [
'name' => $formDatas['host'],
'type' => $formDatas['type'],
'name' => $host,
'type' => $formDatas['type'],
'content' => $formDatas['content'],
'proxied' => isset($formDatas['proxied']) && $formDatas['proxied'] === 'on' ? true : false
]);
@ -65,19 +65,19 @@ class Record extends MyCloudflare
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas);
$entity = $this->$this->getMyStorage()->create($formDatas);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function update(RecordEntity $entity, array $formDatas): RecordEntity
public function modify(RecordEntity $entity, array $formDatas): RecordEntity
{
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$datas = [
'type' => isset($formDatas['type']) ? $formDatas['type'] : $entity->type,
'name' => isset($formDatas['host']) ? $formDatas['host'] : $entity->host,
'type' => isset($formDatas['type']) ? $formDatas['type'] : $entity->type,
'name' => isset($formDatas['host']) ? $formDatas['host'] : $entity->host,
'content' => isset($formDatas['content']) ? $formDatas['content'] : $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false,
'ttl' => intval($entity->ttl)
'ttl' => intval($entity->ttl),
];
//변경작업: 2024-08-09
if (isset($formDatas['proxied']) && $formDatas['proxied'] === 'on') {

View File

@ -22,7 +22,7 @@ class Zone extends MyCloudflare
{
return $this->getMySocket()->request($this->_account_entity->getAPIKey());
}
final protected function getMyStorage(): ZoneModel
final public function getMyStorage(): ZoneModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new ZoneModel();
@ -31,10 +31,10 @@ class Zone extends MyCloudflare
}
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->account->id;
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->account->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['status'] = $result->status;
$formDatas['status'] = $result->status;
//$formDatas['type'] = $result->type; // full 이게있는데 뭔지 잘모름
$formDatas['name_servers'] = 'none';
if (isset($result->name_servers)) {
@ -54,7 +54,7 @@ class Zone extends MyCloudflare
}
$formDatas['updated_at'] = $result->modified_on;
$formDatas['created_at'] = $result->created_on;
$formDatas['plan'] = $result->plan->name;
$formDatas['plan'] = $result->plan->name;
return $formDatas;
}
//Cfzone에서 가져온 값을 zone에 setting
@ -91,13 +91,13 @@ class Zone extends MyCloudflare
$entity->$field = $cf->result->value;
return $entity;
}
public function create(array $formDatas, $jump_start = false): ZoneEntity
public function create(string $domain, $jump_start = false): ZoneEntity
{
//Socket용
//도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/', [
'accountId' => $this->_account_entity->getPK(),
'name' => $formDatas['domain'],
'accountId' => $this->_account_entity->getPK(),
'name' => $domain,
'jump_start' => $jump_start,
]);
$cf = json_decode($cf->getBody());
@ -106,7 +106,7 @@ class Zone extends MyCloudflare
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas);
$entity = $this->$this->getMyStorage()->create($formDatas);
//아래는 추가 셋팅 ipv6 TurnOFF , //Development mode TurnOFF
$entity = $this->setCFSetting($entity, 'ipv6', 'off');
$entity = $this->setCFSetting($entity, 'development_mode', 'off');
@ -114,7 +114,7 @@ class Zone extends MyCloudflare
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function update(ZoneEntity $entity, array $formDatas): ZoneEntity
public function modify(ZoneEntity $entity, array $formDatas): ZoneEntity
{
//ipv6 , //development_mode , //security_level
foreach ($formDatas as $field => $value) {

View File

@ -2,12 +2,13 @@
namespace App\Libraries\MyCrawler;
use App\Libraries\MySocket\WebSocket;
use App\Libraries\MyMangboard\Storage;
use Symfony\Component\DomCrawler\Crawler;
use App\Traits\FileTrait;
use App\Models\Mangboard\BoardsModel;
use App\Models\Mangboard\BoardModel;
use App\Libraries\MyStorage\MangboardStorage;
use App\Libraries\MySocket\WebSocket;
use App\Libraries\CommonLibrary;
use App\Entities\Mangboard\UserEntity;
use App\Entities\Mangboard\BoardsEntity;
@ -27,8 +28,8 @@ abstract class MyCrawler extends CommonLibrary
protected function __construct(string $host, string $board_name, UserEntity $user_entity)
{
parent::__construct();
$this->_host = $host;
$this->_board_name = $board_name;
$this->_host = $host;
$this->_board_name = $board_name;
$this->_user_entity = $user_entity;
}
abstract protected function getDetailSelector(array $listInfo): array;
@ -40,17 +41,17 @@ abstract class MyCrawler extends CommonLibrary
}
return $this->_mySocket;
}
final protected function getMyStorage(): MangboardStorage
final protected function getMyStorage(): Storage
{
if ($this->_myStorage === null) {
$this->_myStorage = new MangboardStorage($this->_board_name, $this->_user_entity);
$this->_myStorage = new Storage($this->_board_name, $this->_user_entity);
}
return $this->_myStorage;
}
final protected function getBoardsEntity(): BoardsEntity
{
if ($this->_boards_entity === null) {
$boardsModel = new BoardsModel();
$boardsModel = new BoardsModel();
$this->_boards_entity = $boardsModel->getEntityByID($this->getMyStorage()->getBoardName());
if ($this->_boards_entity === null) {
throw new \Exception(__FUNCTION__ . "=> {$this->getMyStorage()->getBoardName()}에 해당 Board 정보가 존재하지 않습니다.");
@ -85,7 +86,7 @@ abstract class MyCrawler extends CommonLibrary
{
return preg_match('/^[^?]+/', $url, $matches) ? $matches[0] : null;
}
protected function getUrlByMediaType(Crawler $node, string $media_tag, string $attr): null|string
protected function getUrlByMediaType(Crawler $node, string $media_tag, string $attr): null|string
{
switch ($media_tag) {
case 'video':
@ -143,8 +144,8 @@ abstract class MyCrawler extends CommonLibrary
throw new \Exception("URL이 파일명 형식이 아닙니다 : " . $this->getMySocket()->getHost() . $url);
}
$file_name = array_pop($file_names);
$temps = explode(".", $file_name);
$file_ext = array_pop($temps);
$temps = explode(".", $file_name);
$file_ext = array_pop($temps);
if (!$this->isFileType_FileTrait($file_ext, $media_tag)) {
throw new \Exception("파일명 형식이 {$media_tag}가 아닙니다");
}
@ -155,14 +156,14 @@ abstract class MyCrawler extends CommonLibrary
private function media_process(array $media_urls): array
{
$file_sequence = 1;
$storages = []; //CreateBoard에서 사용을 위해 DetailPage마다 초기화
$storages = []; //CreateBoard에서 사용을 위해 DetailPage마다 초기화
foreach ($media_urls as $media_tag => $urls) {
$total = count($urls);
foreach ($urls as $url) {
log_message("notice", __FUNCTION__ . " {$file_sequence}번째/총:{$total} MediaType->{$media_tag} 작업 시작");
try {
list($file_name, $content) = $this->media_download($media_tag, $url);
$storage = $this->media_save($file_sequence, $media_tag, $file_name, $content);
$storage = $this->media_save($file_sequence, $media_tag, $file_name, $content);
log_message("debug", __FUNCTION__ . " {$file_sequence}번째/총:{$total} 결과=>" . $storage->getOriginName());
$storages[] = $storage;
} catch (\Exception $e) {
@ -186,14 +187,14 @@ abstract class MyCrawler extends CommonLibrary
//Board DB 등록작업등
//미디어관련정보 entity에 넣기
$formDatas[BoardModel::TITLE] = $listInfo["title"];
$formDatas['user_pid'] = $this->getMyStorage()->getUserEntity()->getPK();
$formDatas['user_id'] = $this->getMyStorage()->getUserEntity()->getID();
$formDatas['user_name'] = $listInfo["nickname"] != "" ? $listInfo["nickname"] : $this->getMyStorage()->getUserEntity()->getTitle();
$formDatas['level'] = $this->getBoardsEntity()->getListLevel();
$formDatas['hit'] = intval($listInfo['hit']);
$formDatas['reg_date'] = date("Y-m-d H:i:s", strtotime($listInfo['date']));
$formDatas['data_type'] = "html";
$formDatas['editor_type'] = "S";
$formDatas['user_pid'] = $this->getMyStorage()->getUserEntity()->getPK();
$formDatas['user_id'] = $this->getMyStorage()->getUserEntity()->getID();
$formDatas['user_name'] = $listInfo["nickname"] != "" ? $listInfo["nickname"] : $this->getMyStorage()->getUserEntity()->getTitle();
$formDatas['level'] = $this->getBoardsEntity()->getListLevel();
$formDatas['hit'] = intval($listInfo['hit']);
$formDatas['reg_date'] = date("Y-m-d H:i:s", strtotime($listInfo['date']));
$formDatas['data_type'] = "html";
$formDatas['editor_type'] = "S";
foreach ($storages as $storage) {
if ($formDatas['image_path'] == "") {
$formDatas['image_path'] = $storage->getBasePath() . DIRECTORY_SEPARATOR . $storage->getPath() . DIRECTORY_SEPARATOR . $storage->getOriginName();
@ -243,9 +244,9 @@ abstract class MyCrawler extends CommonLibrary
private function detail_copy_process(int $cnt, array $listInfo): array
{
list($selector, $listInfo) = $this->getDetailSelector($listInfo);
$formDatas = [];
$formDatas['image_path'] = "";
$formDatas['content'] = $selector->html();
$formDatas = [];
$formDatas['image_path'] = "";
$formDatas['content'] = $selector->html();
//Board 등록작업등
$this->create_board($cnt, $listInfo, [], $formDatas);
log_message("notice", __FUNCTION__ . " 작업이 완료되었습니다.");
@ -254,8 +255,8 @@ abstract class MyCrawler extends CommonLibrary
private function detail_download_process(int $cnt, array $listInfo): array
{
list($selector, $listInfo) = $this->getDetailSelector($listInfo);
$media_urls = $this->getUrlsByMediaType($selector, "img", "src");
$media_urls = $this->getUrlsByMediaType($selector, "video", "src", $media_urls);
$media_urls = $this->getUrlsByMediaType($selector, "img", "src");
$media_urls = $this->getUrlsByMediaType($selector, "video", "src", $media_urls);
if ($this->isDebug) {
throw new \Exception(sprintf(
"\n--------------%s Debug--------------\n%s%s\n---------------------------------------\n",
@ -281,8 +282,8 @@ abstract class MyCrawler extends CommonLibrary
{
//Limit가 0이면 $listInfos 갯수만큼 다하고, LIMIT 갯수 혹은 item의 갯수중 작은수만큼 한다.
$max_limit = !$max_limit || count($listInfos) <= $max_limit ? count($listInfos) : $max_limit;
$total = count($listInfos);
$i = 1;
$total = count($listInfos);
$i = 1;
foreach ($listInfos as $listInfo) {
if ($i <= $max_limit) {
log_message("notice", __FUNCTION__ . " 게시물 {$i}번째/총:{$total} {$listInfo["nickname"]} 작업시작");

View File

@ -1,14 +1,16 @@
<?php
namespace App\Libraries\MyStorage;
namespace App\Libraries\MyMangboard;
use App\Entities\Mangboard\BoardEntity;
use App\Entities\Mangboard\BoardsEntity;
use App\Entities\Mangboard\FileEntity;
use App\Entities\Mangboard\UserEntity;
use App\Libraries\MyStorage\FileStorage;
use App\Models\Mangboard\FileModel;
use App\Traits\ImageTrait;
class MangboardStorage extends FileStorage
class Storage extends FileStorage
{
use ImageTrait;
private $_board_name = "";
@ -17,7 +19,7 @@ class MangboardStorage extends FileStorage
public function __construct(string $board_name, UserEntity $user_entity)
{
parent::__construct($board_name);
$this->_board_name = $board_name;
$this->_board_name = $board_name;
$this->_user_entity = $user_entity;
}
final public function getBoardName(): string
@ -88,24 +90,24 @@ class MangboardStorage extends FileStorage
return $content;
}
final public function create(BoardsEntity $boards_entity, BoardEntity $board_entity, string $board_table): void
private function create_file(BoardsEntity $boards_entity, BoardEntity $board_entity, string $board_table): FileEntity
{
//File DB에 넣기
$formDatas['board_pid'] = $board_entity->getPk();
$formDatas['user_pid'] = $this->_user_entity->getPK();
$formDatas['user_name'] = $this->_user_entity->getTitle();
$formDatas['board_name'] = $boards_entity->getTitle();
$formDatas['table_name'] = $board_table;
$formDatas['file_path'] = $this->getBasePath() . DIRECTORY_SEPARATOR . $this->getPath() . DIRECTORY_SEPARATOR . $this->getOriginName();
$formDatas[FileModel::TITLE] = $this->getOriginName();
$formDatas['file_type'] = $this->getMimeType();
$formDatas['file_caption'] = $this->getOriginName();
$formDatas['file_alt'] = $this->getOriginName();
$formDatas['board_pid'] = $board_entity->getPk();
$formDatas['user_pid'] = $this->_user_entity->getPK();
$formDatas['user_name'] = $this->_user_entity->getTitle();
$formDatas['board_name'] = $boards_entity->getTitle();
$formDatas['table_name'] = $board_table;
$formDatas['file_path'] = $this->getBasePath() . DIRECTORY_SEPARATOR . $this->getPath() . DIRECTORY_SEPARATOR . $this->getOriginName();
$formDatas[FileModel::TITLE] = $this->getOriginName();
$formDatas['file_type'] = $this->getMimeType();
$formDatas['file_caption'] = $this->getOriginName();
$formDatas['file_alt'] = $this->getOriginName();
$formDatas['file_description'] = "Filedata";
$formDatas['file_size'] = $this->getFileSize();
$formDatas['file_sequence'] = $this->getOriginSequence();
$formDatas['reg_date'] = date("Y-m-d H:i:s");
$entity = $this->getFileModel()->create($formDatas);
$formDatas['file_size'] = $this->getFileSize();
$formDatas['file_sequence'] = $this->getOriginSequence();
$formDatas['reg_date'] = date("Y-m-d H:i:s");
$entity = $this->getFileModel()->create($formDatas);
log_message("notice", sprintf(
"%s -> %s 게시물의 %s번째:%s 파일 등록 완료",
__FUNCTION__,
@ -113,8 +115,41 @@ class MangboardStorage extends FileStorage
$this->getOriginSequence(),
$entity->getTitle()
));
return $entity;
}
private function create_small_image(BoardEntity $board_entity, $target_name = "small", int $width = 480, int $height = 319): void
{
$fileInfo = pathinfo($this->getFullPath() . DIRECTORY_SEPARATOR . $this->getOriginName(), PATHINFO_ALL);
$target_file_name = sprintf("%s_%s.%s", $fileInfo['filename'], $target_name, $fileInfo['extension']);
if (!$this->isFileType_FileTrait($fileInfo['extension'])) {
throw new \Exception("{$this->getOriginName()} Image 형식파일이 아닙니다.");
}
// 이미지 파일 로드
$this->load_ImageTrait($this->getFullPath() . DIRECTORY_SEPARATOR . $this->getOriginName());
// 200x200으로 이미지 크기 조정
$this->resize_ImageTrait($width, $height);
// 파일 저장
$this->save_ImageTrait($this->getFullPath() . DIRECTORY_SEPARATOR . $target_file_name);
// 메모리 해제
$this->destroy_ImageTrait();
log_message("notice", sprintf(
"%s -> %s 게시물의 %s번째:%s->%s 작은이미지(W:%s,H:%s) 생성 완료",
__FUNCTION__,
$board_entity->getTitle(),
$this->getOriginSequence(),
$this->getOriginName(),
$target_file_name,
$width,
$height
));
}
final public function create(BoardsEntity $boards_entity, BoardEntity $board_entity, string $board_table): void
{
//File DB에 넣기
$this->create_file($boards_entity, $board_entity, $board_table);
//작은이미지 만들기
$this->create_small_ImageTrait($board_entity, $this);
$this->create_small_image($board_entity, $this);
}
}

View File

@ -8,13 +8,13 @@ use App\Models\CommonModel;
class AccountModel extends CommonModel
{
const TABLE = "cloudflarerecord";
const PK = "uid";
const PK = "uid";
const TITLE = "id";
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $useAutoIncrement = false;
protected $returnType = AccountEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::TITLE, 'apikey', 'oldkey', 'type', 'status', 'updated_at', 'created_at'];
protected $returnType = AccountEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::TITLE, 'apikey', 'oldkey', 'type', 'status', 'updated_at', 'created_at'];
protected $useTimestamps = true;
public function __construct()
{
@ -30,10 +30,12 @@ class AccountModel extends CommonModel
case self::TITLE:
$rules[$field] = "required|valid_emailvalid_email|is_unique[cloudflareauth.id]";
case "apikey":
$rules[$field] = $rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";;
$rules[$field] = $rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";
;
break;
case "oldkey":
$rules[$field] = $rules[$field] = "if_exist|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";;
$rules[$field] = $rules[$field] = "if_exist|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";
;
break;
case "type":
$rules[$field] = "if_exist|in_list[standard,enterprise]";
@ -44,23 +46,22 @@ class AccountModel extends CommonModel
}
return $rules;
}
public function getFormFieldOption(string $field, array $options = []): array
public function getFormFieldInputOption(string $field, array $options = []): array
{
switch ($field) {
default:
$this->where('status', DEFAULTS['STATUS']);
$this->orderBy(self::TITLE, 'asc');
$options = parent::getFormFieldOption($field, $options);
$options = parent::getFormFieldInputOption($field, $options);
break;
}
return $options;
}
public function getEntityByPK(int $uid): null | AccountEntity
public function getEntityByPK(int $uid): null|AccountEntity
{
$this->where($this->getPKField(), $uid);
return $this->getEntity();
}
public function getEntityByID(string $id): null | AccountEntity
public function getEntityByID(string $id): null|AccountEntity
{
$this->where($this->getTitleField(), $id);
return $this->getEntity();

View File

@ -8,15 +8,15 @@ use App\Entities\Cloudflare\RecordEntity;
class RecordModel extends Model
{
const TABLE = "cloudflarerecord";
const PK = "uid";
const TITLE = "host";
const TABLE = "cloudflarerecord";
const PK = "uid";
const TITLE = "host";
const PARENT = "zone_uid";
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $useAutoIncrement = false;
protected $returnType = RecordEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::PARENT, self::TITLE, 'type', 'content', 'ttl', 'proxiable', 'proxied', 'fixed', 'locked', 'updated_at', 'crated_at'];
protected $returnType = RecordEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::PARENT, self::TITLE, 'type', 'content', 'ttl', 'proxiable', 'proxied', 'fixed', 'locked', 'updated_at', 'crated_at'];
protected $useTimestamps = true;
public function __construct()
@ -31,7 +31,8 @@ class RecordModel extends Model
{
switch ($field) {
case self::PARENT:
$rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";;
$rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";
;
break;
case self::TITLE:
case "content":
@ -43,8 +44,8 @@ class RecordModel extends Model
case "ttl":
$rules[$field] = "if_exist|numeric";
break;
case "proxied":
case "proxiable":
case "proxied":
case "fixed":
case "locked":
$rules[$field] = "if_exist|in_list[on,off]";
@ -55,12 +56,22 @@ class RecordModel extends Model
}
return $rules;
}
public function getEntityByPK(int $uid): null | RecordEntity
public function getFormFieldInputOption(string $field, array $options = []): array
{
switch ($field) {
default:
$this->orderBy(self::TITLE, 'asc');
$options = parent::getFormFieldInputOption($field, $options);
break;
}
return $options;
}
public function getEntityByPK(int $uid): null|RecordEntity
{
$this->where(self::PK, $uid);
return $this->getEntity();
}
public function getEntityByID(string $id): null | RecordEntity
public function getEntityByID(string $id): null|RecordEntity
{
$this->where(self::TITLE, $id);
return $this->getEntity();
@ -97,19 +108,18 @@ class RecordModel extends Model
log_message("notice", "-----set fixed Records " . implode(",", $hosts) . "처리 완료-----");
}
}
//Index 검색어용
public function setIndexWordFilter(string $word)
//List 검색용
public function setList_WordFilter(string $word, $field = null): void
{
$this->like('host', $word, 'before'); //befor , after , both
$this->orWhere('content', $word);
parent::setList_WordFilter($word, $field);
$this->orLike('content', $word, 'both');
}
public function setIndexDateFilter($start, $end)
public function setList_OrderBy(string $order)
{
$this->where('created_at >=', $start);
$this->where('created_at <=', $end);
}
public function setIndexOrderBy($field, $order = 'ASC')
{
$this->orderBy(self::PARENT . " ASC, host ASC, {$field} {$order}");
//Join을 해서 도메인부터 Sorting하기위함
$this->join('cloudflarezone', "cloudflarezone.uid=cloudflarerecord.zone_uid");
$this->orderBy("cloudflare.domain ASC");
parent::setList_OrderBy($order);
}
}

View File

@ -9,15 +9,15 @@ use App\Entities\Cloudflare\AccountEntity;
class ZoneModel extends CommonModel
{
const TABLE = "cloudflarezone";
const PK = "uid";
const TITLE = "domain";
const TABLE = "cloudflarezone";
const PK = "uid";
const TITLE = "domain";
const PARENT = "account_uid";
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $useAutoIncrement = false;
protected $returnType = ZoneEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::PARENT, self::TITLE, 'name_servers', 'original_name_servers', 'plan', 'development_mode', 'ipv6', 'security_level', 'status', 'updated_at', 'crated_at '];
protected $returnType = ZoneEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::PARENT, self::TITLE, 'name_servers', 'original_name_servers', 'plan', 'development_mode', 'ipv6', 'security_level', 'status', 'updated_at', 'crated_at '];
protected $useTimestamps = true;
public function __construct()
{
@ -31,7 +31,8 @@ class ZoneModel extends CommonModel
{
switch ($field) {
case self::PARENT:
$rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";;
$rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";
;
break;
case self::TITLE:
case "plan":
@ -51,12 +52,25 @@ class ZoneModel extends CommonModel
}
return $rules;
}
public function getEntityByPK(int $uid): null | ZoneEntity
public function getFormFieldInputOption(string $field, array $options = []): array
{
switch ($field) {
case "status":
$options[$field] = lang($this->class_name . '.' . strtoupper($field));
break;
default:
$this->orderBy(self::TITLE, 'asc');
$options = parent::getFormFieldInputOption($field, $options);
break;
}
return $options;
}
public function getEntityByPK(int $uid): null|ZoneEntity
{
$this->where(self::PK, $uid);
return $this->getEntity();
}
public function getEntityByID(string $id): null | ZoneEntity
public function getEntityByID(string $id): null|ZoneEntity
{
$this->where(self::TITLE, $id);
return $this->getEntity();
@ -84,20 +98,19 @@ class ZoneModel extends CommonModel
$this->where(self::TITLE, $domain);
return is_null($this->first()) ? true : false;
}
//Index 검색용
public function setIndexWordFilter(string $word): void
//List 검색용
public function setList_WordFilter(string $word, $field = null): void
{
$subquery = $this->db->table(RecordModel::TABLE)->select(RecordModel::PARENT)->like('content', $word, 'both');
$this->like(self::TITLE, $word, 'both'); //befor , after , both
$this->orWhereIn(self::PK, $subquery);
//Join을 해서 Record의 content(IP검색)을 하기위함
parent::setList_WordFilter($word, $field);
$this->join('cloudflarerecord', "cloudflarezone.uid=cloudflarerecord.zone_uid");
$this->orLike('cloudflarerecord.content', $word, 'both');
// $subquery = $this->db->table(RecordModel::TABLE)->select(RecordModel::PARENT)->like('content', $word, 'both');
// $this->orWhereIn(self::PK, $subquery);
}
public function setIndexDateFilter($start, $end): void
public function setList_OrderBy(string $order): void
{
$this->where('created_at >=', $start);
$this->where('created_at <=', $end);
}
public function setIndexOrderBy($field, $order = 'ASC')
{
$this->orderBy(self::TITLE . " ASC, {$field} {$order}");
$this->orderBy(self::TITLE . " ASC");
parent::setList_OrderBy($order);
}
}

View File

@ -6,14 +6,14 @@ use CodeIgniter\Model;
abstract class CommonModel extends Model
{
protected $table = '';
protected $primaryKey = '';
protected $table = '';
protected $primaryKey = '';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $protectFields = true;
protected $allowedFields = [];
protected $useSoftDeletes = false;
protected $protectFields = true;
protected $allowedFields = [];
protected bool $allowEmptyInserts = false;
protected bool $updateOnlyChanged = true;
@ -23,27 +23,27 @@ abstract class CommonModel extends Model
// Dates
protected $useTimestamps = false;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
// Validation
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
protected $cleanValidationRules = true;
// Callbacks
protected $allowCallbacks = true;
protected $beforeInsert = [];
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
protected $beforeInsert = [];
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
private $_action = DB_ACTION["CREATE"];
protected function __construct()
@ -92,10 +92,11 @@ abstract class CommonModel extends Model
$rules[$field] .= $this->getAction() == DB_ACTION["CREATE"] ? "|is_unique[{$this->table}.{$field}]" : "";
} else {
$rules[$field] = "required|numeric";
};
}
;
break;
case $this->getTitleField():
$rules[$field] = "required|string";
$rules[$field] = "required|string";
break;
case "passwd":
$rules[$field] = $this->getAction() == DB_ACTION["CREATE"] ? "required" : "if_exist" . "|trim|string";
@ -104,13 +105,13 @@ abstract class CommonModel extends Model
$rules["confirmpassword"] = $this->getAction() == DB_ACTION["CREATE"] ? "required" : "if_exist" . "|trim|string|matches[passwd]";
break;
case "email":
$rules[$field] = "if_exist|trim|valid_email";
$rules[$field] = "if_exist|trim|valid_email";
break;
case 'image':
$rules[$field] = "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]";
$rules[$field] = "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 "status":
$rules[$field] = "if_exist|in_list[use,unuse]";
$rules[$field] = "if_exist|in_list[use,unuse]";
break;
case "updated_at":
case "created_at":
@ -130,12 +131,12 @@ abstract class CommonModel extends Model
}
return $rules;
}
public function getFormFieldOption(string $field, array $options = []): array
public function getFormFieldInputOption(string $field, array $options = []): array
{
switch ($field) {
default:
foreach ($this->getEntitys() as $entity) {
$options[$field][$entity->getPK()] = $entity->getTitle();
$options[$entity->getPK()] = $entity->getTitle();
}
break;
}
@ -157,7 +158,7 @@ abstract class CommonModel extends Model
//$formDatas에 전달된 값이 없는경우
if (!array_key_exists($field, $formDatas)) {
$randomBytes = bin2hex(random_bytes(32));
$value = sprintf(
$value = sprintf(
'%08s-%04s-%04x-%04x-%12s',
substr($randomBytes, 0, 8),
substr($randomBytes, 8, 4),
@ -212,8 +213,8 @@ abstract class CommonModel extends Model
$entity = $this->save_process($entity);
//primaryKey가 자동입력이면
if ($this->useAutoIncrement) {
$pkField = $this->getPKField();
$entity->$pkField = $this->getInsertID();
$pkField = $this->getPKField();
$entity->$pkField = $this->getInsertID();
}
log_message("debug", $this->table . "=> " . __FUNCTION__ . " 작업 완료");
return $entity;
@ -231,4 +232,24 @@ abstract class CommonModel extends Model
log_message("debug", $this->table . "=> " . __FUNCTION__ . " 작업 완료");
return $entity;
}
//List용
final public function setList_FieldFilter(string $field, int|string $value): void
{
$this->where($field, $value);
}
public function setList_WordFilter(string $word, string $field = null): void
{
$this->like($field ?? $this->getTitleField(), $word, 'before'); //befor , after , both
}
public function setList_DateFilter(string $start, string $end, $field = "created_at"): void
{
$this->where("{$field} >= {$start}");
$this->where("{$field} <= {$end}");
}
public function setList_OrderBy(string $order)
{
$this->orderBy($order);
}
}

View File

@ -10,19 +10,19 @@ trait ImageTrait
private $_image;
private $_imageType;
final protected function getWidth_ImageTrait()
final public function getWidth_ImageTrait()
{
return imagesx($this->_image);
}
// 이미지의 현재 높이를 반환하는 메소드
final protected function getHeight_ImageTrait()
final public function getHeight_ImageTrait()
{
return imagesy($this->_image);
}
// 이미지 파일을 로드하는 메소드
final protected function load_ImageTrait($file)
final public function load_ImageTrait($file)
{
$imageInfo = getimagesize($file);
$imageInfo = getimagesize($file);
$this->_imageType = $imageInfo[2];
switch ($this->_imageType) {
case IMAGETYPE_JPEG:
@ -40,7 +40,7 @@ trait ImageTrait
}
}
// 이미지 크기를 지정된 너비, 높이로 변경하는 메소드
final protected function resize_ImageTrait($width, $height)
final public function resize_ImageTrait($width, $height)
{
$newImage = imagecreatetruecolor($width, $height);
imagecopyresampled(
@ -58,26 +58,26 @@ trait ImageTrait
$this->_image = $newImage;
}
// 이미지 비율을 유지하면서 크기를 조정하는 메소드
final protected function resizeToWidth_ImageTrait($width)
final public function resizeToWidth_ImageTrait($width)
{
$ratio = $width / $this->getWidth_ImageTrait();
$ratio = $width / $this->getWidth_ImageTrait();
$height = $this->getHeight_ImageTrait() * $ratio;
$this->resize_ImageTrait($width, $height);
}
final protected function resizeToHeight_ImageTrait($height)
final public function resizeToHeight_ImageTrait($height)
{
$ratio = $height / $this->getHeight_ImageTrait();
$width = $this->getWidth_ImageTrait() * $ratio;
$this->resize_ImageTrait($width, $height);
}
final protected function scale($scale)
final public function scale($scale)
{
$width = $this->getWidth_ImageTrait() * ($scale / 100);
$width = $this->getWidth_ImageTrait() * ($scale / 100);
$height = $this->getHeight_ImageTrait() * ($scale / 100);
$this->resize_ImageTrait($width, $height);
}
// 이미지를 저장하는 메소드
final protected function save_ImageTrait($file, $imageType = IMAGETYPE_WEBP, $compression = 75)
final public function save_ImageTrait($file, $imageType = IMAGETYPE_WEBP, $compression = 75)
{
switch ($imageType) {
case IMAGETYPE_JPEG:
@ -96,35 +96,8 @@ trait ImageTrait
}
}
// 메모리 해제를 위한 메소드
final protected function destroy_ImageTrait()
final public function destroy_ImageTrait()
{
imagedestroy($this->_image);
}
public function create_small_ImageTrait(BoardEntity $board_entity, MangboardStorage $storage, $target_name = "small", int $width = 480, int $height = 319): void
{
$fileInfo = pathinfo($storage->getFullPath() . DIRECTORY_SEPARATOR . $storage->getOriginName(), PATHINFO_ALL);
$target_file_name = sprintf("%s_%s.%s", $fileInfo['filename'], $target_name, $fileInfo['extension']);
if (!$this->isFileType_FileTrait($fileInfo['extension'])) {
throw new \Exception("{$storage->getOriginName()} Image 형식파일이 아닙니다.");
}
// 이미지 파일 로드
$this->load_ImageTrait($storage->getFullPath() . DIRECTORY_SEPARATOR . $storage->getOriginName());
// 200x200으로 이미지 크기 조정
$this->resize_ImageTrait($width, $height);
// 파일 저장
$this->save_ImageTrait($storage->getFullPath() . DIRECTORY_SEPARATOR . $target_file_name);
// 메모리 해제
$this->destroy_ImageTrait();
log_message("notice", sprintf(
"%s -> %s 게시물의 %s번째:%s->%s 작은이미지(W:%s,H:%s) 생성 완료",
__FUNCTION__,
$board_entity->getTitle(),
$storage->getOriginSequence(),
$storage->getOriginName(),
$target_file_name,
$width,
$height
));
}
}

View File

@ -1,50 +1,54 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<div class="top container-fluid">
<?= form_open(current_url(), array("method" => "get")) ?>
<nav class="nav">
조건검색:<?php foreach ($viewDatas['fieldFilters'] as $field) : ?><?= getFieldFilter_UserHelper($field, $viewDatas[$field], $viewDatas) ?><?php endforeach ?>
</nav>
<?= $this->include('templates/admin/index_head') ?>
<?= form_close() ?>
</div>
<?= form_open(current_url() . '/batchjob', $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<?php foreach ($viewDatas['fields'] as $field) : ?><?= getFieldIndex_Column_UserHelper($field, $viewDatas) ?><?php endforeach ?>
<th>@</th>
</tr>
</thead>
<tbody>
<?php $cnt = 0 ?>
<?php foreach ($viewDatas['entitys'] as $entity) : ?>
<tr id="<?= $entity->getPrimaryKey() ?>" <?= $entity->status != DEFAULTS['STATUS'] ? 'class="table-danger" rowcolor="red"' : 'rowcolor="red"' ?> onClick="indexRowCheckBoxToggle(this)">
<td nowarp>
<?= form_checkbox(["id" => "checkbox_uid_{$entity->getPrimaryKey()}", "name" => "batchjob_uids[]", "value" => $entity->getPrimaryKey(), "class" => "batchjobuids_checkboxs"]); ?>
<?= anchor(current_url() . '/update/' . $entity->getPrimaryKey(), $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt), ["target" => "_self"]) ?>
</td>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<td><?= getFieldIndex_Row_UserHelper_Admin($field, $entity, $viewDatas) ?></td>
<?php endforeach ?>
<td><?= anchor(current_url() . '/delete/' . $entity->getPrimaryKey(), ICONS['DELETE'], ["class" => "btn btn-sm btn-danger btn-circle", "target" => "_self"]) ?></td>
</tr>
<?php $cnt++ ?>
<?php endforeach ?>
</tbody>
</table>
<div class="bottom">
<ul class="nav justify-content-center">
<li class="nav-item"><?= form_checkbox(array("id" => "batchjobuids_checkbox")) ?>ALL</li>
<?php foreach ($viewDatas['batchjobFilters'] as $field) : ?><?= getFieldFilter_UserHelper($field, DEFAULTS['EMPTY'], $viewDatas) ?><?php endforeach ?>
<li class="nav-item"><?= form_submit('', '일괄처리', array("class" => "btn btn-outline btn-warning")) ?></li>
<li class="nav-item"><?= anchor(current_url() . '/insert', '입력', ["class" => "btn btn-sm btn-primary btn-circle", "target" => "_self"]) ?></li>
</ul>
<?= $viewDatas['pagination'] ?>
</div>
<div class="top container-fluid">
<?= form_open(current_url(), array("method" => "get")) ?>
<nav class="nav">
조건검색:<?php foreach ($viewDatas['fieldFilters'] as $field): ?><?= getFieldFilter_UserHelper($field, $viewDatas[$field], $viewDatas) ?><?php endforeach ?>
</nav>
<?= $this->include('templates/admin/index_head') ?>
<?= form_close() ?>
</div>
<?= form_open(current_url() . '/batchjob', $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<?php foreach ($viewDatas['fields'] as $field): ?>
<?= getFieldIndex_Column_UserHelper($field, $viewDatas) ?><?php endforeach ?>
<th>@</th>
</tr>
</thead>
<tbody>
<?php $cnt = 0 ?>
<?php foreach ($viewDatas['entitys'] as $entity): ?>
<tr id="<?= $entity->getPrimaryKey() ?>" <?= $entity->status != DEFAULTS['STATUS'] ? 'class="table-danger" rowcolor="red"' : 'rowcolor="red"' ?> onClick="indexRowCheckBoxToggle(this)">
<td nowarp>
<?= form_checkbox(["id" => "checkbox_uid_{$entity->getPrimaryKey()}", "name" => "batchjob_uids[]", "value" => $entity->getPrimaryKey(), "class" => "batchjobuids_checkboxs"]); ?>
<?= anchor(current_url() . '/update/' . $entity->getPrimaryKey(), $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt), ["target" => "_self"]) ?>
</td>
<?php foreach ($viewDatas['fields'] as $field): ?>
<td><?= getFieldIndex_Row_UserHelper_Admin($field, $entity, $viewDatas) ?></td>
<?php endforeach ?>
<td>
<?= anchor(current_url() . '/delete/' . $entity->getPrimaryKey(), ICONS['DELETE'], ["class" => "btn btn-sm btn-danger btn-circle", "target" => "_self"]) ?>
</td>
</tr>
<?php $cnt++ ?>
<?php endforeach ?>
</tbody>
</table>
<div class="bottom">
<ul class="nav justify-content-center">
<li class="nav-item"><?= form_checkbox(array("id" => "batchjobuids_checkbox")) ?>ALL</li>
<?php foreach ($viewDatas['batchjobFilters'] as $field): ?>
<?= getFieldFilter_UserHelper($field, DEFAULTS['EMPTY'], $viewDatas) ?><?php endforeach ?>
<li class="nav-item"><?= form_submit('', '일괄처리', array("class" => "btn btn-outline btn-warning")) ?></li>
<li class="nav-item">
<?= anchor(current_url() . '/insert', '입력', ["class" => "btn btn-sm btn-primary btn-circle", "target" => "_self"]) ?>
</li>
</ul>
<?= $viewDatas['pagination'] ?>
</div>
<?= form_close() ?>
<?= $this->endSection() ?>

View File

@ -23,12 +23,12 @@ div#left_menu > div.accordion {
width: 20px;
display: none;
}
div#left_menu > div.accordion > div.accordion-item:hover {
div#left_menu > div.accordion div.accordion-item:hover {
background-color: #e7e7e7;
}
div#left_menu > div.accordion > div.accordion-item > a {
padding-left: 10px;
div#left_menu > div.accordion div.accordion-item a {
padding-left: 20px;
}
div#left_menu > div.accordion > div.accordion-collapse > a {
div#left_menu > div.accordion div.accordion-collapse a {
padding-left: 30px;
}