Automation init...4

This commit is contained in:
최준흠 2024-09-24 20:07:30 +09:00
parent 379ce025a6
commit da71ac2aed
180 changed files with 52 additions and 5653 deletions

View File

@ -12,12 +12,6 @@ $routes->addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}
//1. app/Filters/AuthFilter.php
//2. Config/Filters.php -> $aliases = ['authFilter' => AuthFilter::class]
$routes->get('/', 'Home::index');
$routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'authFilter:manager'], function ($routes) {
$routes->get('/', 'Home::index');
$routes->group('user', function ($routes) {
$routes->get('/', 'UserController::index');
});
});
$routes->group('mangboard', ['namespace' => 'App\Controllers\Mangboard'], function ($routes) {
$routes->group('user', function ($routes) {
$routes->get('/', 'UserController::index', ['filter' => 'authFilter:manager']);
@ -32,18 +26,3 @@ $routes->group('mangboard', ['namespace' => 'App\Controllers\Mangboard'], functi
$routes->cli('(:alpha)/(:any)/(:any)', 'CrawlerController::$1/$2');
});
});
$routes->group('cloudflare', ['namespace' => 'App\Controllers\Cloudflare', 'filter' => 'authFilter:manager'], 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->group('record', function ($routes) {
$routes->get('/', 'RecordController::index');
$routes->get('create', 'ZoneController::create_form');
});
});

View File

@ -1,13 +0,0 @@
<?php
namespace App\Controllers\Admin;
use App\Controllers\CommonController;
class Home extends CommonController
{
public function index(): string
{
return view('welcome_message');
}
}

View File

@ -1,57 +0,0 @@
<?php
namespace App\Controllers\Admin;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use App\Libraries\MyMangboard\User;
use CodeIgniter\HTTP\RedirectResponse;
use App\Models\Mangboard\UserModel;
use App\Entities\Mangboard\UserEntity;
use App\Traits\AuthTrait;
class UserController extends MVController
{
use AuthTrait;
private $_model = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name = "Admin/User";
$this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title");
$this->session = $this->session_AuthTrait();
helper($this->class_name);
}
protected function getModel(): UserModel
{
if ($this->_model === null) {
$this->_model = new UserModel();
}
return $this->_model;
}
protected function create_init(): void
{
// $this->fields = [$this->getModel()::TITLE, 'apikey', 'status'];
$this->filter_fields = ['status'];
$this->action = DB_ACTION["CREATE"];
$this->getModel()->setAction($this->action);
}
public function create_form(): RedirectResponse|string
{
return $this->create_form_process();
}
protected function create_process_submit(): UserEntity
{
$user = new User();
return $user->create($this->formDatas);
}
public function create(): RedirectResponse
{
return parent::create_process();
}
}

View File

@ -1,56 +0,0 @@
<?php
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
{
use AuthTrait;
private $_model = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$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
{
if ($this->_model === null) {
$this->_model = new AccountModel();
}
return $this->_model;
}
protected function create_init(): void
{
$this->fields = [$this->getModel()::TITLE, 'apikey', 'status'];
$this->filter_fields = ['status'];
$this->action = DB_ACTION["CREATE"];
$this->getModel()->setAction($this->action);
}
public function create_form(): RedirectResponse|string
{
return $this->create_form_process();
}
protected function create_process_submit(): AccountEntity
{
$account = new Account();
return $account->create($this->formDatas);
}
public function create(): RedirectResponse
{
return parent::create_process();
}
}

View File

@ -1,23 +0,0 @@
<?php
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;
abstract class CloudflareController extends MVController
{
use AuthTrait;
private $_model = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name = "Cloudflare/";
}
}

View File

@ -1,93 +0,0 @@
<?php
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
{
use AuthTrait;
private $_model = null;
private $_accountModel = null;
private $_zoneModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name .= "Record";
$this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title");
$this->session = $this->session_AuthTrait();
helper($this->class_name);
}
final protected function getModel(): RecordModel
{
if ($this->_model === null) {
$this->_model = new RecordModel();
}
return $this->_model;
}
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;
}
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case RecordModel::PARENT:
$options = [
DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택',
...$this->getZoneModel()->getFilterFieldOption($field, $options)
];
break;
default:
$options = parent::getFormFieldOption($field, $options);
break;
}
return $options;
}
protected function create_init(): void
{
$this->fields = ['id', 'apikey'];
$this->filter_fields = ['status'];
$this->action = 'create';
$this->getModel()->setAction($this->action);
}
public function create_form(): RedirectResponse|string
{
return $this->create_form_process();
}
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
{
return parent::create_process();
}
}

View File

