Automation init...4
This commit is contained in:
parent
379ce025a6
commit
da71ac2aed
@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
@ -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');
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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/";
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Mangboard\Admin;
|
||||
namespace App\Controllers\Mangboard;
|
||||
|
||||
use Psr\Log\LoggerInterface;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
@ -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'];
|
||||
}
|
||||
}
|
||||
@ -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];
|
||||
}
|
||||
}
|
||||
@ -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];
|
||||
}
|
||||
}
|
||||
@ -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'];
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
<?php
|
||||
@ -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" => "사용않함",
|
||||
]
|
||||
];
|
||||
@ -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" => "잠김",
|
||||
],
|
||||
];
|
||||
@ -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",
|
||||
],
|
||||
];
|
||||
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
return [
|
||||
'title' => "URL Mapping 정보",
|
||||
'label' => [
|
||||
'uid' => "번호",
|
||||
'oldurl' => "기존URL",
|
||||
'newurl' => "신규URL",
|
||||
'status' => "상태",
|
||||
'updated_at' => "수정일",
|
||||
'created_at' => "작성일"
|
||||
],
|
||||
"STATUS" => [
|
||||
"use" => "사용",
|
||||
"unuse" => "사용않함",
|
||||
]
|
||||
];
|
||||
@ -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" => "사용않함",
|
||||
]
|
||||
];
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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) . "개] 완료-----");
|
||||
}
|
||||
}
|
||||
@ -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) . "개] 완료-----");
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
// }
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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}");
|
||||
}
|
||||
}
|
||||
@ -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}");
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -1,5 +0,0 @@
|
||||
<?= $this->extend('layouts/admin') ?>
|
||||
<?= $this->section('content') ?>
|
||||
<?= $this->include('templates/admin/header'); ?>
|
||||
<?= $this->include('templates/admin/footer'); ?>
|
||||
<?= $this->endSection() ?>
|
||||
@ -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 ?>
|
||||
@ -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 ?>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
use CodeIgniter\CLI\CLI;
|
||||
|
||||
CLI::error('ERROR: ' . $code);
|
||||
CLI::write($message);
|
||||
CLI::newLine();
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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';
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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>
|
||||
@ -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')) ?> —
|
||||
PHP: <?= esc(PHP_VERSION) ?> —
|
||||
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 →</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 →</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'])) : ?>
|
||||
— <?= 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'])) : ?>
|
||||
— <?= 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>
|
||||
@ -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>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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() ?>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -1,2 +0,0 @@
|
||||
<?= $this->include($viewDatas['layout']['path'] . 'head/navigator'); ?>
|
||||
<?= $this->include($viewDatas['layout']['path'] . 'head/top_menu'); ?>
|
||||
@ -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>
|
||||
<a href="<?= MESSENGERS['discord']['url'] ?>"><?= MESSENGERS['discord']['icon'] ?></a>
|
||||
<a href="<?= MESSENGERS['telegram']['url'] ?>"><?= MESSENGERS['telegram']['icon'] ?></a>
|
||||
<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>
|
||||
@ -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>
|
||||
@ -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 -->
|
||||
@ -1 +0,0 @@
|
||||
<?= $this->include($viewDatas['layout']['path'] . 'tail/copyright'); ?>
|
||||
@ -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"> </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 끝-->
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -1,2 +0,0 @@
|
||||
<div class="footer"></div>
|
||||
<?= $viewDatas['session']->getFlashdata('return_message') ? alert_CommonHelper($viewDatas['session']->getFlashdata('return_message')) : "" ?>
|
||||
@ -1 +0,0 @@
|
||||
<div class="header"></div>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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');
|
||||
} */
|
||||
@ -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');
|
||||
} */
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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
Loading…
Reference in New Issue
Block a user