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('cloudflare', ['namespace' => 'App\Controllers\Cloudflare'], function ($routes) {
$routes->group('account', function ($routes) { $routes->group('account', function ($routes) {
$routes->get('/', 'AccountController::index'); $routes->get('/', 'AccountController::index');
$routes->get('create', 'AccountController::create_form');
$routes->post('create', 'AccountController::create'); $routes->post('create', 'AccountController::create');
}); });
$routes->group('zone', function ($routes) { $routes->group('zone', function ($routes) {
$routes->get('/', 'ZoneController::index'); $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; namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RedirectResponse;
use App\Libraries\MyCloudflare\Account; use App\Libraries\MyCloudflare\Account;
use App\Traits\AuthTrait;
use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\AccountEntity; use App\Entities\Cloudflare\AccountEntity;
class AccountController extends MVController class AccountController extends CloudflareController
{ {
use AuthTrait; private $_myLibrary = null;
private $_model = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{ {
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
$this->class_name = "Cloudflare/Account"; $this->class_name .= "Account";
$this->layout = LAYOUTS['admin']; $this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title"); $this->title = lang("{$this->class_name}.title");
$this->session = $this->session_AuthTrait();
helper($this->class_name); helper($this->class_name);
} }
final protected function getModel(): AccountModel final protected function getMyLibrary(): Account
{ {
if ($this->_model === null) { if ($this->_myLibrary === null) {
$this->_model = new AccountModel(); $this->_myLibrary = new Account();
} }
return $this->_model; return $this->_myLibrary;
} }
protected function create_init(): void 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->filter_fields = ['status'];
$this->action = DB_ACTION["CREATE"]; $this->action = DB_ACTION['CREATE'];
$this->getModel()->setAction($this->action); $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(); $entity = $this->getMyLibrary()->create($this->formDatas);
}
protected function create_process_submit(): AccountEntity
{
$account = new Account();
return $account->create($this->formDatas);
} }
public function create(): RedirectResponse public function create(): RedirectResponse
{ {
$this->create_init();
$this->formDatas = [];
$this->getFormDatas();
$this->convertFormDatas();
$this->validateFormDatas();
return parent::create_process(); 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; namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RedirectResponse;
use App\Traits\AuthTrait;
use App\Libraries\MySocket\CloudflareSocket;
use App\Libraries\MyCloudflare\Record; 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; use App\Entities\Cloudflare\RecordEntity;
class RecordController extends CloudflareController
class RecordController extends MVController
{ {
use AuthTrait; private $_myLibrary = null;
private $_model = null; private $_account_entity = null;
private $_accountModel = null; private $_zone_entity = null;
private $_zoneModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{ {
parent::initController($request, $response, $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); helper($this->class_name);
} }
final protected function getModel(): RecordModel final protected function getMyLibrary(): Record
{ {
if ($this->_model === null) { if ($this->_myLibrary === null) {
$this->_model = new RecordModel(); $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) { switch ($field) {
$this->_accountModel = new AccountModel(); 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) { switch ($field) {
$this->_zoneModel = new ZoneModel(); 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 protected function create_init(): void
{ {
$this->fields = ['id', 'apikey']; $this->fields = [
$this->filter_fields = ['status']; $this->getMyLibrary()->getMyStorage()::PARENT,
$this->action = 'create'; 'type',
$this->getModel()->setAction($this->action); '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 public function create(string $zone_uid): RedirectResponse
{
$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
{ {
$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(); return parent::create_process();
} }
} }

View File

@ -2,78 +2,143 @@
namespace App\Controllers\Cloudflare; 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 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\Libraries\MyCloudflare\Zone;
use App\Models\Cloudflare\ZoneModel; use App\Libraries\MyCloudflare\Record;
use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\ZoneEntity;
class ZoneController extends MVController class ZoneController extends CloudflareController
{ {
use AuthTrait; private $_myLibrary = null;
private $_model = null; private $_account_entity = null;
private $_accountModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{ {
parent::initController($request, $response, $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); helper($this->class_name);
} }
final protected function getModel(): ZoneModel final protected function getMyLibrary(): Zone
{ {
if ($this->_model === null) { if ($this->_myLibrary === null) {
$this->_model = new ZoneModel(); $this->_myLibrary = new Zone($this->_account_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();
}
return $this->_accountModel;
}
protected function getFormFieldOption(string $field, array $options = []): array
{ {
switch ($field) { switch ($field) {
case ZoneModel::PARENT: case $this->getMyLibrary()->getMyStorage()::PARENT:
$options = [ $options = [
DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택' 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; break;
default: default:
$options = parent::getFormFieldOption($field, $options); $options = parent::getFormFieldInputOption($field, $options);
break; break;
} }
return $options; 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 protected function create_init(): void
{ {
$this->fields = [$this->getModel()::PARENT, $this->getModel()::TITLE, 'status', 'type']; $this->fields = [
$this->filter_fields = [$this->getModel()::PARENT, 'status', 'type']; $this->getMyLibrary()->getMyStorage()::PARENT,
$this->action = 'create'; 'domains',
$this->getModel()->setAction($this->action); '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 public function create(string $account_uid): RedirectResponse
{
$account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$zone = new Zone($account_entity);
return $zone->create($this->formDatas);
}
public function create(): RedirectResponse
{ {
$this->_account_entity = $this->getAccountModel()->getEntityByPK($account_uid);
$this->formDatas = [];
$this->getFormDatas();
$this->convertFormDatas();
$this->validateFormDatas();
return parent::create_process(); return parent::create_process();
} }
} }

View File

@ -14,17 +14,14 @@ abstract class MVController extends CommonController
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
helper('common'); helper('common');
} }
abstract protected function create_init(): void; abstract protected function getMyLibrary(): mixed;
abstract protected function getModel(): mixed; abstract protected function create_process_submit(): void;
//Field별 Form Option용 abstract protected function modify_process_submit(): void;
protected function getFormFieldOption(string $field, array $options = []): array //Field별 Form Input Option용
protected function getFormFieldInputOption(string $field, array $options = []): array
{ {
switch ($field) { switch ($field) {
default: default:
$temps = lang($this->class_name . '.' . strtoupper($field));
if (!is_array($temps)) {
throw new \Exception(__FUNCTION__ . "에서 {$field}의 데이터가 array가 아닙니다.\n" . var_export($temps, true));
}
$options = [ $options = [
"" => lang($this->class_name . '.label.' . $field) . ' 선택', "" => lang($this->class_name . '.label.' . $field) . ' 선택',
...lang($this->class_name . '.' . strtoupper($field)), ...lang($this->class_name . '.' . strtoupper($field)),
@ -33,13 +30,14 @@ abstract class MVController extends CommonController
} }
return $options; return $options;
} }
//Field별 Form Input용
protected function getFormFieldInput(string $field, string $value, array $inputs = []): array protected function getFormFieldInput(string $field, string $value, array $inputs = []): array
{ {
switch ($field) { switch ($field) {
case 'status': case 'status':
$inputs[$field] = form_dropdown( $inputs[$field] = form_dropdown(
$field, $field,
$this->getFormFieldOption($field), $this->getFormFieldInputOption($field),
$value $value
); );
break; break;
@ -53,7 +51,7 @@ abstract class MVController extends CommonController
} }
return $inputs; return $inputs;
} }
final public function getFormFieldInputs(array $inputs = []): array final protected function getFormFieldInputs(array $inputs = []): array
{ {
foreach ($this->fields as $field) { foreach ($this->fields as $field) {
if (is_array($field)) { if (is_array($field)) {
@ -63,6 +61,7 @@ abstract class MVController extends CommonController
} }
return $inputs; return $inputs;
} }
//전송된 데이터 Rule
protected function getFormFieldRule(string $field, array $rules): array protected function getFormFieldRule(string $field, array $rules): array
{ {
if (is_array($field)) { if (is_array($field)) {
@ -70,38 +69,33 @@ abstract class MVController extends CommonController
} }
switch ($field) { switch ($field) {
default: default:
$rules[$field] = $this->_model->getFieldRule($field, $rules); $rules[$field] = $this->getMyLibrary()->getMyStorage()->getFieldRule($field, $rules);
;
break; break;
} }
return $rules; return $rules;
} }
final public function getFormFieldRules(array $rules = []): array final protected function getFormFieldRules(array $rules = []): array
{ {
foreach ($this->fields as $field) { foreach ($this->fields as $field) {
$rules = $this->getFormFieldRule($field, $rules); $rules = $this->getFormFieldRule($field, $rules);
} }
return $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 protected function getFormData(string $field): void
{ {
switch ($field) { switch ($field) {
default: default:
$this->formDatas[$field] = rtrim($this->request->getVar($field)); $this->formDatas[$field] = $this->request->getVar($field);
break; break;
} }
} }
final protected function getFormDatas(): void
{
foreach ($this->fields as $field) {
$this->getFormData($field);
}
}
//전송된 데이터 재정의 //전송된 데이터 재정의
protected function convertFormData(string $field): void protected function convertFormData(string $field): void
{ {
@ -110,12 +104,41 @@ abstract class MVController extends CommonController
break; break;
} }
} }
final protected function convertFormDatas(): void
final public function create_form_process(): RedirectResponse|string {
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']); helper(['form']);
try { try {
$this->create_init();
$this->forminputs = $this->getFormFieldInputs(); $this->forminputs = $this->getFormFieldInputs();
$this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; $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()); 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 final protected function create_process(): mixed
{ {
$this->getModel()->transStart(); $this->getMyLibrary()->getMyStorage()->transStart();
try { try {
$this->create_init(); $this->create_process_submit();
$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()} 작업을 완료하였습니다.");
return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/"); return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/");
} catch (\Exception $e) { } catch (\Exception $e) {
//Transaction Rollback //Transaction Rollback
$this->getModel()->transRollback(); $this->getMyLibrary()->getMyStorage()->transRollback();
log_message("error", $e->getMessage()); log_message("error", $e->getMessage());
$this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage()); $this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
$this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
return redirect()->back()->withInput(); 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 <?php
return [ return [
'title' => "Record정보", 'title' => "Record정보",
'label' => [ 'label' => [
'uid' => "번호", 'uid' => "번호",
'zone_uid' => "도메인", 'zone_uid' => "도메인",
'type' => "Type", 'type' => "Type",
'host' => "호스트명", 'host' => "호스트명",
'content' => "IP정보", 'content' => "IP정보",
'ttl' => "TTL", 'ttl' => "TTL",
'proxiable' => "proxiable", 'proxiable' => "proxiable",
'fixed' => "CDN잠금", 'fixed' => "CDN잠금",
'proxied' => "CDN기능", 'proxied' => "CDN기능",
'locked' => "서비스", 'locked' => "서비스",
'updated_at' => "수정일", 'updated_at' => "수정일",
'created_at' => "작성일" 'created_at' => "작성일",
], ],
"ZONE_UID" => [], "ZONE_UID" => [],
"TYPE" => [ "TYPE" => [
'A' => 'A', 'A' => 'A',
'AAAA' => 'AAAA(ipv6)', 'AAAA' => 'AAAA(ipv6)',
'CNAME' => 'CNAME', 'CNAME' => 'CNAME',
'MX' => 'MX', 'NS' => 'NS',
'SRV' => 'SRV', 'MX' => 'MX',
'PTR' => 'PTR', 'PTR' => 'PTR',
'SPF' => 'SPF', 'SPF' => 'SPF',
'TXT' => 'TXT', 'TXT' => 'TXT',
'NS' => 'NS', 'SRV' => 'SRV',
'INFO' => 'INFO', 'INFO' => 'INFO',
], ],
"PROXIABLE" => [ "PROXIABLE" => [
"on" => "사용", "on" => "사용",
"off" => "사용 않함", "off" => "사용 않함",
], ],
"FIXED" => [ "FIXED" => [
"on" => "사용", "on" => "고정 사용",
"off" => "사용 않함", "off" => "고정 사용 않함",
], ],
"PROXIED" => [ "PROXIED" => [
"on" => "사용", "on" => "CDN 사용",
"off" => "사용 않함", "off" => "CDN 사용 않함",
], ],
"LOCKED" => [ "LOCKED" => [
"on" => "운영중", "on" => "운영중",
"off" => "잠김", "off" => "잠김",
], ],
]; ];

View File

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

View File

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

View File

@ -18,13 +18,13 @@ class Record extends MyCloudflare
{ {
parent::__construct(); parent::__construct();
$this->_account_entity = $account_entity; $this->_account_entity = $account_entity;
$this->_zone_entity = $zone_entity; $this->_zone_entity = $zone_entity;
} }
protected function getRequest(): Guzzle protected function getRequest(): Guzzle
{ {
return $this->getMySocket()->request($this->_account_entity->getAPIKey()); return $this->getMySocket()->request($this->_account_entity->getAPIKey());
} }
final protected function getMyStorage(): RecordModel final public function getMyStorage(): RecordModel
{ {
if ($this->_myStorage === null) { if ($this->_myStorage === null) {
$this->_myStorage = new RecordModel(); $this->_myStorage = new RecordModel();
@ -33,15 +33,15 @@ class Record extends MyCloudflare
} }
protected function getArrayByResult($result): array protected function getArrayByResult($result): array
{ {
$formDatas[$this->getMyStorage()->getPKField()] = $result->id; $formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->zone_id; $formDatas[$this->getMyStorage()::PARENT] = $result->zone_id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name; $formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['type'] = $result->type; $formDatas['type'] = $result->type;
$formDatas['content'] = $result->content; $formDatas['content'] = $result->content;
$formDatas['ttl'] = (int) $result->ttl; $formDatas['ttl'] = (int)$result->ttl;
$formDatas['proxiable'] = $result->proxiable ? "on" : "off"; $formDatas['proxiable'] = $result->proxiable ? "on" : "off";
$formDatas['proxied'] = $result->proxied ? "on" : "off"; $formDatas['proxied'] = $result->proxied ? "on" : "off";
$formDatas['locked'] = "on"; $formDatas['locked'] = "on";
if (isset($result->locked) && $result->locked) { if (isset($result->locked) && $result->locked) {
$formDatas['locked'] = "off"; $formDatas['locked'] = "off";
} }
@ -49,13 +49,13 @@ class Record extends MyCloudflare
$formDatas['created_at'] = $result->created_on; $formDatas['created_at'] = $result->created_on;
return $formDatas; return $formDatas;
} }
public function create(array $formDatas): RecordEntity public function create(string $host, array $formDatas): RecordEntity
{ {
//Socket용 //Socket용
//도메인생성을 위해 Cloudflare에 전송 //도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [ $cf = $this->getRequest()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [
'name' => $formDatas['host'], 'name' => $host,
'type' => $formDatas['type'], 'type' => $formDatas['type'],
'content' => $formDatas['content'], 'content' => $formDatas['content'],
'proxied' => isset($formDatas['proxied']) && $formDatas['proxied'] === 'on' ? true : false 'proxied' => isset($formDatas['proxied']) && $formDatas['proxied'] === 'on' ? true : false
]); ]);
@ -65,19 +65,19 @@ class Record extends MyCloudflare
} }
//Storage용 //Storage용
$formDatas = $this->getArrayByResult($cf->result); $formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas); $entity = $this->$this->getMyStorage()->create($formDatas);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity; return $entity;
} }
public function update(RecordEntity $entity, array $formDatas): RecordEntity public function modify(RecordEntity $entity, array $formDatas): RecordEntity
{ {
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용 //TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$datas = [ $datas = [
'type' => isset($formDatas['type']) ? $formDatas['type'] : $entity->type, 'type' => isset($formDatas['type']) ? $formDatas['type'] : $entity->type,
'name' => isset($formDatas['host']) ? $formDatas['host'] : $entity->host, 'name' => isset($formDatas['host']) ? $formDatas['host'] : $entity->host,
'content' => isset($formDatas['content']) ? $formDatas['content'] : $entity->content, 'content' => isset($formDatas['content']) ? $formDatas['content'] : $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false, 'proxied' => $entity->proxied == 'on' ? true : false,
'ttl' => intval($entity->ttl) 'ttl' => intval($entity->ttl),
]; ];
//변경작업: 2024-08-09 //변경작업: 2024-08-09
if (isset($formDatas['proxied']) && $formDatas['proxied'] === 'on') { 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()); return $this->getMySocket()->request($this->_account_entity->getAPIKey());
} }
final protected function getMyStorage(): ZoneModel final public function getMyStorage(): ZoneModel
{ {
if ($this->_myStorage === null) { if ($this->_myStorage === null) {
$this->_myStorage = new ZoneModel(); $this->_myStorage = new ZoneModel();
@ -31,10 +31,10 @@ class Zone extends MyCloudflare
} }
protected function getArrayByResult($result): array protected function getArrayByResult($result): array
{ {
$formDatas[$this->getMyStorage()->getPKField()] = $result->id; $formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->account->id; $formDatas[$this->getMyStorage()::PARENT] = $result->account->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name; $formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['status'] = $result->status; $formDatas['status'] = $result->status;
//$formDatas['type'] = $result->type; // full 이게있는데 뭔지 잘모름 //$formDatas['type'] = $result->type; // full 이게있는데 뭔지 잘모름
$formDatas['name_servers'] = 'none'; $formDatas['name_servers'] = 'none';
if (isset($result->name_servers)) { if (isset($result->name_servers)) {
@ -54,7 +54,7 @@ class Zone extends MyCloudflare
} }
$formDatas['updated_at'] = $result->modified_on; $formDatas['updated_at'] = $result->modified_on;
$formDatas['created_at'] = $result->created_on; $formDatas['created_at'] = $result->created_on;
$formDatas['plan'] = $result->plan->name; $formDatas['plan'] = $result->plan->name;
return $formDatas; return $formDatas;
} }
//Cfzone에서 가져온 값을 zone에 setting //Cfzone에서 가져온 값을 zone에 setting
@ -91,13 +91,13 @@ class Zone extends MyCloudflare
$entity->$field = $cf->result->value; $entity->$field = $cf->result->value;
return $entity; return $entity;
} }
public function create(array $formDatas, $jump_start = false): ZoneEntity public function create(string $domain, $jump_start = false): ZoneEntity
{ {
//Socket용 //Socket용
//도메인생성을 위해 Cloudflare에 전송 //도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/', [ $cf = $this->getRequest()->post('zones/', [
'accountId' => $this->_account_entity->getPK(), 'accountId' => $this->_account_entity->getPK(),
'name' => $formDatas['domain'], 'name' => $domain,
'jump_start' => $jump_start, 'jump_start' => $jump_start,
]); ]);
$cf = json_decode($cf->getBody()); $cf = json_decode($cf->getBody());
@ -106,7 +106,7 @@ class Zone extends MyCloudflare
} }
//Storage용 //Storage용
$formDatas = $this->getArrayByResult($cf->result); $formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas); $entity = $this->$this->getMyStorage()->create($formDatas);
//아래는 추가 셋팅 ipv6 TurnOFF , //Development mode TurnOFF //아래는 추가 셋팅 ipv6 TurnOFF , //Development mode TurnOFF
$entity = $this->setCFSetting($entity, 'ipv6', 'off'); $entity = $this->setCFSetting($entity, 'ipv6', 'off');
$entity = $this->setCFSetting($entity, 'development_mode', 'off'); $entity = $this->setCFSetting($entity, 'development_mode', 'off');
@ -114,7 +114,7 @@ class Zone extends MyCloudflare
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity; return $entity;
} }
public function update(ZoneEntity $entity, array $formDatas): ZoneEntity public function modify(ZoneEntity $entity, array $formDatas): ZoneEntity
{ {
//ipv6 , //development_mode , //security_level //ipv6 , //development_mode , //security_level
foreach ($formDatas as $field => $value) { foreach ($formDatas as $field => $value) {

View File

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

View File

@ -1,14 +1,16 @@
<?php <?php
namespace App\Libraries\MyStorage; namespace App\Libraries\MyMangboard;
use App\Entities\Mangboard\BoardEntity; use App\Entities\Mangboard\BoardEntity;
use App\Entities\Mangboard\BoardsEntity; use App\Entities\Mangboard\BoardsEntity;
use App\Entities\Mangboard\FileEntity;
use App\Entities\Mangboard\UserEntity; use App\Entities\Mangboard\UserEntity;
use App\Libraries\MyStorage\FileStorage;
use App\Models\Mangboard\FileModel; use App\Models\Mangboard\FileModel;
use App\Traits\ImageTrait; use App\Traits\ImageTrait;
class MangboardStorage extends FileStorage class Storage extends FileStorage
{ {
use ImageTrait; use ImageTrait;
private $_board_name = ""; private $_board_name = "";
@ -17,7 +19,7 @@ class MangboardStorage extends FileStorage
public function __construct(string $board_name, UserEntity $user_entity) public function __construct(string $board_name, UserEntity $user_entity)
{ {
parent::__construct($board_name); parent::__construct($board_name);
$this->_board_name = $board_name; $this->_board_name = $board_name;
$this->_user_entity = $user_entity; $this->_user_entity = $user_entity;
} }
final public function getBoardName(): string final public function getBoardName(): string
@ -88,24 +90,24 @@ class MangboardStorage extends FileStorage
return $content; 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['board_pid'] = $board_entity->getPk();
$formDatas['user_pid'] = $this->_user_entity->getPK(); $formDatas['user_pid'] = $this->_user_entity->getPK();
$formDatas['user_name'] = $this->_user_entity->getTitle(); $formDatas['user_name'] = $this->_user_entity->getTitle();
$formDatas['board_name'] = $boards_entity->getTitle(); $formDatas['board_name'] = $boards_entity->getTitle();
$formDatas['table_name'] = $board_table; $formDatas['table_name'] = $board_table;
$formDatas['file_path'] = $this->getBasePath() . DIRECTORY_SEPARATOR . $this->getPath() . DIRECTORY_SEPARATOR . $this->getOriginName(); $formDatas['file_path'] = $this->getBasePath() . DIRECTORY_SEPARATOR . $this->getPath() . DIRECTORY_SEPARATOR . $this->getOriginName();
$formDatas[FileModel::TITLE] = $this->getOriginName(); $formDatas[FileModel::TITLE] = $this->getOriginName();
$formDatas['file_type'] = $this->getMimeType(); $formDatas['file_type'] = $this->getMimeType();
$formDatas['file_caption'] = $this->getOriginName(); $formDatas['file_caption'] = $this->getOriginName();
$formDatas['file_alt'] = $this->getOriginName(); $formDatas['file_alt'] = $this->getOriginName();
$formDatas['file_description'] = "Filedata"; $formDatas['file_description'] = "Filedata";
$formDatas['file_size'] = $this->getFileSize(); $formDatas['file_size'] = $this->getFileSize();
$formDatas['file_sequence'] = $this->getOriginSequence(); $formDatas['file_sequence'] = $this->getOriginSequence();
$formDatas['reg_date'] = date("Y-m-d H:i:s"); $formDatas['reg_date'] = date("Y-m-d H:i:s");
$entity = $this->getFileModel()->create($formDatas); $entity = $this->getFileModel()->create($formDatas);
log_message("notice", sprintf( log_message("notice", sprintf(
"%s -> %s 게시물의 %s번째:%s 파일 등록 완료", "%s -> %s 게시물의 %s번째:%s 파일 등록 완료",
__FUNCTION__, __FUNCTION__,
@ -113,8 +115,41 @@ class MangboardStorage extends FileStorage
$this->getOriginSequence(), $this->getOriginSequence(),
$entity->getTitle() $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 class AccountModel extends CommonModel
{ {
const TABLE = "cloudflarerecord"; const TABLE = "cloudflarerecord";
const PK = "uid"; const PK = "uid";
const TITLE = "id"; const TITLE = "id";
protected $table = self::TABLE; protected $table = self::TABLE;
protected $primaryKey = self::PK; protected $primaryKey = self::PK;
protected $useAutoIncrement = false; protected $useAutoIncrement = false;
protected $returnType = AccountEntity::class; //object,array,entity명::class protected $returnType = AccountEntity::class; //object,array,entity명::class
protected $allowedFields = [self::PK, self::TITLE, 'apikey', 'oldkey', 'type', 'status', 'updated_at', 'created_at']; protected $allowedFields = [self::PK, self::TITLE, 'apikey', 'oldkey', 'type', 'status', 'updated_at', 'created_at'];
protected $useTimestamps = true; protected $useTimestamps = true;
public function __construct() public function __construct()
{ {
@ -30,10 +30,12 @@ class AccountModel extends CommonModel
case self::TITLE: case self::TITLE:
$rules[$field] = "required|valid_emailvalid_email|is_unique[cloudflareauth.id]"; $rules[$field] = "required|valid_emailvalid_email|is_unique[cloudflareauth.id]";
case "apikey": 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; break;
case "oldkey": 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; break;
case "type": case "type":
$rules[$field] = "if_exist|in_list[standard,enterprise]"; $rules[$field] = "if_exist|in_list[standard,enterprise]";
@ -44,23 +46,22 @@ class AccountModel extends CommonModel
} }
return $rules; return $rules;
} }
public function getFormFieldOption(string $field, array $options = []): array public function getFormFieldInputOption(string $field, array $options = []): array
{ {
switch ($field) { switch ($field) {
default: default:
$this->where('status', DEFAULTS['STATUS']);
$this->orderBy(self::TITLE, 'asc'); $this->orderBy(self::TITLE, 'asc');
$options = parent::getFormFieldOption($field, $options); $options = parent::getFormFieldInputOption($field, $options);
break; break;
} }
return $options; return $options;
} }
public function getEntityByPK(int $uid): null | AccountEntity public function getEntityByPK(int $uid): null|AccountEntity
{ {
$this->where($this->getPKField(), $uid); $this->where($this->getPKField(), $uid);
return $this->getEntity(); return $this->getEntity();
} }
public function getEntityByID(string $id): null | AccountEntity public function getEntityByID(string $id): null|AccountEntity
{ {
$this->where($this->getTitleField(), $id); $this->where($this->getTitleField(), $id);
return $this->getEntity(); return $this->getEntity();

View File

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

View File

@ -9,15 +9,15 @@ use App\Entities\Cloudflare\AccountEntity;
class ZoneModel extends CommonModel class ZoneModel extends CommonModel
{ {
const TABLE = "cloudflarezone"; const TABLE = "cloudflarezone";
const PK = "uid"; const PK = "uid";
const TITLE = "domain"; const TITLE = "domain";
const PARENT = "account_uid"; const PARENT = "account_uid";
protected $table = self::TABLE; protected $table = self::TABLE;
protected $primaryKey = self::PK; protected $primaryKey = self::PK;
protected $useAutoIncrement = false; protected $useAutoIncrement = false;
protected $returnType = ZoneEntity::class; //object,array,entity명::class 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 $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; protected $useTimestamps = true;
public function __construct() public function __construct()
{ {
@ -31,7 +31,8 @@ class ZoneModel extends CommonModel
{ {
switch ($field) { switch ($field) {
case self::PARENT: 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; break;
case self::TITLE: case self::TITLE:
case "plan": case "plan":
@ -51,12 +52,25 @@ class ZoneModel extends CommonModel
} }
return $rules; 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); $this->where(self::PK, $uid);
return $this->getEntity(); return $this->getEntity();
} }
public function getEntityByID(string $id): null | ZoneEntity public function getEntityByID(string $id): null|ZoneEntity
{ {
$this->where(self::TITLE, $id); $this->where(self::TITLE, $id);
return $this->getEntity(); return $this->getEntity();
@ -84,20 +98,19 @@ class ZoneModel extends CommonModel
$this->where(self::TITLE, $domain); $this->where(self::TITLE, $domain);
return is_null($this->first()) ? true : false; return is_null($this->first()) ? true : false;
} }
//Index 검색용 //List 검색용
public function setIndexWordFilter(string $word): void public function setList_WordFilter(string $word, $field = null): void
{ {
$subquery = $this->db->table(RecordModel::TABLE)->select(RecordModel::PARENT)->like('content', $word, 'both'); //Join을 해서 Record의 content(IP검색)을 하기위함
$this->like(self::TITLE, $word, 'both'); //befor , after , both parent::setList_WordFilter($word, $field);
$this->orWhereIn(self::PK, $subquery); $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->orderBy(self::TITLE . " ASC");
$this->where('created_at <=', $end); parent::setList_OrderBy($order);
}
public function setIndexOrderBy($field, $order = 'ASC')
{
$this->orderBy(self::TITLE . " ASC, {$field} {$order}");
} }
} }

View File

@ -6,14 +6,14 @@ use CodeIgniter\Model;
abstract class CommonModel extends Model abstract class CommonModel extends Model
{ {
protected $table = ''; protected $table = '';
protected $primaryKey = ''; protected $primaryKey = '';
protected $useAutoIncrement = true; protected $useAutoIncrement = true;
protected $returnType = 'array'; protected $returnType = 'array';
protected $useSoftDeletes = false; protected $useSoftDeletes = false;
protected $protectFields = true; protected $protectFields = true;
protected $allowedFields = []; protected $allowedFields = [];
protected bool $allowEmptyInserts = false; protected bool $allowEmptyInserts = false;
protected bool $updateOnlyChanged = true; protected bool $updateOnlyChanged = true;
@ -23,27 +23,27 @@ abstract class CommonModel extends Model
// Dates // Dates
protected $useTimestamps = false; protected $useTimestamps = false;
protected $dateFormat = 'datetime'; protected $dateFormat = 'datetime';
protected $createdField = 'created_at'; protected $createdField = 'created_at';
protected $updatedField = 'updated_at'; protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at'; protected $deletedField = 'deleted_at';
// Validation // Validation
protected $validationRules = []; protected $validationRules = [];
protected $validationMessages = []; protected $validationMessages = [];
protected $skipValidation = false; protected $skipValidation = false;
protected $cleanValidationRules = true; protected $cleanValidationRules = true;
// Callbacks // Callbacks
protected $allowCallbacks = true; protected $allowCallbacks = true;
protected $beforeInsert = []; protected $beforeInsert = [];
protected $afterInsert = []; protected $afterInsert = [];
protected $beforeUpdate = []; protected $beforeUpdate = [];
protected $afterUpdate = []; protected $afterUpdate = [];
protected $beforeFind = []; protected $beforeFind = [];
protected $afterFind = []; protected $afterFind = [];
protected $beforeDelete = []; protected $beforeDelete = [];
protected $afterDelete = []; protected $afterDelete = [];
private $_action = DB_ACTION["CREATE"]; private $_action = DB_ACTION["CREATE"];
protected function __construct() protected function __construct()
@ -92,10 +92,11 @@ abstract class CommonModel extends Model
$rules[$field] .= $this->getAction() == DB_ACTION["CREATE"] ? "|is_unique[{$this->table}.{$field}]" : ""; $rules[$field] .= $this->getAction() == DB_ACTION["CREATE"] ? "|is_unique[{$this->table}.{$field}]" : "";
} else { } else {
$rules[$field] = "required|numeric"; $rules[$field] = "required|numeric";
}; }
;
break; break;
case $this->getTitleField(): case $this->getTitleField():
$rules[$field] = "required|string"; $rules[$field] = "required|string";
break; break;
case "passwd": case "passwd":
$rules[$field] = $this->getAction() == DB_ACTION["CREATE"] ? "required" : "if_exist" . "|trim|string"; $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]"; $rules["confirmpassword"] = $this->getAction() == DB_ACTION["CREATE"] ? "required" : "if_exist" . "|trim|string|matches[passwd]";
break; break;
case "email": case "email":
$rules[$field] = "if_exist|trim|valid_email"; $rules[$field] = "if_exist|trim|valid_email";
break; break;
case 'image': 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; break;
case "status": case "status":
$rules[$field] = "if_exist|in_list[use,unuse]"; $rules[$field] = "if_exist|in_list[use,unuse]";
break; break;
case "updated_at": case "updated_at":
case "created_at": case "created_at":
@ -130,12 +131,12 @@ abstract class CommonModel extends Model
} }
return $rules; return $rules;
} }
public function getFormFieldOption(string $field, array $options = []): array public function getFormFieldInputOption(string $field, array $options = []): array
{ {
switch ($field) { switch ($field) {
default: default:
foreach ($this->getEntitys() as $entity) { foreach ($this->getEntitys() as $entity) {
$options[$field][$entity->getPK()] = $entity->getTitle(); $options[$entity->getPK()] = $entity->getTitle();
} }
break; break;
} }
@ -157,7 +158,7 @@ abstract class CommonModel extends Model
//$formDatas에 전달된 값이 없는경우 //$formDatas에 전달된 값이 없는경우
if (!array_key_exists($field, $formDatas)) { if (!array_key_exists($field, $formDatas)) {
$randomBytes = bin2hex(random_bytes(32)); $randomBytes = bin2hex(random_bytes(32));
$value = sprintf( $value = sprintf(
'%08s-%04s-%04x-%04x-%12s', '%08s-%04s-%04x-%04x-%12s',
substr($randomBytes, 0, 8), substr($randomBytes, 0, 8),
substr($randomBytes, 8, 4), substr($randomBytes, 8, 4),
@ -212,8 +213,8 @@ abstract class CommonModel extends Model
$entity = $this->save_process($entity); $entity = $this->save_process($entity);
//primaryKey가 자동입력이면 //primaryKey가 자동입력이면
if ($this->useAutoIncrement) { if ($this->useAutoIncrement) {
$pkField = $this->getPKField(); $pkField = $this->getPKField();
$entity->$pkField = $this->getInsertID(); $entity->$pkField = $this->getInsertID();
} }
log_message("debug", $this->table . "=> " . __FUNCTION__ . " 작업 완료"); log_message("debug", $this->table . "=> " . __FUNCTION__ . " 작업 완료");
return $entity; return $entity;
@ -231,4 +232,24 @@ abstract class CommonModel extends Model
log_message("debug", $this->table . "=> " . __FUNCTION__ . " 작업 완료"); log_message("debug", $this->table . "=> " . __FUNCTION__ . " 작업 완료");
return $entity; 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 $_image;
private $_imageType; private $_imageType;
final protected function getWidth_ImageTrait() final public function getWidth_ImageTrait()
{ {
return imagesx($this->_image); return imagesx($this->_image);
} }
// 이미지의 현재 높이를 반환하는 메소드 // 이미지의 현재 높이를 반환하는 메소드
final protected function getHeight_ImageTrait() final public function getHeight_ImageTrait()
{ {
return imagesy($this->_image); 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]; $this->_imageType = $imageInfo[2];
switch ($this->_imageType) { switch ($this->_imageType) {
case IMAGETYPE_JPEG: 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); $newImage = imagecreatetruecolor($width, $height);
imagecopyresampled( imagecopyresampled(
@ -58,26 +58,26 @@ trait ImageTrait
$this->_image = $newImage; $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; $height = $this->getHeight_ImageTrait() * $ratio;
$this->resize_ImageTrait($width, $height); $this->resize_ImageTrait($width, $height);
} }
final protected function resizeToHeight_ImageTrait($height) final public function resizeToHeight_ImageTrait($height)
{ {
$ratio = $height / $this->getHeight_ImageTrait(); $ratio = $height / $this->getHeight_ImageTrait();
$width = $this->getWidth_ImageTrait() * $ratio; $width = $this->getWidth_ImageTrait() * $ratio;
$this->resize_ImageTrait($width, $height); $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); $height = $this->getHeight_ImageTrait() * ($scale / 100);
$this->resize_ImageTrait($width, $height); $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) { switch ($imageType) {
case IMAGETYPE_JPEG: case IMAGETYPE_JPEG:
@ -96,35 +96,8 @@ trait ImageTrait
} }
} }
// 메모리 해제를 위한 메소드 // 메모리 해제를 위한 메소드
final protected function destroy_ImageTrait() final public function destroy_ImageTrait()
{ {
imagedestroy($this->_image); 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->extend('layouts/admin') ?>
<?= $this->section('content') ?> <?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" /> <link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content"> <div class="top container-fluid">
<div class="top container-fluid"> <?= form_open(current_url(), array("method" => "get")) ?>
<?= form_open(current_url(), array("method" => "get")) ?> <nav class="nav">
<nav class="nav"> 조건검색:<?php foreach ($viewDatas['fieldFilters'] as $field): ?><?= getFieldFilter_UserHelper($field, $viewDatas[$field], $viewDatas) ?><?php endforeach ?>
조건검색:<?php foreach ($viewDatas['fieldFilters'] as $field) : ?><?= getFieldFilter_UserHelper($field, $viewDatas[$field], $viewDatas) ?><?php endforeach ?> </nav>
</nav> <?= $this->include('templates/admin/index_head') ?>
<?= $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() ?> <?= form_close() ?>
</div> </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() ?> <?= $this->endSection() ?>

View File

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