@ -1,81 +0,0 @@
<?php
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\MyCloudflare\Zone;
use App\Models\Cloudflare\ZoneModel;
use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\ZoneEntity;
class ZoneController extends MVController
{
use AuthTrait;
private $_model = null;
private $_accountModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_name .= "Zone";
$this->layout = LAYOUTS['admin'];
$this->title = lang("{$this->class_name}.title");
$this->session = $this->session_AuthTrait();
helper($this->class_name);
}
final protected function getModel(): ZoneModel
{
if ($this->_model === null) {
$this->_model = new ZoneModel();
}
return $this->_model;
}
final protected function getAccountModel(): AccountModel
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
}
return $this->_accountModel;
}
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case ZoneModel::PARENT:
$options = [
DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택',
...$this->getAccountModel()->getFilterFieldOption($field, $options)
];
break;
default:
$options = parent::getFormFieldOption($field, $options);
break;
}
return $options;
}
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);
}
public function create_form(): RedirectResponse|string
{
return $this->create_form_process();
}
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
{
return parent::create_process();
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Controllers\Mangboard\Admin;
namespace App\Controllers\Mangboard;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;

View File

@ -1,31 +0,0 @@
<?php
namespace App\Entities\Cloudflare;
use App\Models\Cloudflare\AccountModel;
use App\Entities\CommonEntity;
class AccountEntity extends CommonEntity
{
public function __toString()
{
return "{$this->getPK()}|{$this->getTitle()}|{$this->getAPIKey()}|{$this->attributes['type']}|{$this->attributes['status']}";
}
public function getPK(): int
{
return $this->attributes[AccountModel::PK];
}
public function getTitle(): string
{
return $this->attributes[AccountModel::TITLE];
}
public function setTitle(string $title): void
{
$this->attributes[AccountModel::TITLE] = $title;
}
//Common Function
public function getAPIKey(): string
{
return $this->attributes['apikey'];
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Entities\Cloudflare;
use App\Models\Cloudflare\API\RecordModel;
use App\Entities\CommonEntity;
class RecordEntity extends CommonEntity
{
public function __toString()
{
return "{$this->getPK()}|{$this->getParent()}|{$this->getTitle()}|{$this->attributes['host']}|{$this->attributes['content']}|{$this->attributes['proxied']}|{$this->attributes['fixed']}|{$this->attributes['locked']}";
}
public function getPK(): int
{
return $this->attributes[RecordModel::PK];
}
public function getTitle(): string
{
return $this->attributes[RecordModel::TITLE];
}
public function setTitle(string $title): void
{
$this->attributes[RecordModel::TITLE] = $title;
}
//Common Function
public function getParent(): string
{
return $this->attributes[RecordModel::PARENT];
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Entities\Cloudflare;
use App\Models\Cloudflare\ZoneModel;
use App\Entities\CommonEntity;
class ZoneEntity extends CommonEntity
{
public function __toString()
{
return "{$this->getPK()}|{$this->getParent()}|{$this->getTitle()}|{$this->attributes['development_mode']}|{$this->attributes['ipv6']}|{$this->attributes['security_level']}";
}
public function getPK(): int
{
return $this->attributes[ZoneModel::PK];
}
public function getTitle(): string
{
return $this->attributes[ZoneModel::TITLE];
}
public function setTitle(string $title): void
{
$this->attributes[ZoneModel::TITLE] = $title;
}
//Common Function
public function getParent(): string
{
return $this->attributes[ZoneModel::PARENT];
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace App\Entities;
use App\Entities\CommonEntity;
use App\Models\SNSUserModel;
class SNSUserEntity extends CommonEntity
{
public function __toString(): string
{
return "{$this->getPK()}|{$this->getID()}|{$this->getTitle()}";
}
public function getTitle(): string
{
return $this->attributes[SNSUserModel::TITLE];
}
public function setTitle(string $title): void
{
$this->attributes[SNSUserModel::TITLE] = $title;
}
//Common Function
public function getPK(): int
{
return $this->attributes[SNSUserModel::PK];
}
public function getID(): string
{
return $this->attributes['id'];
}
}

View File

@ -1,49 +0,0 @@
<?php
namespace App\Entities;
use App\Entities\CommonEntity;
use App\Models\UserModel;
class UserEntity extends CommonEntity
{
public function __toString(): string
{
return "{$this->getPK()}:{$this->getID()}:{$this->getTitle()},{$this->getLevel()}/{$this->getPoint()}";
}
public function getPK(): int
{
return $this->attributes[UserModel::PK];
}
public function getTitle(): string
{
return $this->attributes[UserModel::TITLE];
}
public function setTitle(string $title): void
{
$this->attributes[UserModel::TITLE] = $title;
}
//Common Function
public function getID(): string
{
return $this->attributes['id'];
}
public function getPoint(): int
{
return $this->attributes['point'];
}
public function setPoint(int $point): void
{
$this->attributes['point'] = $point;
}
public function getLevel(): int
{
return $this->attributes['level'];
}
public function setLevel(int $value): void
{
$this->attributes['level'] = $value;
}
}

View File

@ -1 +0,0 @@
<?php

View File

@ -1,22 +0,0 @@
<?php
return [
'title' => "Account정보",
'label' => [
'uid' => "번호",
'id' => "인증ID",
'apikey' => "인증Key",
'oldkey' => "이전인증Key",
'type' => "가입방식",
'status' => "상태",
'updated_at' => "수정일",
'created_at' => "작성일"
],
"TYPE" => [
"standard" => "standard",
"enterprise" => "enterprise"
],
"STATUS" => [
"use" => "사용",
"unuse" => "사용않함",
]
];

View File

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

View File

@ -1,38 +0,0 @@
<?php
return [
'title' => "Zone정보",
'label' => [
'uid' => "번호",
'account_uid' => "계정",
'domain' => "도메인",
'name_servers' => "네임서버",
'original_name_servers' => "이전네임서버",
'plan' => "plan",
'development_mode' => "개발모드",
'ipv6' => "ipv6",
'security_level' => "공격방어",
'status' => "서비스",
'updated_at' => "수정일",
'created_at' => "작성일"
],
"ACCOUNT_UID" => [
],
"DEVELOPMENT_MODE" => [
"on" => "사용",
"off" => "사용않함",
],
"IPV6" => [
"on" => "사용",
"off" => "사용않함",
],
"SECURITY_LEVEL" => [
"under_attack" => "under_attack",
"medium" => "medium",
"low" => "low",
"essentially_off" => "essentially_off"
],
"STATUS" => [
"active" => "active",
"pending" => "pending",
],
];

View File

@ -1,16 +0,0 @@
<?php
return [
'title' => "URL Mapping 정보",
'label' => [
'uid' => "번호",
'oldurl' => "기존URL",
'newurl' => "신규URL",
'status' => "상태",
'updated_at' => "수정일",
'created_at' => "작성일"
],
"STATUS" => [
"use" => "사용",
"unuse" => "사용않함",
]
];

View File

@ -1,27 +0,0 @@
<?php
return [
'title' => "계정정보",
'label' => [
'uid' => "번호",
'id' => "계정",
'passwd' => "암호",
'confirmpassword' => "암호확인",
'email' => "메일",
'role' => "권한",
'name' => "이름",
'status' => "상태",
'updated_at' => "수정일",
'created_at' => "작성일"
],
"ROLE" => [
"member" => "회원",
"manager" => "관리자",
"cloudflare" => "Cloudflare관리자",
"director" => "감독자",
"master" => "마스터"
],
"STATUS" => [
"use" => "사용",
"unuse" => "사용않함",
]
];

View File

@ -1,70 +0,0 @@
<?php
namespace App\Libraries\MyCloudflare;
use Cloudflare\API\Adapter\Guzzle;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\MyCloudflare\MyCloudflare;
use App\Entities\Cloudflare\AccountEntity;
class Account extends MyCloudflare
{
private $_myStorage = null;
public function __construct()
{
parent::__construct();
}
final protected function getMyStorage(): AccountModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new AccountModel();
}
return $this->_myStorage;
}
//Result 형태
// [
// {"id":"078e88a7735965b661715af13031ecb0",
// "name":"Cloudwin002@idcjp.jp's Auth",
// "type":"standard",
// "settings":{
// "enforce_twofactor":false,
// "api_access_enabled":null,
// "access_approval_expiry":null,
// "use_account_custom_ns_by_default":false
// },
// "legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}},
// "created_on":"2017-06-26T05:44:49.470184Z"}
// ]
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['type'] = $result->type;
$formDatas['status'] = 'use';
$formDatas['updated_at'] = $result->created_on;
$formDatas['created_at'] = $result->created_on;
return $formDatas;
}
public function create(array $formDatas): AccountEntity
{
//Socket용
$cf = $this->getMySocket()->request($formDatas['apikey'])
->post('accounts', [
'name' => $formDatas[$this->getMyStorage()->getTitleField()],
'type' => $formDatas['type'],
]);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->getMyStorage()->create($formDatas);
log_message("notice", "Account::" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
protected function reload_entity($cf): AccountEntity
{
return $this->getMyStorage()->modify(new AccountEntity, $this->getArrayByResult($cf));
}
}

View File

@ -1,67 +0,0 @@
<?php
namespace App\Libraries\MyCloudflare;
use Cloudflare\API\Adapter\Guzzle;
use App\Libraries\MySocket\CloudflareSocket;
use App\Libraries\CommonLibrary;
abstract class MyCloudflare extends CommonLibrary
{
private $_mySocket = null;
protected function __construct()
{
parent::__construct();
}
abstract protected function getArrayByResult($result): array;
abstract protected function reload_entity($cf): mixed;
abstract protected function getMyStorage(): mixed;
final protected function getMySocket(): CloudflareSocket
{
if ($this->_mySocket === null) {
$this->_mySocket = new CloudflareSocket();
}
return $this->_mySocket;
}
//-----------------------필수항목-------------------//
final protected function reload_entitys(string $parent, array $cfs): array
{
$entity_uids = [];
if (count($cfs)) {
$cnt = 1;
foreach ($cfs as $cf) {
$entity = $this->reload_entity($cf);
$entity_uids[] = $entity->getPK();
log_message("debug", "{$cnt}번째: {$entity->getTitle()} 저장");
$cnt++;
}
//부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용
$this->getMyStorage()->where($this->getMyStorage()::PARENT, $parent);
$this->getMyStorage()->whereNotIn($this->getMyStorage()->getPKField(), $entity_uids);
$this->getMyStorage()->delete();
}
return $entity_uids;
}
final protected function reload_cfs(Guzzle $request, $uri): array
{
$page = 1; //Page는 1부터 시작해야함
$perpage_max = getenv("cfmgr.request.perpage.max");
$cfs = [];
do {
$query = [
'page' => $page,
'per_page' => $perpage_max,
'match' => 'all'
];
$cf = $request->get($uri, $query);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
$cfs = [$cfs, ...$cf->result];
//Loop 제한 : 한페이지에서 가져온 갯수가 perpage_max보다 적다는것은 더이상 다음페이지기 없으므로 0로 종료시키기 위함
$page = count($cf->result) < $perpage_max ? 0 : $page + 1;
} while (0 < $page);
return $cfs;
}
}

View File

@ -1,134 +0,0 @@
<?php
namespace App\Libraries\MyCloudflare;
use Cloudflare\API\Adapter\Guzzle;
use App\Models\Cloudflare\API\RecordModel;
use App\Libraries\MyCloudflare\MyCloudflare;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\RecordEntity;
use App\Entities\Cloudflare\AccountEntity;
class Record extends MyCloudflare
{
private $_myStorage = null;
private $_account_entity = null;
private $_zone_entity = null;
public function __construct(AccountEntity $account_entity, ZoneEntity $zone_entity)
{
parent::__construct();
$this->_account_entity = $account_entity;
$this->_zone_entity = $zone_entity;
}
protected function getRequest(): Guzzle
{
return $this->getMySocket()->request($this->_account_entity->getAPIKey());
}
final protected function getMyStorage(): RecordModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new RecordModel();
}
return $this->_myStorage;
}
protected function getArrayByResult($result): array
{
$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";
if (isset($result->locked) && $result->locked) {
$formDatas['locked'] = "off";
}
// $formDatas['updated_at'] = $cfResult->modified_on;
$formDatas['created_at'] = $result->created_on;
return $formDatas;
}
public function create(array $formDatas): RecordEntity
{
//Socket용
//도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [
'name' => $formDatas['host'],
'type' => $formDatas['type'],
'content' => $formDatas['content'],
'proxied' => isset($formDatas['proxied']) && $formDatas['proxied'] === 'on' ? true : false
]);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
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,
'content' => isset($formDatas['content']) ? $formDatas['content'] : $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false,
'ttl' => intval($entity->ttl)
];
//변경작업: 2024-08-09
if (isset($formDatas['proxied']) && $formDatas['proxied'] === 'on') {
$datas['proxied'] = true;
$datas['ttl'] = 1;
} elseif (isset($formDatas['proxied']) && $formDatas['proxied'] === 'off') {
$datas['proxied'] = false;
$datas['ttl'] = 120;
}
$cf = $this->getRequest()->put('zones/' . $this->_zone_entity->getPK() . '/dns_records', $datas);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->modify($formDatas);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function delete(RecordEntity $entity): void
{
$cf = $this->getRequest()->delete('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
$this->$this->getMyStorage()->delete($entity);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
}
public function sync(RecordEntity $entity): RecordEntity
{
$cf = $this->getRequest()->get('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->modify($entity, $formDatas);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
protected function reload_entity($cf): RecordEntity
{
return $this->getMyStorage()->modify(new RecordEntity, $this->getArrayByResult($cf));
}
public function reload(): void
{
$cfs = $this->reload_cfs($this->getRequest(), 'zones/' . $this->_zone_entity->getPK() . '/dns_records');
log_message("notice", "-----{$this->_zone_entity->getTitle()} 처리[" . count($cfs) . "개] 시작-----");
$entitys = $this->reload_entitys($this->_zone_entity->getPK(), $cfs);
log_message("notice", "-----{$this->_zone_entity->getTitle()} DB 처리[" . count($entitys) . "개] 완료-----");
}
}

View File

@ -1,160 +0,0 @@
<?php
namespace App\Libraries\MyCloudflare;
use App\Models\Cloudflare\ZoneModel;
use App\Libraries\MyCloudflare\MyCloudflare;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\AccountEntity;
use Cloudflare\API\Adapter\Guzzle;
class Zone extends MyCloudflare
{
private $_myStorage = null;
private $_account_entity = null;
public function __construct(AccountEntity $account_entity)
{
parent::__construct();
$this->_account_entity = $account_entity;
}
private function getRequest(): Guzzle
{
return $this->getMySocket()->request($this->_account_entity->getAPIKey());
}
final protected function getMyStorage(): ZoneModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new ZoneModel();
}
return $this->_myStorage;
}
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->account->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['status'] = $result->status;
//$formDatas['type'] = $result->type; // full 이게있는데 뭔지 잘모름
$formDatas['name_servers'] = 'none';
if (isset($result->name_servers)) {
$formDatas['name_servers'] = is_array($result->name_servers) ?
implode(
',',
$result->name_servers
) : $result->name_servers;
}
$formDatas['original_name_servers'] = 'none';
if (isset($result->original_name_servers)) {
$formDatas['original_name_servers'] = is_array($result->original_name_servers) ?
implode(
',',
$result->original_name_servers
) : $result->original_name_servers;
}
$formDatas['updated_at'] = $result->modified_on;
$formDatas['created_at'] = $result->created_on;
$formDatas['plan'] = $result->plan->name;
return $formDatas;
}
//Cfzone에서 가져온 값을 zone에 setting
final public function getCFSetting(ZoneEntity $entity): ZoneEntity
{
$cf = $this->getRequest()->patch('zones/' . $entity->getPK() . '/settings/');
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
foreach ($cf->result as $cf) {
switch ($cf->id) {
case 'development_mode':
$entity->development_mode = $cf->value;
break;
case 'ipv6':
$entity->ipv6 = $cf->value;
break;
case 'security_level':
$entity->security_level = $cf->value;
break;
}
}
return $entity;
}
final public function setCFSetting(ZoneEntity $entity, string $field, string $value): ZoneEntity
{
$cf = $this->getRequest()->patch('zones/' . $entity->getPK() . '/settings/' . $field, array('value' => $value));
$cf = json_decode($cf->getBody());
if (!$cf->success || $cf->result->id !== $field) {
throw new \Exception("Zone:" . __FUNCTION__ . "에서 {$field}->{$value} 변경실패:\n" . var_export($cf, true));
}
//최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음
$entity->$field = $cf->result->value;
return $entity;
}
public function create(array $formDatas, $jump_start = false): ZoneEntity
{
//Socket용
//도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/', [
'accountId' => $this->_account_entity->getPK(),
'name' => $formDatas['domain'],
'jump_start' => $jump_start,
]);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas);
//아래는 추가 셋팅 ipv6 TurnOFF , //Development mode TurnOFF
$entity = $this->setCFSetting($entity, 'ipv6', 'off');
$entity = $this->setCFSetting($entity, 'development_mode', 'off');
$entity = $this->setCFSetting($entity, 'security_level', 'medium');
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function modify(ZoneEntity $entity, array $formDatas): ZoneEntity
{
//ipv6 , //development_mode , //security_level
foreach ($formDatas as $field => $value) {
$entity = $this->setCFSetting($entity, $field, $value);
}
$entity = $this->$this->getMyStorage()->modify($entity);
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function delete(ZoneEntity $entity): void
{
$cf = $this->getRequest()->delete('zones/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
$this->$this->getMyStorage()->delete($entity);
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
}
public function sync(ZoneEntity $entity): ZoneEntity
{
$cf = $this->getRequest()->get('zones/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
$formDatas = $this->getArrayByResult(result: $cf->result);
$entity = $this->$this->getMyStorage()->modify($entity, $formDatas);
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
protected function reload_entity($cf): ZoneEntity
{
return $this->getMyStorage()->modify(new ZoneEntity, $this->getArrayByResult($cf));
}
public function reload(): void
{
$cfs = $this->reload_cfs($this->getRequest(), 'zones');
log_message("notice", "-----{$this->_account_entity->getTitle()} 처리[" . count($cfs) . "개] 시작-----");
$entitys = $this->reload_entitys($this->_account_entity->getPK(), $cfs);
log_message("notice", "-----{$this->_account_entity->getTitle()} DB 처리[" . count($entitys) . "개] 완료-----");
}
}

View File

@ -6,7 +6,7 @@ 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\MyMangboard\Storage;
use App\Libraries\MySocket\WebSocket;
use App\Libraries\CommonLibrary;
use App\Entities\Mangboard\UserEntity;
@ -40,10 +40,10 @@ 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;
}

View File

@ -1,14 +1,16 @@
<?php
namespace App\Libraries\MyStorage;
namespace App\Libraries\MyMangboard;
use App\Traits\ImageTrait;
use App\Models\Mangboard\FileModel;
use App\Libraries\MyStorage\FileStorage;
use App\Entities\Mangboard\UserEntity;
use App\Entities\Mangboard\FileEntity;
use App\Entities\Mangboard\BoardsEntity;
use App\Entities\Mangboard\BoardEntity;
class MangboardStorage extends FileStorage
class Storage extends FileStorage
{
use ImageTrait;
private $_board_name = "";
@ -88,9 +90,8 @@ class MangboardStorage extends FileStorage
return $content;
}
final public function create(BoardsEntity $boards_entity, BoardEntity $board_entity, string $board_table): void
private function create_db(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();
@ -113,8 +114,41 @@ class MangboardStorage extends FileStorage
$this->getOriginSequence(),
$entity->getTitle()
));
return $entity;
}
public 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_db($boards_entity, $board_entity, $board_table);
//작은이미지 만들기
$this->create_small_ImageTrait($board_entity, $this);
$this->create_small_image($board_entity);
}
}

View File

@ -1,69 +0,0 @@
<?php
namespace App\Libraries\MySocket;
use Cloudflare\API\Auth\APIKey;
use Cloudflare\API\Adapter\Guzzle;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\CommonLibrary;
// use App\Entities\Cloudflare\AccountEntity;
// use Cloudflare\API\Endpoints\Zones;
// use Cloudflare\API\Endpoints\DNS;
// use Cloudflare\API\Endpoints\Accounts;
class CloudflareSocket extends CommonLibrary
{
private static int $_request = 0;
private static int $_request_max = 100;
private static int $_request_timewait = 60;
private $_accountModel = null;
private $_clients = [];
public function __construct()
{
parent::__construct();
$this->initAdapters();
self::$_request_max = getenv("cfmgr.request.max");
}
final protected function getAccountModel(): AccountModel
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
}
return $this->_accountModel;
}
final public function initAdapters(): void
{
foreach ($this->getAccountModel()->getEntitys() as $entity) {
$this->_clients[$entity->getAPIKey()] = new Guzzle(
new APIKey($entity->getTitle(), $entity->getAPIKey())
);
}
}
public function request(string $apikey): Guzzle
{
if (!array_key_exists($apikey, $this->_clients)) {
throw new \Exception(+__FUNCTION__ . " => {$apikey}에 해당하는 Adapter를 찾을수 없습니다.");
}
if (self::$_request >= self::$_request_max) {
log_message('warning', sprintf("--Cloudflare API Call %s초 대기 시작--", self::$_request_timewait));
sleep(intval(getenv("cf.mgr.request.time.wait")));
self::$_request = 0;
log_message('warning', sprintf("--Cloudflare API Call %s초 대기 종료--", self::$_request_timewait));
}
self::$_request++;
return $this->_clients[$apikey];
}
// public function getAccount(string $apikey): Accounts
// {
// return new Accounts($this->request($apikey));
// }
// public function getZone(string $apikey): Zones
// {
// return new Zones($this->request($apikey));
// }
// public function getRecord(string $apikey): DNS
// {
// return new DNS($this->request($apikey));
// }
}

View File

@ -1,78 +0,0 @@
<?php
namespace App\Models\Cloudflare;
use App\Entities\Cloudflare\AccountEntity;
use App\Models\CommonModel;
class AccountModel extends CommonModel
{
const TABLE = "cloudflarerecord";
const PK = "uid";
const TITLE = "id";
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 $useTimestamps = true;
public function __construct()
{
parent::__construct();
}
public function getTitleField(): string
{
return self::TITLE;
}
public function getFieldRule(string $field, array $rules): array
{
switch ($field) {
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}/]";;
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}/]";;
break;
case "type":
$rules[$field] = "if_exist|in_list[standard,enterprise]";
break;
default:
$rules = parent::getFieldRule($field, $rules);
break;
}
return $rules;
}
public function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
default:
$this->where('status', DEFAULTS['STATUS']);
$this->orderBy(self::TITLE, 'asc');
$options = parent::getFormFieldOption($field, $options);
break;
}
return $options;
}
public function getEntityByPK(int $uid): null | AccountEntity
{
$this->where($this->getPKField(), $uid);
return $this->getEntity();
}
public function getEntityByID(string $id): null | AccountEntity
{
$this->where($this->getTitleField(), $id);
return $this->getEntity();
}
//create용
public function create(array $formDatas = []): AccountEntity
{
return $this->create_process(new AccountEntity(), $formDatas);
}
//modify용
public function modify(AccountEntity $entity, array $formDatas): AccountEntity
{
return $this->modify_process($entity, $formDatas);
}
}

View File

@ -1,115 +0,0 @@
<?php
namespace App\Models\Cloudflare\API;
use CodeIgniter\Model;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\RecordEntity;
class RecordModel extends Model
{
const TABLE = "cloudflarerecord";
const PK = "uid";
const TITLE = "host";
const PARENT = "zone_uid";
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 $useTimestamps = true;
public function __construct()
{
parent::__construct();
}
public function getTitleField(): string
{
return self::TITLE;
}
public function getFieldRule(string $field, array $rules): array
{
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}/]";;
break;
case self::TITLE:
case "content":
$rules[$field] = "required|trim|string";
break;
case "type":
$rules[$field] = "required|in_list[A,AAA,CNAME,MX,NS,PTR,SPF,TXT,SRV,INFO]";
break;
case "ttl":
$rules[$field] = "if_exist|numeric";
break;
case "proxied":
case "proxiable":
case "fixed":
case "locked":
$rules[$field] = "if_exist|in_list[on,off]";
break;
default:
$rules = parent::getFieldRule($field, $rules);
break;
}
return $rules;
}
public function getEntityByPK(int $uid): null | RecordEntity
{
$this->where(self::PK, $uid);
return $this->getEntity();
}
public function getEntityByID(string $id): null | RecordEntity
{
$this->where(self::TITLE, $id);
return $this->getEntity();
}
//create용
public function create(array $formDatas = []): RecordEntity
{
return $this->create_process(new RecordEntity(), $formDatas);
}
//modify용
public function modify(RecordEntity $entity, array $formDatas): RecordEntity
{
return $this->modify_process($entity, $formDatas);
}
public function getEntitysByParent(ZoneEntity $zone_entity)
{
$this->where(self::PARENT, $zone_entity->getPK());
return $this->getEntitys();
}
//도메인이 이미 존재하는지 체크
public function isUniqueHost($zone_uid, string $host, string $content): bool
{
$this->where(self::PARENT, $zone_uid);
$this->where('host', $host);
$this->where('content', $content);
return is_null($this->first()) ? true : false;
}
//CDN값 수정 못하는 고정 Record 처리
public function setFixedCDNRecord(array $hosts)
{
if (count($hosts)) {
$this->whereIn('host', $hosts)->set(['fixed' => 'on'])->update();
log_message("notice", "-----set fixed Records " . implode(",", $hosts) . "처리 완료-----");
}
}
//Index 검색어용
public function setIndexWordFilter(string $word)
{
$this->like('host', $word, 'before'); //befor , after , both
$this->orWhere('content', $word);
}
public function setIndexDateFilter($start, $end)
{
$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}");
}
}

View File

@ -1,114 +0,0 @@
<?php
namespace App\Models\Cloudflare;
use App\Models\CommonModel;
use App\Models\Cloudflare\API\RecordModel;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\AccountEntity;
class ZoneModel extends CommonModel
{
const TABLE = "cloudflarezone";
const PK = "uid";
const TITLE = "domain";
const PARENT = "account_uid";
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 $useTimestamps = true;
public function __construct()
{
parent::__construct();
}
public function getTitleField(): string
{
return self::TITLE;
}
public function getFieldRule(string $field, array $rules): array
{
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}/]";;
break;
case self::TITLE:
case "plan":
$rules[$field] = "required|trim|string";
break;
case "name_servers":
case "security_level":
$rules[$field] = "if_exist|trim|string";
break;
case "development_mode":
case "ipv6":
$rules[$field] = "if_exist|in_list[on,off]";
break;
default:
$rules = parent::getFieldRule($field, $rules);
break;
}
return $rules;
}
public function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
default:
$this->where('status', DEFAULTS['STATUS']);
$this->orderBy(self::TITLE, 'asc');
$options = parent::getFormFieldOption($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
{
$this->where(self::TITLE, $id);
return $this->getEntity();
}
public function getEntitysByParent(AccountEntity $account_entity)
{
$this->where(self::PARENT, $account_entity->getPK());
return $this->getEntitys();
}
//create용
public function create(array $formDatas = []): ZoneEntity
{
return $this->create_process(new ZoneEntity(), $formDatas);
}
//modify용
public function modify(ZoneEntity $entity, array $formDatas): ZoneEntity
{
return $this->modify_process($entity, $formDatas);
}
//도메인이 이미 존재하는지 체크
public function isUniqueDomain(string $account_uid, string $domain): bool
{
$this->where(self::PARENT, $account_uid);
$this->where(self::TITLE, $domain);
return is_null($this->first()) ? true : false;
}
//Index 검색용
public function setIndexWordFilter(string $word): 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);
}
public function setIndexDateFilter($start, $end): void
{
$this->where('created_at >=', $start);
$this->where('created_at <=', $end);
}
public function setIndexOrderBy($field, $order = 'ASC')
{
$this->orderBy(self::TITLE . " ASC, {$field} {$order}");
}
}

View File

@ -10,17 +10,17 @@ 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);
$this->_imageType = $imageInfo[2];
@ -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();
$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);
$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 +0,0 @@
<?= $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>
<?= form_close() ?>
</div>
<?= $this->endSection() ?>

View File

@ -1,24 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<?= form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="form table table-bordered table-striped">
<tbody>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldForm_UserHelper($field, DEFAULTS['EMPTY'], $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td valign="bottom" colspan="2"><?= form_submit('', '입력', array("class" => "btn btn-outline btn-primary")); ?></td>
</tr>
</tbody>
<?= form_close(); ?>
</table>
</div>
<?= $this->endSection() ?>

View File

@ -1,24 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<?= form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="form table table-bordered table-striped">
<tbody>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldForm_UserHelper($field, $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'], $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td valign="bottom" colspan="2"><?= form_submit('', '수정', array("class" => "btn btn-outline btn-primary")); ?></td>
</tr>
</tbody>
<?= form_close(); ?>
</table>
</div>
<?= $this->endSection() ?>

View File

@ -1,19 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<table class="form table table-bordered table-striped">
<tbody>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldView_UserHelper($field, $viewDatas['entity'], $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?= $this->endSection() ?>

View File

@ -1,5 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<?= $this->include('templates/admin/header'); ?>
<?= $this->include('templates/admin/footer'); ?>
<?= $this->endSection() ?>

View File

@ -1,5 +0,0 @@
<?php foreach ($cellDatas['entitys'] as $entity) : ?>
<?php foreach (['title', 'created_at'] as $field) : ?>
<div><?= getFieldCell_Row_BoardHelper($field, $entity, $cellDatas) ?></div>
<?php endforeach ?>
<?php endforeach ?>

View File

@ -1,5 +0,0 @@
<?php foreach ($cellDatas['entitys'] as $entity) : ?>
<?php foreach (['title', 'created_at'] as $field) : ?>
<div><?= getFieldCell_Row_BoardHelper($field, $entity, $cellDatas) ?></div>
<?php endforeach ?>
<?php endforeach ?>

View File

@ -1,82 +0,0 @@
<link href="/css/front/device_calculator.css" media="screen" rel="stylesheet" type="text/css" />
<script>
function calculator(order_price = 0) {
var cellDatas = Array.from(document.getElementsByClassName("vhost_cellDatas"));
cellDatas.forEach(function(part) { //loop
//console.log(part);
order_price += parseInt((part.getAttribute('cost') - part.getAttribute('sale')) * part.options[part.selectedIndex].value);
document.getElementById('price').value = order_price;
document.getElementById('order_price').textContent = new Intl.NumberFormat().format(order_price);
});
var current = document.getElementById('paymentday');
if (!current.selectedIndex) {
alert("결제일을 선택해주세요");
current.focus();
return false
}
}
</script>
<div id="device_calculator">
<?= form_open(URLS['addCart'], [
'method' => 'post',
"onsubmit" => 'return calculator()'
]) ?>
<input type="hidden" id="category" name="category" value="device">
<input type="hidden" id="price" name="price">
<table>
<thead>
<tr>
<th scope="col" colspan="3">가상서버 견적 계산기</th>
</tr>
</thead>
<tbody>
<?php foreach ($cellDatas['device']['categorys'] as $category) : ?>
<?php
$options = [];
foreach ($cellDatas['device']['options'][$category] as $entity) {
$options[$entity->getPrimaryKey()] = $entity->getTitleWithPrice();
}
?>
<tr>
<td><?= lang("Device.CATEGORY.{$category}") ?></td>
<td>
<?= form_dropdown(
$category,
$options,
old($category, 0),
[
'id' => $category,
'class' => 'vhost_cellDatas',
'onChange' => "calculator()"
]
) ?>
</td>
</tr>
<?php endforeach ?>
<tr>
<th>결제일</th>
<td class="column">
<?php $paymentDayOptions = ['' => "결제일 선택"];
for ($i = 1; $i <= 28; $i++) {
$paymentDayOptions[$i] = "매월 {$i}";
}
?>
<?= form_dropdown('paymentday', $paymentDayOptions, old('paymentday', 25), ['id' => 'paymentday']);
?>
</td>
</tr>
<tr>
<th class="none">주문금액</th>
<td class="none" colspan="3">
<span id="order_price">0</span>
<?= form_submit('', '신청', array("class" => "btn btn-outline btn-primary")); ?>
</td>
</tr>
</tbody>
</table>
<?= form_close() ?>
<script type="text/javascript">
window.onload = calculator();
</script>
<?= $cellDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($cellDatas['session']->getFlashdata('return_message')) : "" ?>
</div>

View File

@ -1,43 +0,0 @@
<script>
function addDevice(category, key, label) {
var categoryBox = document.getElementById(category + "Box");
var div = document.createElement("div");
var checkbox = document.createElement("input");
checkbox.setAttribute("type", "checkbox");
checkbox.setAttribute("name", category + '[]');
checkbox.setAttribute("value", key);
checkbox.setAttribute("checked", true);
checkbox.setAttribute("class", 'device');
div.appendChild(checkbox);
div.appendChild(document.createTextNode(label));
// console.log(div);
categoryBox.appendChild(div);
}
</script>
<table class="table table-bordered" style="width: auto;">
<tr>
<?php foreach ($cellDatas['categorys'] as $category) : ?>
<th style="background-color:silver; text-align:center;"><?= lang('Device.CATEGORY.' . $category) . " 선택" ?></th>
<?php endforeach ?>
</tr>
<tr>
<?php foreach ($cellDatas['categorys'] as $category) : ?>
<td id="<?= $category ?>Box">
<?php foreach ($cellDatas['selecteds'][$category] as $key => $productDevieceEntity) : ?>
<div><input type="checkbox" id="<?= $key ?>" name="<?= $category ?>[]" value="<?= $productDevieceEntity->device_uid ?>" checked class="device"><?= $cellDatas['deviceEntitys'][$productDevieceEntity->device_uid]->getTitle() ?></div>
<?php endforeach ?>
</td>
<?php endforeach ?>
</tr>
<tr>
<?php foreach ($cellDatas['categorys'] as $category) : ?>
<td>
<?php foreach ($cellDatas['device']['options'][$category] as $key => $label) : ?>
<button type="button" class="device btn btn-light" data-bs-toggle="tooltip" data-bs-placement="bottom" title="<?= number_format($cellDatas['deviceEntitys'][$key]->getPrice()) ?>원" onClick="addDevice('<?= $category ?>','<?= $key ?>','<?= $label ?>')">
<?= $label ?>
</button>
<?php endforeach ?>
</td>
<?php endforeach ?>
</tr>
</table>

View File

@ -1,30 +0,0 @@
<div class="modal fade device-virtual" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<table class="table table-bordered" style="width: auto;">
<tr>
<?php foreach ($cellDatas['device']['categorys'] as $category) : ?>
<th style="background-color:silver; text-align:center;"><?= lang('Device.CATEGORY.' . $category) . " 선택" ?></th>
<?php endforeach ?>
</tr>
<tr>
<?php foreach ($cellDatas['device']['categorys'] as $category) : ?>
<td>
<?= form_dropdown(
$category,
$cellDatas['device']['options'][$category],
old($category, 0),
[
'id' => $category,
'size' => "6",
'class' => 'vhost_cellDatas',
'onChange' => "calculator()"
]
) ?>
</td>
<?php endforeach ?>
</tr>
</table>
</div>
</div>
</div>

View File

@ -1,87 +0,0 @@
<link href="/css/front/virtual_calculator.css" media="screen" rel="stylesheet" type="text/css" />
<script>
function calculator(order_price) {
var parts = Array.from(document.getElementsByClassName("vhost_parts"));
parts.forEach(function(part) { //loop
//console.log(part);
order_price += parseInt((part.getAttribute('cost') - part.getAttribute('sale')) * part.options[part.selectedIndex].value);
document.getElementById('price').value = order_price;
document.getElementById('order_price').textContent = new Intl.NumberFormat().format(order_price);
});
var current = document.getElementById('paymentday');
if (!current.selectedIndex) {
alert("결제일을 선택해주세요");
current.focus();
return false
}
}
</script>
<div id="virtual_calculator">
<?= form_open(URLS['addCart'], [
'method' => 'post',
"onsubmit" => 'return calculator(' . $cellDatas['parts']['virtual']['default']['baserate'] . ')'
]) ?>
<input type="hidden" id="category" name="category" value="virtual">
<input type="hidden" id="price" name="price">
<table>
<thead>
<tr>
<th scope="col" colspan="3">가상서버 견적 계산기</th>
</tr>
</thead>
<tbody>
<tr>
<th>기본요금</th>
<td>
<strong><?= number_format($cellDatas['parts']['virtual']['default']['baserate']) ?>원</strong>
</td>
</tr>
<?php foreach ($cellDatas['parts']['virtual']['category'] as $category => $attrs) : ?>
<tr>
<th><?= $attrs['label'] ?></th>
<td>
<strong class="line-through"><?= number_format($attrs['cost']) ?>원</strong>
<strong class="f-back">할인가 <?= number_format($attrs['cost'] - $attrs['sale']) ?></strong> *
<?= form_dropdown(
$category,
$attrs['options'],
old($category, 0),
[
'id' => $category,
'class' => 'vhost_parts',
'cost' => $attrs['cost'],
'sale' => $attrs['sale'],
'onChange' => "calculator(" . $cellDatas['parts']['virtual']['default']['baserate'] . ")"
]
) ?>
<?= $attrs['unit'] ?>
</td>
</tr>
<?php endforeach ?>
<tr>
<th>결제일</th>
<td class="column">
<?php $paymentDayOptions = ['' => "결제일 선택"];
for ($i = 1; $i <= 28; $i++) {
$paymentDayOptions[$i] = "매월 {$i}";
}
?>
<?= form_dropdown('paymentday', $paymentDayOptions, old('paymentday', 25), ['id' => 'paymentday']);
?>
</td>
</tr>
<tr>
<th class="none">주문금액</th>
<td class="none" colspan="3">
<span id="order_price">0</span>
<?= form_submit('', '신청', array("class" => "btn btn-outline btn-primary")); ?>
</td>
</tr>
</tbody>
</table>
<?= form_close() ?>
<script type="text/javascript">
window.onload = calculator(<?= $cellDatas['parts']['virtual']['default']['baserate'] ?>);
</script>
<?= $cellDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($cellDatas['session']->getFlashdata('return_message')) : "" ?>
</div>

View File

@ -1,22 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<?= form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="form table table-bordered table-striped">
<?php foreach ($viewDatas['fields'] as $field): ?>
<tr>
<td class="label"><?= lang($viewDatas['class_name'] . '.label.' . $field) ?></td>
<td class="column">
<?= $viewDatas['forminputs'][$field] ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td valign="bottom" colspan="2">
<?= form_submit('', '입력', array("class" => "btn btn-outline btn-primary")); ?>
</td>
</tr>
<?= form_close(); ?>
</table>
<?= $this->endSection() ?>

View File

@ -1,50 +0,0 @@
<?= $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>
<?= form_close() ?>
</div>
<?= $this->endSection() ?>

View File

@ -1,24 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<?= form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="form table table-bordered table-striped">
<tbody>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldForm_UserHelper($field, $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'], $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td valign="bottom" colspan="2"><?= form_submit('', '수정', array("class" => "btn btn-outline btn-primary")); ?></td>
</tr>
</tbody>
<?= form_close(); ?>
</table>
</div>
<?= $this->endSection() ?>

View File

@ -1,19 +0,0 @@
<?= $this->extend('layouts/admin') ?>
<?= $this->section('content') ?>
<link href="/css/admin/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<table class="form table table-bordered table-striped">
<tbody>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldView_UserHelper($field, $viewDatas['entity'], $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?= $this->endSection() ?>

View File

@ -1,7 +0,0 @@
<?php
use CodeIgniter\CLI\CLI;
CLI::error('ERROR: ' . $code);
CLI::write($message);
CLI::newLine();

View File

@ -1,65 +0,0 @@
<?php
use CodeIgniter\CLI\CLI;
// The main Exception
CLI::write('[' . $exception::class . ']', 'light_gray', 'red');
CLI::write($message);
CLI::write('at ' . CLI::color(clean_path($exception->getFile()) . ':' . $exception->getLine(), 'green'));
CLI::newLine();
$last = $exception;
while ($prevException = $last->getPrevious()) {
$last = $prevException;
CLI::write(' Caused by:');
CLI::write(' [' . $prevException::class . ']', 'red');
CLI::write(' ' . $prevException->getMessage());
CLI::write(' at ' . CLI::color(clean_path($prevException->getFile()) . ':' . $prevException->getLine(), 'green'));
CLI::newLine();
}
// The backtrace
if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) {
$backtraces = $last->getTrace();
if ($backtraces) {
CLI::write('Backtrace:', 'green');
}
foreach ($backtraces as $i => $error) {
$padFile = ' '; // 4 spaces
$padClass = ' '; // 7 spaces
$c = str_pad($i + 1, 3, ' ', STR_PAD_LEFT);
if (isset($error['file'])) {
$filepath = clean_path($error['file']) . ':' . $error['line'];
CLI::write($c . $padFile . CLI::color($filepath, 'yellow'));
} else {
CLI::write($c . $padFile . CLI::color('[internal function]', 'yellow'));
}
$function = '';
if (isset($error['class'])) {
$type = ($error['type'] === '->') ? '()' . $error['type'] : $error['type'];
$function .= $padClass . $error['class'] . $type . $error['function'];
} elseif (! isset($error['class']) && isset($error['function'])) {
$function .= $padClass . $error['function'];
}
$args = implode(', ', array_map(static fn ($value) => match (true) {
is_object($value) => 'Object(' . $value::class . ')',
is_array($value) => count($value) ? '[...]' : '[]',
$value === null => 'null', // return the lowercased version
default => var_export($value, true),
}, array_values($error['args'] ?? [])));
$function .= '(' . $args . ')';
CLI::write($function);
CLI::newLine();
}
}

View File

@ -1,5 +0,0 @@
<?php
// On the CLI, we still want errors in productions
// so just use the exception template.
include __DIR__ . '/error_exception.php';

View File

@ -1,190 +0,0 @@
:root {
--main-bg-color: #fff;
--main-text-color: #555;
--dark-text-color: #222;
--light-text-color: #c7c7c7;
--brand-primary-color: #E06E3F;
--light-bg-color: #ededee;
--dark-bg-color: #404040;
}
body {
height: 100%;
background: var(--main-bg-color);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
color: var(--main-text-color);
font-weight: 300;
margin: 0;
padding: 0;
}
h1 {
font-weight: lighter;
font-size: 3rem;
color: var(--dark-text-color);
margin: 0;
}
h1.headline {
margin-top: 20%;
font-size: 5rem;
}
.text-center {
text-align: center;
}
p.lead {
font-size: 1.6rem;
}
.container {
max-width: 75rem;
margin: 0 auto;
padding: 1rem;
}
.header {
background: var(--light-bg-color);
color: var(--dark-text-color);
}
.header .container {
padding: 1rem;
}
.header h1 {
font-size: 2.5rem;
font-weight: 500;
}
.header p {
font-size: 1.2rem;
margin: 0;
line-height: 2.5;
}
.header a {
color: var(--brand-primary-color);
margin-left: 2rem;
display: none;
text-decoration: none;
}
.header:hover a {
display: inline;
}
.environment {
background: var(--dark-bg-color);
color: var(--light-text-color);
text-align: center;
padding: 0.2rem;
}
.source {
background: #343434;
color: var(--light-text-color);
padding: 0.5em 1em;
border-radius: 5px;
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 0.85rem;
margin: 0;
overflow-x: scroll;
}
.source span.line {
line-height: 1.4;
}
.source span.line .number {
color: #666;
}
.source .line .highlight {
display: block;
background: var(--dark-text-color);
color: var(--light-text-color);
}
.source span.highlight .number {
color: #fff;
}
.tabs {
list-style: none;
list-style-position: inside;
margin: 0;
padding: 0;
margin-bottom: -1px;
}
.tabs li {
display: inline;
}
.tabs a:link,
.tabs a:visited {
padding: 0 1rem;
line-height: 2.7;
text-decoration: none;
color: var(--dark-text-color);
background: var(--light-bg-color);
border: 1px solid rgba(0,0,0,0.15);
border-bottom: 0;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
display: inline-block;
}
.tabs a:hover {
background: var(--light-bg-color);
border-color: rgba(0,0,0,0.15);
}
.tabs a.active {
background: var(--main-bg-color);
color: var(--main-text-color);
}
.tab-content {
background: var(--main-bg-color);
border: 1px solid rgba(0,0,0,0.15);
}
.content {
padding: 1rem;
}
.hide {
display: none;
}
.alert {
margin-top: 2rem;
display: block;
text-align: center;
line-height: 3.0;
background: #d9edf7;
border: 1px solid #bcdff1;
border-radius: 5px;
color: #31708f;
}
table {
width: 100%;
overflow: hidden;
}
th {
text-align: left;
border-bottom: 1px solid #e7e7e7;
padding-bottom: 0.5rem;
}
td {
padding: 0.2rem 0.5rem 0.2rem 0;
}
tr:hover td {
background: #f1f1f1;
}
td pre {
white-space: pre-wrap;
}
.trace a {
color: inherit;
}
.trace table {
width: auto;
}
.trace tr td:first-child {
min-width: 5em;
font-weight: bold;
}
.trace td {
background: var(--light-bg-color);
padding: 0 1rem;
}
.trace td pre {
margin: 0;
}
.args {
display: none;
}

View File

@ -1,116 +0,0 @@
var tabLinks = new Array();
var contentDivs = new Array();
function init()
{
// Grab the tab links and content divs from the page
var tabListItems = document.getElementById('tabs').childNodes;
console.log(tabListItems);
for (var i = 0; i < tabListItems.length; i ++)
{
if (tabListItems[i].nodeName == "LI")
{
var tabLink = getFirstChildWithTagName(tabListItems[i], 'A');
var id = getHash(tabLink.getAttribute('href'));
tabLinks[id] = tabLink;
contentDivs[id] = document.getElementById(id);
}
}
// Assign onclick events to the tab links, and
// highlight the first tab
var i = 0;
for (var id in tabLinks)
{
tabLinks[id].onclick = showTab;
tabLinks[id].onfocus = function () {
this.blur()
};
if (i == 0)
{
tabLinks[id].className = 'active';
}
i ++;
}
// Hide all content divs except the first
var i = 0;
for (var id in contentDivs)
{
if (i != 0)
{
console.log(contentDivs[id]);
contentDivs[id].className = 'content hide';
}
i ++;
}
}
function showTab()
{
var selectedId = getHash(this.getAttribute('href'));
// Highlight the selected tab, and dim all others.
// Also show the selected content div, and hide all others.
for (var id in contentDivs)
{
if (id == selectedId)
{
tabLinks[id].className = 'active';
contentDivs[id].className = 'content';
}
else
{
tabLinks[id].className = '';
contentDivs[id].className = 'content hide';
}
}
// Stop the browser following the link
return false;
}
function getFirstChildWithTagName(element, tagName)
{
for (var i = 0; i < element.childNodes.length; i ++)
{
if (element.childNodes[i].nodeName == tagName)
{
return element.childNodes[i];
}
}
}
function getHash(url)
{
var hashPos = url.lastIndexOf('#');
return url.substring(hashPos + 1);
}
function toggle(elem)
{
elem = document.getElementById(elem);
if (elem.style && elem.style['display'])
{
// Only works with the "style" attr
var disp = elem.style['display'];
}
else if (elem.currentStyle)
{
// For MSIE, naturally
var disp = elem.currentStyle['display'];
}
else if (window.getComputedStyle)
{
// For most other browsers
var disp = document.defaultView.getComputedStyle(elem, null).getPropertyValue('display');
}
// Toggle the state of the "display" style
elem.style.display = disp == 'block' ? 'none' : 'block';
return false;
}

View File

@ -1,84 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><?= lang('Errors.pageNotFound') ?></title>
<style>
div.logo {
height: 200px;
width: 155px;
display: inline-block;
opacity: 0.08;
position: absolute;
top: 2rem;
left: 50%;
margin-left: -73px;
}
body {
height: 100%;
background: #fafafa;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #777;
font-weight: 300;
}
h1 {
font-weight: lighter;
letter-spacing: normal;
font-size: 3rem;
margin-top: 0;
margin-bottom: 0;
color: #222;
}
.wrap {
max-width: 1024px;
margin: 5rem auto;
padding: 2rem;
background: #fff;
text-align: center;
border: 1px solid #efefef;
border-radius: 0.5rem;
position: relative;
}
pre {
white-space: normal;
margin-top: 1.5rem;
}
code {
background: #fafafa;
border: 1px solid #efefef;
padding: 0.5rem 1rem;
border-radius: 5px;
display: block;
}
p {
margin-top: 1.5rem;
}
.footer {
margin-top: 2rem;
border-top: 1px solid #efefef;
padding: 1em 2em 0 2em;
font-size: 85%;
color: #999;
}
a:active,
a:link,
a:visited {
color: #dd4814;
}
</style>
</head>
<body>
<div class="wrap">
<h1>404</h1>
<p>
<?php if (ENVIRONMENT !== 'production') : ?>
<?= nl2br(esc($message)) ?>
<?php else : ?>
<?= lang('Errors.sorryCannotFind') ?>
<?php endif; ?>
</p>
</div>
</body>
</html>

View File

@ -1,430 +0,0 @@
<?php
use CodeIgniter\HTTP\Header;
use Config\Services;
use CodeIgniter\CodeIgniter;
$errorId = uniqid('error', true);
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex">
<title><?= esc($title) ?></title>
<style>
<?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
</style>
<script>
<?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
</script>
</head>
<body onload="init()">
<!-- Header -->
<div class="header">
<div class="environment">
Displayed at <?= esc(date('H:i:sa')) ?> &mdash;
PHP: <?= esc(PHP_VERSION) ?> &mdash;
CodeIgniter: <?= esc(CodeIgniter::CI_VERSION) ?> --
Environment: <?= ENVIRONMENT ?>
</div>
<div class="container">
<h1><?= esc($title), esc($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
<p>
<?= nl2br(esc($exception->getMessage())) ?>
<a href="https://www.duckduckgo.com/?q=<?= urlencode($title . ' ' . preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())) ?>"
rel="noreferrer" target="_blank">search &rarr;</a>
</p>
</div>
</div>
<!-- Source -->
<div class="container">
<p><b><?= esc(clean_path($file)) ?></b> at line <b><?= esc($line) ?></b></p>
<?php if (is_file($file)) : ?>
<div class="source">
<?= static::highlightFile($file, $line, 15); ?>
</div>
<?php endif; ?>
</div>
<div class="container">
<?php
$last = $exception;
while ($prevException = $last->getPrevious()) {
$last = $prevException;
?>
<pre>
Caused by:
<?= esc($prevException::class), esc($prevException->getCode() ? ' #' . $prevException->getCode() : '') ?>
<?= nl2br(esc($prevException->getMessage())) ?>
<a href="https://www.duckduckgo.com/?q=<?= urlencode($prevException::class . ' ' . preg_replace('#\'.*\'|".*"#Us', '', $prevException->getMessage())) ?>"
rel="noreferrer" target="_blank">search &rarr;</a>
<?= esc(clean_path($prevException->getFile()) . ':' . $prevException->getLine()) ?>
</pre>
<?php
}
?>
</div>
<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) : ?>
<div class="container">
<ul class="tabs" id="tabs">
<li><a href="#backtrace">Backtrace</a></li>
<li><a href="#server">Server</a></li>
<li><a href="#request">Request</a></li>
<li><a href="#response">Response</a></li>
<li><a href="#files">Files</a></li>
<li><a href="#memory">Memory</a></li>
</ul>
<div class="tab-content">
<!-- Backtrace -->
<div class="content" id="backtrace">
<ol class="trace">
<?php foreach ($trace as $index => $row) : ?>
<li>
<p>
<!-- Trace info -->
<?php if (isset($row['file']) && is_file($row['file'])) : ?>
<?php
if (isset($row['function']) && in_array($row['function'], ['include', 'include_once', 'require', 'require_once'], true)) {
echo esc($row['function'] . ' ' . clean_path($row['file']));
} else {
echo esc(clean_path($row['file']) . ' : ' . $row['line']);
}
?>
<?php else: ?>
{PHP internal code}
<?php endif; ?>
<!-- Class/Method -->
<?php if (isset($row['class'])) : ?>
&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= esc($row['class'] . $row['type'] . $row['function']) ?>
<?php if (! empty($row['args'])) : ?>
<?php $argsId = $errorId . 'args' . $index ?>
( <a href="#" onclick="return toggle('<?= esc($argsId, 'attr') ?>');">arguments</a> )
<div class="args" id="<?= esc($argsId, 'attr') ?>">
<table cellspacing="0">
<?php
$params = null;
// Reflection by name is not available for closure function
if (! str_ends_with($row['function'], '}')) {
$mirror = isset($row['class']) ? new ReflectionMethod($row['class'], $row['function']) : new ReflectionFunction($row['function']);
$params = $mirror->getParameters();
}
foreach ($row['args'] as $key => $value) : ?>
<tr>
<td><code><?= esc(isset($params[$key]) ? '$' . $params[$key]->name : "#{$key}") ?></code></td>
<td><pre><?= esc(print_r($value, true)) ?></pre></td>
</tr>
<?php endforeach ?>
</table>
</div>
<?php else : ?>
()
<?php endif; ?>
<?php endif; ?>
<?php if (! isset($row['class']) && isset($row['function'])) : ?>
&nbsp;&nbsp;&mdash;&nbsp;&nbsp; <?= esc($row['function']) ?>()
<?php endif; ?>
</p>
<!-- Source? -->
<?php if (isset($row['file']) && is_file($row['file']) && isset($row['class'])) : ?>
<div class="source">
<?= static::highlightFile($row['file'], $row['line']) ?>
</div>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ol>
</div>
<!-- Server -->
<div class="content" id="server">
<?php foreach (['_SERVER', '_SESSION'] as $var) : ?>
<?php
if (empty($GLOBALS[$var]) || ! is_array($GLOBALS[$var])) {
continue;
} ?>
<h3>$<?= esc($var) ?></h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<?php foreach ($GLOBALS[$var] as $key => $value) : ?>
<tr>
<td><?= esc($key) ?></td>
<td>
<?php if (is_string($value)) : ?>
<?= esc($value) ?>
<?php else: ?>
<pre><?= esc(print_r($value, true)) ?></pre>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endforeach ?>
<!-- Constants -->
<?php $constants = get_defined_constants(true); ?>
<?php if (! empty($constants['user'])) : ?>
<h3>Constants</h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<?php foreach ($constants['user'] as $key => $value) : ?>
<tr>
<td><?= esc($key) ?></td>
<td>
<?php if (is_string($value)) : ?>
<?= esc($value) ?>
<?php else: ?>
<pre><?= esc(print_r($value, true)) ?></pre>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<!-- Request -->
<div class="content" id="request">
<?php $request = Services::request(); ?>
<table>
<tbody>
<tr>
<td style="width: 10em">Path</td>
<td><?= esc($request->getUri()) ?></td>
</tr>
<tr>
<td>HTTP Method</td>
<td><?= esc($request->getMethod()) ?></td>
</tr>
<tr>
<td>IP Address</td>
<td><?= esc($request->getIPAddress()) ?></td>
</tr>
<tr>
<td style="width: 10em">Is AJAX Request?</td>
<td><?= $request->isAJAX() ? 'yes' : 'no' ?></td>
</tr>
<tr>
<td>Is CLI Request?</td>
<td><?= $request->isCLI() ? 'yes' : 'no' ?></td>
</tr>
<tr>
<td>Is Secure Request?</td>
<td><?= $request->isSecure() ? 'yes' : 'no' ?></td>
</tr>
<tr>
<td>User Agent</td>
<td><?= esc($request->getUserAgent()->getAgentString()) ?></td>
</tr>
</tbody>
</table>
<?php $empty = true; ?>
<?php foreach (['_GET', '_POST', '_COOKIE'] as $var) : ?>
<?php
if (empty($GLOBALS[$var]) || ! is_array($GLOBALS[$var])) {
continue;
} ?>
<?php $empty = false; ?>
<h3>$<?= esc($var) ?></h3>
<table style="width: 100%">
<thead>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<?php foreach ($GLOBALS[$var] as $key => $value) : ?>
<tr>
<td><?= esc($key) ?></td>
<td>
<?php if (is_string($value)) : ?>
<?= esc($value) ?>
<?php else: ?>
<pre><?= esc(print_r($value, true)) ?></pre>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endforeach ?>
<?php if ($empty) : ?>
<div class="alert">
No $_GET, $_POST, or $_COOKIE Information to show.
</div>
<?php endif; ?>
<?php $headers = $request->headers(); ?>
<?php if (! empty($headers)) : ?>
<h3>Headers</h3>
<table>
<thead>
<tr>
<th>Header</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<?php foreach ($headers as $name => $value) : ?>
<tr>
<td><?= esc($name, 'html') ?></td>
<td>
<?php
if ($value instanceof Header) {
echo esc($value->getValueLine(), 'html');
} else {
foreach ($value as $i => $header) {
echo ' ('. $i+1 . ') ' . esc($header->getValueLine(), 'html');
}
}
?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<!-- Response -->
<?php
$response = Services::response();
$response->setStatusCode(http_response_code());
?>
<div class="content" id="response">
<table>
<tr>
<td style="width: 15em">Response Status</td>
<td><?= esc($response->getStatusCode() . ' - ' . $response->getReasonPhrase()) ?></td>
</tr>
</table>
<?php $headers = $response->headers(); ?>
<?php if (! empty($headers)) : ?>
<h3>Headers</h3>
<table>
<thead>
<tr>
<th>Header</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<?php foreach ($headers as $name => $value) : ?>
<tr>
<td><?= esc($name, 'html') ?></td>
<td>
<?php
if ($value instanceof Header) {
echo esc($response->getHeaderLine($name), 'html');
} else {
foreach ($value as $i => $header) {
echo ' ('. $i+1 . ') ' . esc($header->getValueLine(), 'html');
}
}
?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<!-- Files -->
<div class="content" id="files">
<?php $files = get_included_files(); ?>
<ol>
<?php foreach ($files as $file) :?>
<li><?= esc(clean_path($file)) ?></li>
<?php endforeach ?>
</ol>
</div>
<!-- Memory -->
<div class="content" id="memory">
<table>
<tbody>
<tr>
<td>Memory Usage</td>
<td><?= esc(static::describeMemory(memory_get_usage(true))) ?></td>
</tr>
<tr>
<td style="width: 12em">Peak Memory Usage:</td>
<td><?= esc(static::describeMemory(memory_get_peak_usage(true))) ?></td>
</tr>
<tr>
<td>Memory Limit:</td>
<td><?= esc(ini_get('memory_limit')) ?></td>
</tr>
</tbody>
</table>
</div>
</div> <!-- /tab-content -->
</div> <!-- /container -->
<?php endif; ?>
</body>
</html>

View File

@ -1,25 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex">
<title><?= lang('Errors.whoops') ?></title>
<style>
<?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
</style>
</head>
<body>
<div class="container text-center">
<h1 class="headline"><?= lang('Errors.whoops') ?></h1>
<p class="lead"><?= lang('Errors.weHitASnag') ?></p>
</div>
</body>
</html>

View File

@ -1,41 +0,0 @@
<?= $this->extend('layouts/front') ?>
<?= $this->section('content') ?>
<link href="/css/front/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<div><?= html_entity_decode($viewDatas['currentCategory']->head) ?></div>
<div class="top"><?= $this->include('templates/front/index_head') ?></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 ?>
</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 nowrap>
<!-- 사용자가 자신의 작성한것인지 확인되면 update 가능-->
<?php if ($viewDatas[SESSION_NAMES['ISLOGIN']] && $entity->getPrimaryKey() == $viewDatas['auth'][AUTH_FIELDS['ID']]) : ?>
<?= anchor(current_url() . '/update/' . $entity->getPrimaryKey(), $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt), ["target" => "_self"]) ?>
<?php else : ?>
<?= $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt) ?>
<?php endif ?>
</td>
<?php foreach ($viewDatas['fields'] as $field) : ?>
<td><?= getFieldIndex_Row_UserHelper($field, $entity, $viewDatas) ?></td>
<?php endforeach ?>
</tr>
<?php $cnt++ ?>
<?php endforeach ?>
</tbody>
</table>
<div class="bottom">
<?= $viewDatas['pagination'] ?>
</div>
<?= form_close() ?>
<div><?= html_entity_decode($viewDatas['currentCategory']->tail) ?></div>
</div>
<?= $this->endSection() ?>

View File

@ -1,24 +0,0 @@
<?= $this->extend('layouts/front') ?>
<?= $this->section('content') ?>
<link href="/css/front/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<div><?= html_entity_decode($viewDatas['currentCategory']->head) ?></div>
<?= form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="form table table-bordered table-hover table-striped">
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldForm_UserHelper($field, old($field, DEFAULTS['EMPTY']), $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td valign="bottom" colspan="2" style="text-align:center;"><?= form_submit('', '회원가입', array("class" => "btn btn-outline btn-primary")); ?></td>
</tr>
</table>
<?= form_close(); ?>
<div><?= html_entity_decode($viewDatas['currentCategory']->tail) ?></div>
</div>
<?= $this->endSection() ?>

View File

@ -1,39 +0,0 @@
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<link href="/css/front/content.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/css/common/login.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<div class="login container">
<?= form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table style="width:60%; margin-left:80px;">
<tr>
<td class=" label" nowrap>계정</td>
<td class="column">
<?= form_input('id', old('id', DEFAULTS['EMPTY']), ['tabindex' => 0]) ?>
</td>
<td rowspan="2" class="submit">
<?= form_input([
'type' => 'image', 'src' => "/images/common/btn_login.png",
'width' => '57', 'height' => '60', 'tabindex' => 2
]) ?>
</td>
</tr>
<tr>
<td class="label" nowrap>암호</td>
<td class="column">
<?= form_password('passwd', old('passwd', DEFAULTS['EMPTY']), ['tabindex' => 1]) ?>
</td>
</tr>
<tr>
<td colspan="3" class="login_bottom">
<a href="/front/user/insert">회원가입</a>
<?php foreach ($viewDatas['login_buttons'] as $key => $login_button) : ?>
<?= $login_button ?>
<?php endforeach ?>
</td>
</tr>
</table>
<?= form_close(); ?>
</div>
</div>
<?= $this->endSection() ?>

View File

@ -1,37 +0,0 @@
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<link href="/css/front/content.css" media="screen" rel="stylesheet" type="text/css" />
<link href="/css/common/login_v1.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<div class="login container">
<?= form_open(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<div class="row mb-3">
<div class="label_column col-3">
<label class="col-form-label">아이디</label>
</div>
<div class="col-9">
<?= form_input('id', old('id', DEFAULTS['EMPTY'])) ?>
</div>
</div>
<div class="row mb-3">
<div class="label_column col-3">
<label class="col-form-label">비밀번호</label>
</div>
<div class="col-9">
<?= form_password('passwd', old('passwd', DEFAULTS['EMPTY'])) ?>
</div>
</div>
<div class="row">
<div class="col-12 text-center d-grid">
<?= form_submit('', '로그인', array("class" => "btn btn-outline btn-primary")) ?>
</div>
</div>
<div class="login_bottom row">
<div class="col"><a href="/front/user/insert">회원가입</a></div>
<!-- <div class="col"><a href="/front/user/findid">아이디찾기</a></div>
<div class="col"><a href="/front/user/findpw">비밀번호찾기</a></div> -->
</div>
</div>
<?= form_close(); ?>
</div>
<?= $this->endSection() ?>

View File

@ -1,24 +0,0 @@
<?= $this->extend('layouts/front') ?>
<?= $this->section('content') ?>
<link href="/css/front/content.css" media="screen" rel="stylesheet" type="text/css" />
<div id="content">
<div><?= html_entity_decode($viewDatas['currentCategory']->head) ?></div>
<?= form_open_multipart(current_url(), $viewDatas['forms']['attributes'], $viewDatas['forms']['hiddens']) ?>
<table class="form table table-bordered table-hover table-striped">
<?php foreach ($viewDatas['fields'] as $field) : ?>
<tr>
<td class="label"><?= getFieldLabel_UserHelper($field, $viewDatas) ?></td>
<td class="column">
<?= getFieldForm_UserHelper($field, old($field, $viewDatas['entity']->$field ?: DEFAULTS['EMPTY']), $viewDatas) ?>
<?= validation_show_error($field); ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td valign="bottom" colspan="2" style="text-align:center;"><?= form_submit('', '수정', array("class" => "btn btn-outline btn-primary")); ?></td>
</tr>
</table>
<?= form_close(); ?>
<div><?= html_entity_decode($viewDatas['currentCategory']->tail) ?></div>
</div>
<?= $this->endSection() ?>

View File

@ -1,342 +0,0 @@
<?= $this->extend('layouts/main') ?>
<?= $this->section('content') ?>
<link href="/css/main/content.css" media="screen" rel="stylesheet" type="text/css" />
<div class="main-bnr">
<ul>
<li class="bg1">
<div class="info">
<dl>
<dt>SERVER</dt>
<dd>- 정품HP 서버 사용</dd>
<dd>- 안정적인 RAID 1+0 구성</dd>
<dd>- 365/24 기술문의 가능</dd>
</dl>
</div>
</li>
<li class="bg2">
<div class="info">
<dl>
<dt>NETWORK</dt>
<dd>- 안정적인 기가망 사용</dd>
<dd>- 100% 도전! DDOS 방어</dd>
<dd>- 실시간 트래픽 관제</dd>
</dl>
</div>
</li>
<li class="bg3">
<div class="info">
<dl>
<dt>SERVICE</dt>
<dd>- 365일24시간 고객대응</dd>
<dd>- 친절한 고객 응대</dd>
<dd>- 신속하고 정확한 작업 처리</dd>
</dl>
</div>
</li>
</ul>
</div>
<div class="contain">
<div class="main-title">
<h2>가상서버 안내 사양, 가격정보입니다.</h2>
</div>
<div class="main-table">
<table class="table">
<caption>4core</caption>
<colgroup>
<col width="495px">
</colgroup>
<thead>
<tr class="table-primary">
<th style="text-align:center">지원 서비스 </th>
<th style="text-align:center">문의</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<ul style="list-style-type: circle;">
<li>서비스 방어</li>
<li>DDOS 방어</li>
<li>무료 SSL(Let's Encrypt)</li>
<li>기본 OS Application 설치</li>
<li>내부 사설네트워크 추가</li>
<li>Backup/Restore,Snapshot</li>
<li>공통 가상서버 Template</li>
<li>Online 스펙변경가능</li>
<li>서비스 신청 1시간내 사용가능</li>
<li>OS(x64) : Linux , Windows 지원</li>
</ul>
</td>
<td>
<ul style="list-style-type: circle;">
<li>웹호스팅의 제약으로인해, 단독서버호스팅으로 전환해야 하나,<BR> 비용/관리 부분이 걱정되시는 </li>
<li>장비 구매/임대/유지 비용을 절감하고자 하는, / 규모 서비스</li>
<li>신규 사업 시작시 독자적인 사이트 운영이 필요하신 </li>
<li>사용량이 낮은 단독 서버호스팅 운영비용 절감이 필요하신 </li>
<li>비정기적 이벤트에 따른 일시적/한시적 서버환경이 필요하신 </li>
<li>최신 하드웨어에서 설치 불가한 구버전 운영체제를 이용하실 경우</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<div class="main-price">
<div class="col">
<div class="main-table type2">
<table>
<caption>VPS Basic(HP DL360Gen9)</caption>
<thead>
<tr>
<th scope="col" colspan="2">VPS Basic(HP DL360Gen9)</th>
</tr>
</thead>
<tbody>
<tr>
<th>VCPU</th>
<td>Xeon 4Core</td>
</tr>
<tr>
<th>RAM</th>
<td>8G</td>
</tr>
<tr>
<th>SSD</th>
<td>100G</td>
</tr>
<tr>
<th class="none">기본임대료</th>
<td class="none"><strong class="line-through">15만원</strong> <strong class="f-back">할인가 10만원</strong> <span class="text-gray">(공인IP,회선비 별도)</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="col">
<div class="main-table type2">
<table>
<caption>VPS Pro(HP DL360Gen9)</caption>
<thead>
<tr>
<th scope="col" colspan="2">VPS Pro(HP DL360Gen9)</th>
</tr>
</thead>
<tbody>
<tr>
<th>VCPU</th>
<td>Xeon 8Core</td>
</tr>
<tr>
<th>RAM</th>
<td>16G</td>
</tr>
<tr>
<th>SSD</th>
<td>150G</td>
</tr>
<tr>
<th class="none">기본임대료</th>
<td class="none"><strong class="line-through">25만원</strong> <strong class="f-back">할인가 15만원</strong> <span class="text-gray">(공인IP,회선비 별도)</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="main-title">
<h2>단독서버 안내 사양, 가격정보입니다.</h2>
</div>
<div class="main-price">
<div class="col">
<div class="main-table">
<table>
<caption>4core</caption>
<colgroup>
<col width="195px">
<col>
</colgroup>
<thead>
<tr>
<th scope="col" colspan="2">4core</th>
</tr>
</thead>
<tbody>
<tr>
<th>CPU</th>
<td>E5530</td>
</tr>
<tr>
<th>RAM</th>
<td>8G</td>
</tr>
<tr>
<th>HDD</th>
<td>SAS146G*4</td>
</tr>
<tr>
<th class="none">임대료</th>
<td class="none"><strong class="line-through">35만원</strong> <strong class="f-back">할인가 25만원</strong> <span class="text-gray">(회선비 별도)</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="col">
<div class="main-table">
<table>
<caption>8core</caption>
<colgroup>
<col width="195px">
<col>
</colgroup>
<thead>
<tr>
<th scope="col" colspan="2">8core</th>
</tr>
</thead>
<tbody>
<tr>
<th>CPU</th>
<td>X5560*2</td>
</tr>
<tr>
<th>RAM</th>
<td>16G</td>
</tr>
<tr>
<th>HDD</th>
<td>SSD128G*2+SATA500G*2</td>
</tr>
<tr>
<th class="none">임대료</th>
<td class="none"><strong class="line-through">45만원</strong> <strong class="f-back">할인가 35만원</strong> <span class="text-gray">(회선비 별도)</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="col">
<div class="main-table">
<table>
<caption>12core</caption>
<colgroup>
<col width="195px">
<col>
</colgroup>
<thead>
<tr>
<th scope="col" colspan="2">12core</th>
</tr>
</thead>
<tbody>
<tr>
<th>CPU</th>
<td>X5650*2</td>
</tr>
<tr>
<th>RAM</th>
<td>16G</td>
</tr>
<tr>
<th>HDD</th>
<td>SSD128G*2+SATA500G*2</td>
</tr>
<tr>
<th class="none">임대료</th>
<td class="none"><strong class="line-through">55만원</strong> <strong class="f-back">할인가 45만원</strong> <span class="text-gray">(회선비 별도)</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="col type2">
<div class="main-table">
<table>
<caption>20core</caption>
<colgroup>
<col width="195px">
<col>
</colgroup>
<thead>
<tr>
<th scope="col" colspan="2">20core</th>
</tr>
</thead>
<tbody>
<tr>
<th>CPU</th>
<td>E2690v2*2</td>
</tr>
<tr>
<th>RAM</th>
<td>32G</td>
</tr>
<tr>
<th>HDD</th>
<td>SSD128G*2+SATA500G*2</td>
</tr>
<tr>
<th class="none">임대료</th>
<td class="none"><strong class="line-through">65만원</strong> <strong class="f-back">할인가 55만원</strong> <span class="text-gray">(회선비 별도)</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="main-service">
<div class="contain">
<div class="col" style="padding-left:300px;">
<div class="link">
<dl>
<dt>회선 서비스</dt>
<dd>회선서비스 코로케이션 / 단독회선 등이 있습니다.</dd>
</dl>
</div>
</div>
<div class="col">
<div class="link">
<dl>
<dt>기타 서비스</dt>
<dd>방화벽 / 웹방화벽 / 우회망 / 도메인 구매대행이 있습니다.</dd>
</dl>
</div>
</div>
</div>
</div>
<div class="main-notice">
<div class="contain">
<div class="main-bnr2">
<ul>
<li class="bg1">
<div class="info">
<dl>
<dt>고객센터</dt>
<dd><a href="<?= MESSENGERS['skype']['url'] ?>"><?= MESSENGERS['skype']['icon'] ?><?= MALLS['email'] ?></a></dd>
</dl>
</div>
</li>
<li class="bg2">
<div class="info">
<dl>
<dt>자료실</dt>
<dd><?= view_cell('BoardCell::reference', $viewDatas) ?></dd>
</dl>
</div>
</li>
<li class=" bg3">
<div class="info">
<dl>
<dt>공지사항</dt>
<dd><?= view_cell('BoardCell::information', $viewDatas) ?></dd>
</dl>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="bottom"></div>
<?= $this->endSection() ?>

View File

@ -1,44 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title><?= $viewDatas['title'] ?></title>
<?php foreach ($viewDatas['layout']['stylesheets'] as $stylesheet): ?>
<?= $stylesheet ?>
<?php endforeach; ?>
<?php foreach ($viewDatas['layout']['javascripts'] as $javascript): ?>
<?= $javascript ?>
<?php endforeach; ?>
<link href="/css/admin.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/admin.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="layout">
<div class="head">
<?= $this->include($viewDatas['layout']['path'] . '/head'); ?>
</div>
<div class="center">
<div class="left_menu"><?= $this->include($viewDatas['layout']['path'] . '/left_menu'); ?></div>
<div class="content">
<div class="header"><?= $this->include('templates/admin/header'); ?></div>
<div class="center"><?= $this->renderSection('content') ?></div>
<div class="footer"><?= $this->include('templates/admin/footer'); ?></div>
</div>
</div>
<div class="tail">
<?= $this->include($viewDatas['layout']['path'] . '/tail'); ?>
</div>
</div>
</body>
</html>

View File

@ -1,20 +0,0 @@
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav">
<a class="navbar-brand" href="#">관리페이지</a>
</nav>
<ul class="nav justify-content-center">
<li class="nav-item">
<?= $this->include($viewDatas['layout']['path'] . '/head/make_password'); ?>
</li>
<li class="nav-item">
<?= $this->include($viewDatas['layout']['path'] . '/head/search'); ?>
</li>
</ul>
<ul class="nav justify-content-end">
<li class="nav-item">
<?= $this->include($viewDatas['layout']['path'] . '/head/member_link'); ?>
</li>
</ul>
</div>
</nav>

View File

@ -1,5 +0,0 @@
<ul class="navbar-nav me-auto my-2 my-lg-0 navbar-nav-scroll" style="--bs-scroll-height: 100px;">
<li class="nav-item"><?= ICONS['LOCK'] ?></li>
<li class="nav-item"><input type="text" class="form-control" value="<?= getPasswordString_CommonHelper() ?>" id="makePassword"></li>
<li class="nav-item"><button class="btn btn-default border border-dark" type="button" id="totSearchBtn" onClick="window.location.reload();"><?= ICONS['SEARCH'] ?></button></li>
</ul>

View File

@ -1,17 +0,0 @@
<li class="nav-item dropdown">
<?php if ($viewDatas['session']->get(SESSION_NAMES['ISLOGIN'])): ?>
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<?= ICONS['LOGIN'] ?> <?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['TITLE']] ?>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item"
href="/front/user/update/<?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['ID']] ?>"><?= ICONS['SETUP'] ?>수정</a>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
</ul>
<?php else: ?><a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>"
role="button"><?= ICONS['LOGIN'] ?>Login</a><?php endif ?>
</li>

View File

@ -1,4 +0,0 @@
<form class="d-flex me-20" role="search">
<input class="form-control" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>

View File

@ -1,14 +0,0 @@
<!-- left menu start -->
<link href="/css/admin/left_menu.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/admin/side_menu.js"></script>
<div id="left_menu" class="shadow-lg rounded" onMouseOver="sideMenuToggle(this);" onMouseOut="sideMenuToggle(this);">
<div id="accordion" class="accordion accordion-flush">
<div class="accordion-item" style="background-color: #eaeaea;">
<h2><a href=" /admin"><i class="fa fa-home"></i>Main</a></h2>
</div>
<?= $this->include($viewDatas['layout']['path'] . '/left_menu/base'); ?>
<?= $this->include($viewDatas['layout']['path'] . '/left_menu/site'); ?>
<?= $this->include($viewDatas['layout']['path'] . '/left_menu/shoppingmall'); ?>
</div>
<div id="menu_button">메뉴열기</div>
</div>

View File

@ -1,9 +0,0 @@
<div class="accordion-item">
<h2><a href="/admin/user"></i>계정 관리</a></h2>
</div>
<div class="accordion-item">
<h2><a href="/admin/usersns"></i>SNS 계정 관리</a></h2>
</div>
<div class="accordion-item">
<h2><a href="/admin/category">분류 관리</a></h2>
</div>

View File

@ -1,20 +0,0 @@
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-heading-Shoppingmall" aria-expanded="false"
aria-controls="flush-heading-Shoppingmall"><b>상점관리</b></button>
</h2>
<div id="flush-heading-Shoppingmall" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-heading-Shoppingmall">
<div class="accordion-item">
<h2><a href="/admin/device">장비 관리</a></h2>
</div>
<div class="accordion-item">
<h2><a href="/admin/product">상품 관리</a></h2>
</div>
<div class="accordion-item">
<h2><a href="/admin/order">주문 관리</a></h2>
</div>
<div class="accordion-item">
<h2><a href="/admin/billing">청구서 관리</a></h2>
</div>
</div>

View File

@ -1,13 +0,0 @@
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-heading-Board" aria-expanded="false"
aria-controls="flush-heading-Board"><b>사이트관리</b></button>
</h2>
<div id="flush-heading-Board" class="accordion-collapse collapse show" aria-labelledby="flush-heading-Board">
<div class="accordion-item">
<h2><a href="/admin/board">게시글 관리</a></h2>
</div>
<div class="accordion-item">
<h2><a href="/admin/sitepage">SitePage 관리</a></h2>
</div>
</div>

View File

@ -1,34 +0,0 @@
<!doctype html>
<html>
<head>
<base href="/" target="_self" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<?php foreach ($viewDatas['layout']['stylesheets'] as $stylesheet) : ?>
<?= $stylesheet ?>
<?php endforeach ?>
<?php foreach ($viewDatas['layout']['javascripts'] as $javascript) : ?>
<?= $javascript ?>
<?php endforeach ?>
<link href="/css/empty.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/empty.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<title><?= $viewDatas['title'] ?></title>
</head>
<body>
<div id="body">
<?= $this->include('templates/empty/header'); ?>
<?= $this->renderSection('content') ?>
<?= $this->include('templates/empty/footer'); ?>
</div>
</body>
</html>

View File

@ -1,41 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<?php foreach ($viewDatas['layout']['metas'] as $meta) : ?><?= $meta ?><?php endforeach; ?>
<?php foreach ($viewDatas['layout']['stylesheets'] as $stylesheet) : ?><?= $stylesheet ?><?php endforeach; ?>
<?php foreach ($viewDatas['layout']['javascripts'] as $javascript) : ?><?= $javascript ?><?php endforeach; ?>
<link href="/css/front.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/front.js"></script>
<title><?= $viewDatas['title'] ?></title>
</head>
<body>
<div id="head">
<?= $this->include($viewDatas['layout']['path'] . '/top_navigator'); ?>
<?= $this->include($viewDatas['layout']['path'] . '/top_menu'); ?>
<?= TOP_BANNER[array_key_exists('currentCategory', $viewDatas) ? $viewDatas['currentCategory']->parent : 'default'] ?>
</div>
<div class="container-fluid">
<nav class="nav"></nav>
<nav class="nav justify-content-center">
<table id="layout">
<tr>
<td id="left" valign="top" width="200">
<?= $this->include($viewDatas['layout']['path'] . '/left_menu'); ?>
</td>
<td id="body" valign="top" width="*">
<?= $this->include('templates/front/header'); ?>
<?= $this->renderSection('content') ?>
<?= $this->include('templates/front/footer'); ?>
</td>
</tr>
</table>
<nav class="nav justify-content-end"></nav>
</div>
<nav id="tail" class="navbar navbar-expand-lg" style="background-color:white">
<?= $this->include($viewDatas['layout']['path'] . '/../common/copyright'); ?>
</nav>
</body>
</html>

View File

@ -1,2 +0,0 @@
<?= $this->include($viewDatas['layout']['path'] . 'head/navigator'); ?>
<?= $this->include($viewDatas['layout']['path'] . 'head/top_menu'); ?>

View File

@ -1,44 +0,0 @@
<link href="/css/common/top_navigator.css" media="screen" rel="stylesheet" type="text/css" />
<nav id="header" class="navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav">
<span style="float:left;"><?= ICONS['LOGO'] ?></span>
</nav>
<ul class="nav justify-content-center">
<li class="nav-item">
<a href="<?= MESSENGERS['skype']['url'] ?>"><?= MESSENGERS['skype']['icon'] ?></a>&nbsp;
<a href="<?= MESSENGERS['discord']['url'] ?>"><?= MESSENGERS['discord']['icon'] ?></a>&nbsp;
<a href="<?= MESSENGERS['telegram']['url'] ?>"><?= MESSENGERS['telegram']['icon'] ?></a>&nbsp;
<a href="<?= MESSENGERS['kakaotalk']['url'] ?>"><?= MESSENGERS['kakaotalk']['icon'] ?></a>
<!-- <form class="d-flex me-20" role="search">
<input class="form-control" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form> -->
</li>
</ul>
<ul class="nav justify-content-end">
<li class="cart nav-item">
<?= anchor('/front/order', ICONS['CART'], ["target" => "_self"]); ?>
</li>
<li class="nav-item">
<li class="nav-item dropdown">
<?php if ($viewDatas[SESSION_NAMES['ISLOGIN']]): ?>
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<?= ICONS['LOGIN'] ?> <?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['TITLE']] ?>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="/front/user/update/<?= $viewDatas['session']->get(SESSION_NAMES['AUTH'])[AUTH_FIELDS['ID']]
?>"><?= ICONS['SETUP'] ?>수정</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="<?= URLS['LOGOUT'] ?>"><?= ICONS['LOGOUT'] ?>Logout</a></li>
</ul>
<?php else: ?><a class="nav-link dropdown-toggle" href="<?= URLS['LOGIN'] ?>"
role="button"><?= ICONS['LOGIN'] ?>Login</a><?php endif ?>
</li>
</li>
</ul>
</div>
</nav>

View File

@ -1,37 +0,0 @@
<link href="/css/common/top_menu.css" media="screen" rel="stylesheet" type="text/css" />
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav"></nav>
<nav class="nav justify-content-center">
<nav id="top_menu" class="navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav"><a class="navbar-brand" href="/"><?= ICONS['HOME'] ?></a></nav>
<nav class="nav justify-content-center"></nav>
<ul class="nav justify-content-end">
<li class="nav-item" style="padding-top:10px;">|</li>
<?php foreach ($viewDatas['layout']['topmenus'] as $topmenus_key) : ?>
<li class="nav-item">
<div class="dropdown-center">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link" id="navbarDarkDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<?= $viewDatas['menus'][$topmenus_key]['entity']->getTitle() ?>
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDarkDropdownMenuLink">
<?php foreach ($viewDatas['menus'][$topmenus_key]['childs'] as $child) : ?>
<li class="<?= $child->getPrimaryKey() == $viewDatas['category'] ? "active" : "" ?>"><a class=" dropdown-item" href="<?= $child->linkurl ?>?category=<?= $child->getPrimaryKey() ?>"><?= $child->getTitle() ?></a></li>
<?php endforeach ?>
</ul>
</li>
</ul>
</div>
</li>
<li class="nav-item" style="padding-top:10px;">|</li>
<?php endforeach ?>
</ul>
</div>
</nav>
</nav>
<nav class="nav justify-content-end"></nav>
</div>
</nav>

View File

@ -1,14 +0,0 @@
<!-- left menu start -->
<link href="/css/common/left_menu.css" media="screen" rel="stylesheet" type="text/css" />
<div id="left_menu">
<div class="parent">
<div>-</div>
<div class="title"><?= $viewDatas['menus'][$viewDatas['currentCategory']->parent]['entity']->getTitle() ?></div>
</div>
<?php foreach ($viewDatas['menus'][$viewDatas['currentCategory']->parent]['childs'] as $child) : ?>
<div class="sibling <?= $child->getPrimaryKey() == $viewDatas['category'] ? "active" : "" ?>">
<a href="<?= $child->linkurl ?>?category=<?= $child->getPrimaryKey() ?>" target="_self"><?= $child->getTitle() ?></a><span class="play"><i class="bi bi-play-fill"></i></span>
</div>
<?php endforeach ?>
</div>
<!-- left menu end -->

View File

@ -1 +0,0 @@
<?= $this->include($viewDatas['layout']['path'] . 'tail/copyright'); ?>

View File

@ -1,48 +0,0 @@
<!-- Copyright 시작-->
<link href="/css/common/copyright.css" media="screen" rel="stylesheet" type="text/css" />
<div id="copyright" class="container-fluid">
<nav class="nav">&nbsp;</nav>
<nav class="nav justify-content-center">
<div>
<div style="padding: 10px; margin: 10px;">
<ul class=" nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="companyinfo-tab" data-bs-toggle="tab"
data-bs-target="#companyinfo" type="button" role="tab" aria-controls="companyinfo"
aria-selected="true">
회사소개</button>
</li>
<!-- <li class="nav-item" role="presentation">
<button class="nav-link" id="usageterms-tab" data-bs-toggle="tab" data-bs-target="#usageterms" type="button" role="tab" aria-controls="usageterms" aria-selected="false">
이용약관</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="privacyhandling-tab" data-bs-toggle="tab" data-bs-target="#privacyhandling" type="button" role="tab" aria-controls="privacyhandling" aria-selected="false">
개인정보취급방침</button>
</li> -->
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="companyinfo" role="tabpanel"
aria-labelledby="companyinfo-tab" style="height:150px; text-align:left;">
항상 빠르고 안전하고 저렴한 가격으로 고객님을 대신해서 구매대행을 진행할 있도록 하겠습니다.<BR>
언제나 믿고 신뢰할 있는 르호봇이 되도록 노력하겠습니다.<BR>
감사합니다.<BR>
</div>
<div class=" tab-pane fade" id="usageterms" role="tabpanel" aria-labelledby="usageterms-tab"
style="height:150px; text-align:left;">
이용약관
</div>
<div class="tab-pane fade" id="privacyhandling" role="tabpanel"
aria-labelledby="privacyhandling-tab" style="height:150px; text-align:left;">
개인정보취급방침
</div>
</div>
</div>
<div class="address">
Copyright(c) All Right Reserved.
</div>
</div>
</nav>
<nav class="nav justify-content-end"></nav>
</div>
<!-- Copyright -->

View File

@ -1,49 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" id="viewport" content="width=1280">
<meta name="subject" content="IT Solution">
<meta name="description" content="일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버">
<meta name="keywords" content="일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버">
<meta property="og:type" content="website">
<meta property="og:title" content="IT Solution">
<meta property="og:description" content="일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버">
<?php foreach ($viewDatas['layout']['stylesheets'] as $stylesheet) : ?>
<?= $stylesheet ?>
<?php endforeach; ?>
<?php foreach ($viewDatas['layout']['javascripts'] as $javascript) : ?>
<?= $javascript ?>
<?php endforeach; ?>
<link href="/css/front.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/front.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<title><?= $viewDatas['title'] ?></title>
</head>
<body>
<div id="head">
<?= $this->include($viewDatas['layout']['path'] . '/top_navigator'); ?>
<?= $this->include($viewDatas['layout']['path'] . '/top_menu'); ?>
</div>
<div class="container-fluid">
<nav class="nav"></nav>
<nav class="nav justify-content-center">
<?= $this->renderSection('content') ?>
</nav>
<nav class="nav justify-content-end"></nav>
</div>
<nav id="tail" class="navbar navbar-expand-lg" style="background-color:white">
<?= $this->include($viewDatas['layout']['path'] . '/../common/copyright'); ?>
</nav>
</body>
</html>

View File

@ -1,71 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" id="viewport" content="width=1280">
<meta name="subject" content="IT Solution">
<meta name="description" content="일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버">
<meta name="keywords" content="일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버">
<meta property="og:type" content="website">
<meta property="og:title" content="IT Solution">
<meta property="og:description" content="일본IDC 일본서버 일본 서버 일본호스팅 서버호스팅 디도스 공격 해외 호스팅 DDOS 방어 ddos 의뢰 디도스 보안 일본 단독서버">
<?php foreach ($viewDatas['layout']['stylesheets'] as $stylesheet) : ?>
<?= $stylesheet ?>
<?php endforeach; ?>
<?php foreach ($viewDatas['layout']['javascripts'] as $javascript) : ?>
<?= $javascript ?>
<?php endforeach; ?>
<link href="/css/main.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/main.js"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<title><?= $viewDatas['title'] ?></title>
</head>
<body>
<div id="head">
<?= $this->include($viewDatas['layout']['path'] . '/top_navigator'); ?>
<?= $this->include($viewDatas['layout']['path'] . '/top_menu'); ?>
</div>
<div id="carouselExampleAutoplaying" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img src="/images/main/visual1.jpg" class="d-block w-100" alt="...">
</div>
<div class="carousel-item">
<img src="/images/main/visual2.jpg" class="d-block w-100" alt="...">
</div>
<div class="carousel-item">
<img src="/images/main/visual3.jpg" class="d-block w-100" alt="...">
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleAutoplaying" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselExampleAutoplaying" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>
<div class="container-fluid">
<nav class="nav"></nav>
<nav class="nav justify-content-center">
<?= $this->renderSection('content') ?>
</nav>
<nav class="nav justify-content-end"></nav>
</div>
<nav id="tail" class="navbar navbar-expand-lg" style="background-color:white">
<?= $this->include($viewDatas['layout']['path'] . '/../common/copyright'); ?>
</nav>
</body>
</html>

View File

@ -1,34 +0,0 @@
<?php
/**
* bs_full.php - - Bootstrap 4.5.2 Pager Template.
* @var \CodeIgniter\Pager\PagerRenderer $pager
*/
$pager->setSurroundCount(2);
?>
<nav aria-label="<?= lang('Pager.pageNavigation') ?>">
<ul class="pagination justify-content-center">
<?php if ($pager->hasPreviousPage()) : ?>
<li class="page-item">
<a class="page-link" href="<?= $pager->getFirst() ?>" aria-label="<?= lang('Pager.first') ?>"><?= lang('Pager.first') ?></a>
</li>
<li class="page-item">
<a class="page-link" href="<?= $pager->getPreviousPage() ?>" aria-label="<?= lang('Pager.previous') ?>"><?= lang('Pager.previous') ?></a>
</li>
<?php endif ?>
<?php foreach ($pager->links() as $link) : ?>
<li <?= $link['active'] ? 'class="page-item active"' : '' ?>>
<a class="page-link" href="<?= $link['uri'] ?>"><?= $link['title'] ?></a>
</li>
<?php endforeach ?>
<?php if ($pager->hasNextPage()) : ?>
<li class="page-item">
<a class="page-link" href="<?= $pager->getNextPage() ?>" aria-label="<?= lang('Pager.next') ?>"><?= lang('Pager.next') ?></a>
</li>
<li class="page-item">
<a class="page-link" href="<?= $pager->getLast() ?>" aria-label="<?= lang('Pager.last') ?>"><?= lang('Pager.last') ?></a>
</li>
<?php endif ?>
</ul>
</nav>

View File

@ -1,17 +0,0 @@
<?php
/**
* bs_simple - Bootstrap 4.5.2 Pager Template.
* @var \CodeIgniter\Pager\PagerRenderer $pager
*/
$pager->setSurroundCount(0);
?>
<nav aria-label="<?= lang('Pager.pageNavigation') ?>">
<ul class="pagination justify-content-center">
<li <?= $pager->hasPrevious() ? 'class="page-item active"' : 'class="page-item disabled"' ?>>
<a class="page-link" href="<?= $pager->getPrevious() ?? '#' ?>" aria-label="<?= lang('Pager.previous') ?>"><?= lang('Pager.newer') ?></a>
</li>
<li <?= $pager->hasNext() ? 'class="page-item active"' : 'class="page-item disabled"' ?>>
<a class="page-link" href="<?= $pager->getnext() ?? '#' ?>" aria-label="<?= lang('Pager.next') ?>"><?= lang('Pager.older') ?></a>
</li>
</ul>
</nav>

View File

@ -1,65 +0,0 @@
<div class="footer">
<?= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
</div>
<script type="text/javascript">
$(document).ready(function () {
//class가 calender인 inputbox용,날짜field용
$(".calender").datepicker({
changeYear: true,
changeMonth: true,
yearRange: "-10:+0",
dateFormat: "yy-mm-dd"
});
//id가 batchjobuids_checkbox인 버튼을 클릭시 class가 batchjobuids_checkboxs인 checkbox용
$('#batchjobuids_checkbox').click(function (event) {
if (this.checked) {
$('.batchjobuids_checkboxs').each(function () { //loop checkbox
$(this).prop('checked', true); //check
});
} else {
$('.batchjobuids_checkboxs').each(function () { //loop checkbox
$(this).prop('checked', false); //uncheck
});
}
});
//class가 select-field인 SelectBox용
$(".select-field").select2({
theme: "classic",
width: 'style'
});
// text editor 초기화
//참고: https://phppot.com/menu/php/learn-php/
// class가 editor인 textarea용
tinymce.init({
selector: 'textarea.editor',
plugins: ['code', 'image', 'preview', 'table', 'emoticons', 'autoresize'],
height: 600,
// content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
automatic_uploads: false,
images_upload_url: '/tinymce_upload.php',
// images_upload_base_path: '/upload_images',
images_upload_handler: function (blobInfo, success, failure) {
var xhr, formData;
xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.open('POST', '/tinymce_upload.php');
xhr.onload = function () {
var json;
if (xhr.status != 200) {
failure('HTTP Error: ' + xhr.status);
return;
}
json = JSON.parse(xhr.responseText);
if (!json || typeof json.file_path != 'string') {
failure('Invalid JSON: ' + xhr.responseText);
return;
}
success(json.file_path);
};
formData = new FormData();
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
},
});
});
</script>

View File

@ -1,7 +0,0 @@
<ul class="nav nav-tabs">
<li class="nav-item">
<span class="nav-link active" aria-current="page">
<h4><?= ICONS['DESKTOP'] ?> <?= $viewDatas['title'] ?></h4>
</span>
</li>
</ul>

View File

@ -1,12 +0,0 @@
<nav class="nav justify-content-end">
검색어:<?= form_input('word', $viewDatas['word']) ?>
검색일:<?= form_input('start', $viewDatas['start'], ["class" => "calender"]) ?><?= form_input('end', $viewDatas['end'], ["class" => "calender"]) ?>
<?= form_submit('', '검색하기') ?>
<?= anchor(current_url() . '/excel?' . $viewDatas['uri']->getQuery(), ICONS['EXCEL'], ["target" => "_self"]) ?>
</nav>
<nav class="nav justify-content-end">
<span class="pageinfo">
페이지정보 : <?= $viewDatas['page'] ?>/<?= $viewDatas['total_page'] ?>
<?= form_dropdown('per_page', $viewDatas['pageOptions'], $viewDatas['per_page'], array('onChange' => 'this.form.submit()')) ?> / 총:<?= $viewDatas['total_count'] ?>
</span>
</nav>

View File

@ -1,2 +0,0 @@
<div class="footer"></div>
<?= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>

View File

@ -1 +0,0 @@
<div class="header"></div>

View File

@ -1,35 +0,0 @@
<div class="footer"></div>
<?= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
<script type="text/javascript">
$(document).ready(function() {
//class가 calender인 inputbox용,날짜field용
$(".calender").datepicker({
changeYear: true,
changeMonth: true,
yearRange: "-10:+0",
dateFormat: "yy-mm-dd"
});
//id가 batchjobuids_checkbox인 버튼을 클릭시 class가 batchjobuids_checkboxs인 checkbox용
$('#batchjobuids_checkbox').click(function(event) {
if (this.checked) {
$('.batchjobuids_checkboxs').each(function() { //loop checkbox
$(this).prop('checked', true); //check
});
} else {
$('.batchjobuids_checkboxs').each(function() { //loop checkbox
$(this).prop('checked', false); //uncheck
});
}
});
//class가 select-field인 SelectBox용
$(".select-field").select2({
theme: "bootstrap-5",
});
//class가 editor인 textarea용
tinymce.init({
selector: '.editor',
theme: 'silver',
height: 500
});
});
</script>

View File

@ -1,11 +0,0 @@
<nav class="header navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav">
<h4 class="title"><?= $viewDatas['class_icon'] ?><?= $viewDatas['currentCategory']->getTitle() ?></h4>
</nav>
<nav class="nav justify-content-center"></nav>
<nav class="nav justify-content-end">
<span class="flow"><?= ICONS['HOME'] ?> > <?= $viewDatas['menus'][$viewDatas['currentCategory']->parent]['entity']->getTitle() ?> > <?= $viewDatas['currentCategory']->getTitle() ?></span>
</nav>
</div>
</nav>

View File

@ -1,14 +0,0 @@
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<nav class="nav">
<span class="pageinfo">페이지정보 : <?= $viewDatas['page'] ?>/<?= $viewDatas['total_page'] ?></span>
</nav>
<nav class="nav justify-content-center"></nav>
<nav class="nav justify-content-end">
<?= form_open(current_url(), array("method" => "get")) ?>
<?= form_input('word', $viewDatas['word']) ?>
<?= form_submit('', '검색하기') ?>
<?= form_close() ?>
</nav>
</div>
</nav>

View File

@ -1,66 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
* {
margin: 0px;
padding: 0px;
font-size: 14px;
}
body {
height: 100vw; /* 화면 넓이의 100% */
height: 100vh; /* 화면 높이의 100% */
background-color: #efefef;
/* border:1px solid blue; */
}
div.layout > div.head {
height: 51px;
border: 1px solid gray;
background-color: #f8f9fa;
}
div.layout > div.tail {
height: 51px;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background-color: lightgray;
text-align: center;
padding: 10px;
}
div.layout > div.center > div.content {
margin-top: 20px;
margin-left: 25px;
margin-right: 20px;
}
div.layout > div.center > div.content > div.header {
/*content 헤더라인*/
height: 50px;
background-color: #e7e7e7;
}
div.layout > div.center > div.content > div.header > ul.nav {
/*nav-tabs 헤더라인*/
border-top: 1px solid gray;
border-left: 1px solid gray;
border-right: 1px solid gray;
border-radius: 15px 15px 0px 0px;
}
div.layout > div.center > div.content > div.center {
/*content 부분*/
height: 100%;
padding: 15px;
/* border: 1px solid gray; */
border-left: 1px solid gray;
border-right: 1px solid gray;
background-color: white;
}
div.layout > div.center > div.content div.footer {
/*content 하단라인*/
height: 20px;
border-left: 1px solid gray;
border-right: 1px solid gray;
border-bottom: 1px solid gray;
border-radius: 0px 0px 15px 15px;
}

View File

@ -1,95 +0,0 @@
div#content{
color:black;
padding-top:20px;
margin-bottom:40px;
/* border-left:1px solid silver;
border-right:1px solid silver; */
}
/* div#content div.top{
border:1px solid red;
} */
/*페이지정보*/
div#content div.top nav span.pageinfo{
font-weight:bold;
}
/*검색*/
div#content div.top nav input[type=text]{
width:200px;
height:40px;
border-radius:0px !important;
/* border:1px solid red; */
}
/*검색submit*/
div#content div.top nav input[type=submit]{
font-size:12px;
font-weight:bold;
width:80px;
height:40px;
color:white;
border-radius:0px !important;
background-color:#555555;
/* border:1px solid red; */
}
/*Excel Icon*/
div#content div.top nav a{
border-radius:0px !important;
/* border:1px solid red; */
}
/* Table 부분 */
div#content table {
width:100%;
/* overflow-x: auto;
padding-top:5px;
padding-bottom:5px; */
}
/* insert,update,reply,view Form Page 관련 전용*/
div#content table.form tbody tr td.label{
width:10%;
text-align:right;
padding-right:20px;
background-color:#e8ebe9;
}
div#content table.form tbody tr td.column{
height:27px;
text-align:left;
padding-left:20px;
}
/* insert,update,reply,view Form Page 관련 전용*/
/* 상품 리스트 전용 */
div#content table.product tr:first-child {
border-top:2px solid black;
border-bottom:1px solid silver;
}
/* 상품 리스트 전용 */
div#content table thead th{
white-space: nowrap;
padding-top:15px;
padding-bottom:15px;
font-size: 16px;
font-weight:bold;
border-top:2px solid black;
border-bottom:1px solid silver;
background-color:#F5F5F5;
/* border:1px solid silver; */
}
div#content div.bottom {
padding-top:15px;
text-align:center;
}
div#content div.bottom ul.pagination {
margin-top:20px;
}
div#content div.bottom ul.pagination li.page-item a{
border:0px;
border-radius:0px !important;
background-color:#e8ebe9;
}
div#content div.bottom ul.pagination li.active a{
background-color:gray;
}

View File

@ -1,34 +0,0 @@
div#left_menu {
position: fixed;
margin-top: 10px;
z-index: 100;
border: 1px solid #e7e7e7;
}
div#left_menu > div#menu_button {
position: absolute;
top: 0px;
right: -20px;
height: 100px;
width: 20px;
cursor: ew-resize;
writing-mode: vertical-rl; /* 세로로 글자를 출력 */
text-orientation: upright; /* 글자가 직립되도록 설정 */
border-radius: 0px 5px 5px 0px;
border: 1px solid silver;
background-color: #eaeaea;
}
div#left_menu > div.accordion {
/* display:none; */
background-color: white;
width: 20px;
display: none;
}
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-collapse > a {
padding-left: 30px;
}

View File

@ -1,17 +0,0 @@
nav.top_menu ul.member-link{
/* border:1px solid red; */
color:#3a37f3;
padding-right:20px;
}
nav.top_menu ul.member-link a{
color:#3a37f3;
}
nav.top_menu ul.member-link ul.dropdown-menu li:hover{
background-color: #eaeaea;
}
nav.top_menu ul.member-link ul.dropdown-menu li a{
padding-left:10px;
}

View File

@ -1,29 +0,0 @@
div#copyright{
width:100%;
height:300px;
padding-top:30px;
padding-bottom:30px;
background-color:#2d2e2e;
color:white;
}
div#copyright div#content_bottom{
color:white;
text-align:left;
/* border-left:1px solid silver;
border-right:1px solid silver; */
}
div#copyright div#content_bottom .item{
padding-top:5px;
padding-left:5px;
padding-right:5px;
border-top:1px solid silver;
border-left:1px solid silver;
border-right:1px solid silver;
}
div#copyright div#content_bottom div.company_info{
padding:10px;
border:1px solid silver;
}

View File

@ -1,60 +0,0 @@
div#left_menu{
/* position:fixed;
z-index:100; */
width:200px;
background-color:white;
}
div#left_menu div.parent {
font-size:24px;
font-weight:bold;
height:170px;
padding-top:30px;
background-color: #eeeeee;
border:1px solid silver;
text-align:center;
}
div#left_menu div.parent div.title{
color:#26417D;
}
div#left_menu div.parent div{
font-size:24px;
}
/* leftmenu bar */
div#left_menu div.sibling {
padding-top:15px;
text-align:left;
padding-left:20px;
height:60px;
border-bottom:1px solid silver;
}
div#left_menu div.active {
background-color:#26417D;
}
div#left_menu div.sibling a{
text-decoration: none;
color:black;
font-size:18px;
}
div#left_menu div.sibling span.play{
float:right;
color:white;
padding-top:5px;
padding-right:15px;
}
div#left_menu div.active {
background-color:#26417D;
}
div#left_menu div.active a{
color:white;
}
div#left_menu div.sibling:hover {
background-color:#26417D;
}
div#left_menu div.sibling:hover a,div.active{
color:white;
}
div#left_menu div.sibling:hover span.play{
color:white;
}

View File

@ -1,46 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
div.login{
width: 799px;
height: 283px;
margin-top:30px;
margin-left:120px;
padding-top:155px;
background-image: url('/images/common/adminbg.png');
}
div.login form{
margin-left:300px;
/* border: 1px solid red; */
}
div.login form table {
width:300px;
/* border: 1px solid red; */
}
div.login form table td {
text-align: center;
color:white;
padding-right:5px;
/* border: 1px solid blue; */
}
div.login form table td.column {
height: 27px;
}
div.login form table td.login_bottom{
padding-top:20px;
}
div.login form table td.login_bottom a{
color:white;
}
/* div.login form table input[type=submit]{
width: 57px;
height: 60px;
background: url('/images/common/btn_login.png');
} */

View File

@ -1,50 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
div#content a {
color:black;
}
div#content div.login{
width: 509px;
margin-top:30px;
}
div#content div.login form {
padding-top:20px;
border:1px solid silver;
}
div#content div.login form div.label_column{
text-align:right;
/* border:1px solid red; */
}
div#content div.login form label.col-form-label{
font-size:18px;
font-weight:bold;
/* border:1px solid red; */
}
div#content div.login form input[type=text],input[type=password]{
text-align:left;
height:35px;
width:250px;
border:1px solid silver;
}
div#content div.login_bottom{
padding-top:20px;
padding-bottom:20px;
text-align:center;
}
/* div#content div.login form table input[type=submit]{
width: 57px;
height: 60px;
background: url('/images/common/btn_login.png');
} */

View File

@ -1,74 +0,0 @@
#top_menu{
width:1280px;
/* border:1px solid red; */
}
#top_menu a:hover{
text-decoration:none;
}
/* #top_menu nav.nav,ul.nav{
border:1px solid red;
} */
#top_menu a.navbar-brand{
font-size:24px;
font-weight:bold;
}
/* 메뉴바그룹 상단글자*/
#top_menu div.dropdown-center ul.navbar-nav a#navbarDarkDropdownMenuLink{
font-size:18px;
font-weight:bold;
/* border:1px solid silver; */
}
/* 메뉴바그룹 */
#top_menu div.dropdown-center ul.navbar-nav li.dropdown {
width:150px;
text-align:center;
/* border:1px solid red; */
}
/* 메뉴바그룹 hover했을시 */
#top_menu div.dropdown-center ul.navbar-nav li.dropdown:hover a#navbarDarkDropdownMenuLink{
color:#26417D;
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown:hover ul.dropdown-menu{
/* margin-top:15px; */
display: block;
/* 라운드없애기 */
border-radius:0px !important;
padding-bottom:0px;
border:0px;
/* border:1px solid silver; */
}
/* 메뉴바 */
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li{
height:60px;
padding-top:15px;
border-bottom:1px solid silver;
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li a{
width:150px;
font-size:16px;
font-weight:bold;
text-align:center;
text-decoration:none;
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li.active{
background-color:#26417D;
/* border:1px solid red; */
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li.active a{
color:white;
background-color:#26417D;
/* border:1px solid red; */
}
/* 메뉴바 over했을시*/
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li:hover{
background-color:#26417D;
/* border:1px solid red; */
}
#top_menu div.dropdown-center ul.navbar-nav li.dropdown ul.dropdown-menu li:hover a{
color:white;
background-color:#26417D;
}

View File

@ -1,24 +0,0 @@
#top_navigator{
padding-top:20px;
padding-bottom:20px;
background-color:#eeeeee
}
#top_navigator ul.justify-content-center div.navigator_center span{
padding-left:5px;
padding-right:5px;
}
#top_navigator ul.justify-content-center div.navigator_center span strong{
color:#26417D;
font-weight: bold;
}
#top_navigator ul.justify-content-center div.navigator_center span strong{
color:#26417D;
font-weight: bold;
}
#top_navigator ul.justify-content-end li.cart a{
font-size:18px;
font-weight: 500;
}

View File

@ -1,14 +0,0 @@
/* ------------------------------------------------------------
* Name : admin.css
* Desc : Admin StyleSheet
* Created : 2016/9/11 Tri-aBility by Junheum,Choi
* Updated :
------------------------------------------------------------ */
* {
margin:0px;
padding:0px;
border:0px;
font-size:14px;
font: Arial;
}

Some files were not shown because too many files have changed in this diff Show More