servermgrv2 init...

This commit is contained in:
최준흠 2023-07-31 15:41:25 +09:00
parent 524c25fdd9
commit 0916bbcb43
32 changed files with 630 additions and 606 deletions

138
app/Backend/BaseBackend.php Normal file
View File

@ -0,0 +1,138 @@
<?php
namespace App\Backend;
use App\Models\UserModel;
use App\Entities\BaseEntity;
use CodeIgniter\HTTP\Files\UploadedFile;
abstract class BaseBackend
{
private $_userModel = null;
private $_className = null;
private $_user_uids = array();
protected $_model = null;
protected $_session = null;
protected function __construct(string $className)
{
$this->_className = $className;
$this->_session = \Config\Services::session();
}
final public function getClassName()
{
return $this->_className;
}
//User모델
final protected function getUserModel(): UserModel
{
return is_null($this->_userModel) ? new UserModel() : $this->_userModel;
}
//Entity값 가져오기
final public function getEntity($uid)
{
return $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
}
//초기화
final public function getFields(string $action)
{
return $this->_model->getFields($action);
}
//TitleField
final public function getTitleField()
{
return $this->_model->getTitleField();
}
//Field별 Form Rule용
final public function getFieldRules(array $fields, string $action)
{
return $this->_model->getFieldRules($fields, $action);
}
//Field별 Form Filter용
final public function getFieldFilters()
{
return $this->_model->getFieldFilters();
}
//Field별 Form BatchFilter용
final public function getFieldBatchFilters()
{
return $this->_model->getFieldBatchFilters();
}
//Field별 Form Option용
public function getFieldFormOption(string $field): array
{
switch ($field) {
case 'user_uid':
$options = $this->_user_uids = $this->_user_uids ?: $this->getUserModel()->getFieldFormOptions(['status' => 'use']);
break;
default:
$options = lang($this->_className . '.' . strtoupper($field));
break;
}
if (!is_array($options)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->_className}의 Field:{$field}의 FormOptionData가 array가 아닙니다.\n" . var_export($options, true));
}
return $options;
}
//Field별 Form Option용
final public function getFieldFormOptions(array $fields): array
{
$fieldFormOptions = array();
foreach ($fields as $field) {
if (!is_string($field)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->_className}의 Field:{$field}가 string 아닙니다.\n" . var_export($fields, true));
}
$fieldFormOptions[$field] = $this->getFieldFormOption($field);
}
return $fieldFormOptions;
}
//Insert관련
public function insert(array $fieldDatas): BaseEntity
{
return $this->_model->create($fieldDatas);
}
//Update관련
public function update($entity, array $fieldDatas)
{
return $this->_model->modify($entity, $fieldDatas);
}
//Delete 관련
public function delete($entity)
{
if (!$this->_model->delete($entity->getPrimaryKey())) {
log_message("error", __FUNCTION__ . "에서 호출:" . $this->_model->getLastQuery());
log_message("error", implode("\n", $this->_model->errors()));
throw new \Exception(__FUNCTION__ . " 오류 발생.\n" . var_export($this->_model->errors(), true));
}
}
//View 관련
public function view($entity)
{
return $entity;
}
public function setCondition(array $filterFields, $word, $start, $end, $order_field, $order_value)
{
foreach ($filterFields as $field => $value) {
$this->_model->where($field, $value);
}
if (!is_null($word)) {
$this->_model->setIndexWordFilter($word);
}
if (!is_null($start) && !is_null($end)) {
$this->_model->setIndexDateFilter($start, $end);
}
$this->_model->setIndexOrderBy($order_field, $order_value);
}
final public function getTotalCount()
{
return $this->_model->countAllResults();
}
final public function getFindEntitys(int $page = 0, int $per_page = 0)
{
return $per_page ? $this->_model->findAll($per_page, $page * $per_page - $per_page) : $this->_model->findAll();
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Backend;
abstract class BaseHierarchyBackend extends BaseBackend
{
public function __construct(string $className)
{
parent::__construct($className);
}
//ContentField
final public function getContentField()
{
return $this->_model->getContentField();
}
//Reply관련
public function reply($entity, array $fieldDatas)
{
return $this->_model->reply($entity, $fieldDatas);
}
//View관련
public function view($entity)
{
// view_cnt에 추가하기위함
$this->_model->increaseViewCount($entity->getPrimaryKey());
return parent::view($entity);
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\Backend;
use App\Models\BoardModel;
use App\Entities\BoardEntity;
use App\Models\BoardConfigModel;
class BoardBackend extends BaseHierarchyBackend
{
private $_board_config_uids = null;
private $_boardConfigModel = null;
public function __construct()
{
parent::__construct('Board');
$this->_model = new BoardModel();
}
//BoardConfig모델
final public function getBoardConfigModel(): BoardConfigModel
{
return is_null($this->_boardConfigModel) ? new BoardConfigModel() : $this->_boardConfigModel;
}
//Field별 Form Option용
public function getFieldFormOption(string $field): array
{
switch ($field) {
case 'board_config_uid':
$options = $this->_board_config_uids = $this->_board_config_uids ?: $this->getBoardConfigModel()->getFieldFormOptions(['status' => 'use']);
break;
default:
return parent::getFieldFormOption($field);
break;
}
if (!is_array($options)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->getClassName()}의 Field:{$field}의 FormOptionData가 array가 아닙니다.\n" . var_export($options, true));
}
return $options;
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Backend;
use App\Models\BoardConfigModel;
use App\Entities\BoardConfigEntity;
class BoardConfigBackend extends BaseBackend
{
public function __construct()
{
parent::__construct('BoardConfig');
$this->_model = new BoardConfigModel();
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Backend;
use App\Models\HPILOModel;
use App\Entities\HPILOEntity;
class HPILOBackend extends BaseBackend
{
public function __construct()
{
parent::__construct('HPILO');
$this->_model = new HPILOModel();
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Backend;
use App\Models\UserModel;
use App\Entities\UserEntity;
class UserBackend extends BaseBackend
{
public function __construct()
{
parent::__construct('User');
$this->_model = new UserModel();
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Backend;
use App\Models\UserSNSModel;
use App\Entities\UserSNSEntity;
class UserSNSBackend extends BaseBackend
{
public function __construct()
{
parent::__construct('UserSNS');
$this->_model = new UserSNSModel();
}
}

View File

@ -29,4 +29,39 @@ class Services extends BaseService
* return new \CodeIgniter\Example();
* }
*/
public static function user($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('user');
}
return new \App\Backend\UserBackend();
}
public static function usersns($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('usersns');
}
return new \App\Backend\UserSNSBackend();
}
public static function board($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('board');
}
return new \App\Backend\BoardBackend();
}
public static function boardconfig($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('boardconfig');
}
return new \App\Backend\BoardConfigBackend();
}
public static function hpilo($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('hpilo');
}
return new \App\Backend\HPILOBackend();
}
}

View File

@ -0,0 +1,67 @@
<?php
namespace Config;
use CodeIgniter\Config\BaseService;
/**
* Services Configuration file.
*
* Services are simply other classes/libraries that the system uses
* to do its job. This is used by CodeIgniter to allow the core of the
* framework to be swapped out easily without affecting the usage within
* the rest of your application.
*
* This file holds any application-specific services, or service overrides
* that you might need. An example has been included with the general
* method format you should use for your service methods. For more examples,
* see the core Services file at system/Config/Services.php.
*/
class Services extends BaseService
{
/*
* public static function example($getShared = true)
* {
* if ($getShared) {
* return static::getSharedInstance('example');
* }
*
* return new \CodeIgniter\Example();
* }
*/
public static function user($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('user');
}
return new \App\Backend\UserBackend();
}
public static function usersns($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('usersns');
}
return new \App\Backend\UserSNSBackend();
}
public static function board($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('board');
}
return new \App\Backend\BoardBackend();
}
public static function boardconfig($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('boardconfig');
}
return new \App\Backend\BoardConfigBackend();
}
public static function hpilo($getShared = true)
{
if ($getShared) {
return static::getSharedInstance('hpilo');
}
return new \App\Backend\HPILOBackend();
}
}

View File

@ -7,13 +7,12 @@ use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
abstract class AdminController extends BASEController
abstract class AdminController extends BaseController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->_viewPath .= strtolower('Admin/');
$this->_viewPath = 'admin/';
$this->_viewDatas['layout'] = LAYOUTS['admin'];
$this->_viewDatas['title'] = "관리자페이지";
}
}

View File

@ -1,64 +0,0 @@
<?php
namespace App\Controllers\Admin;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
abstract class AdminHierarchyController extends AdminController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
}
//Reply관련
protected function reply_form_process($entity)
{
return $this->update_form_process($entity);
}
final public function reply_form($uid)
{
try {
$entity = $entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('reply');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'reply');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas['entity'] = $this->reply_form_process($entity);
$this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
return view($this->_viewPath . '/update', $this->_viewDatas);
} catch (\Exception $e) {
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']))->with('return_message', $e->getMessage());
}
}
protected function reply_validate($entity)
{
return $this->update_validate($entity);
}
protected function reply_process($entity)
{
return $this->_model->reply($entity, $this->_viewDatas['fieldDatas']);
}
public function reply($uid)
{
$msg = "";
try {
$entity = $entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('reply');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'reply');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$entity = $this->reply_validate($entity);
$entity = $this->reply_process($entity);
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 완료하였습니다.";
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
} catch (\Exception $e) {
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
log_message("error", $e->getMessage());
log_message("error", var_export($this->_viewDatas['fieldDatas'], true));
return redirect()->back()->withInput();
} finally {
$this->_session->setFlashdata("return_message", $msg);
}
}
}

View File

@ -2,7 +2,6 @@
namespace App\Controllers\Admin;
use App\Models\BoardConfigModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
@ -11,12 +10,8 @@ class BoardConfigController extends AdminController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->_backend = service('boardconfig');
parent::initController($request, $response, $logger);
$this->_className .= 'BoardConfig';
$this->_model = new BoardConfigModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
$this->_viewPath .= strtolower($this->_backend->getClassName());
}
}

View File

@ -2,48 +2,17 @@
namespace App\Controllers\Admin;
use App\Models\BoardConfigModel;
use App\Models\BoardModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class BoardController extends AdminHierarchyController
class BoardController extends AdminController
{
private $_boardConfigModel = null;
private $_board_config_uids = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->_backend = service('board');
parent::initController($request, $response, $logger);
$this->_className .= 'Board';
$this->_model = new BoardModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
}
//BoardConfig모델
final protected function getBoardConfigModel(): BoardConfigModel
{
return is_null($this->_boardConfigModel) ? new BoardConfigModel() : $this->_boardConfigModel;
}
//Field별 Form Option용
protected function getFieldFormOption(string $field): array
{
switch ($field) {
case 'board_config_uid':
$options = $this->_board_config_uids = $this->_board_config_uids ?: $this->getBoardConfigModel()->getFieldFormOptions(['status' => 'use']);
break;
default:
return parent::getFieldFormOption($field);
break;
}
if (!is_array($options)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->_className}의 Field:{$field}의 FormOptionData가 array가 아닙니다.\n" . var_export($options, true));
}
return $options;
$this->_viewPath .= strtolower($this->_backend->getClassName());
}
//Field별 Form Datas 처리용
@ -63,12 +32,4 @@ class BoardController extends AdminHierarchyController
}
return $this->_viewDatas['fieldDatas'];
}
//View 관련
protected function view_process($entity)
{
// view_cnt에 추가하기위함
$this->_model->increaseViewCount($entity->getPrimaryKey());
return parent::view_process($entity);
}
}

View File

@ -14,13 +14,9 @@ class HPILOController extends \App\Controllers\Admin\AdminController
private $_adapter = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->_backend = service('hpilo');
parent::initController($request, $response, $logger);
$this->_className .= 'HPILO';
$this->_model = new HPILOModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
$this->_viewPath .= strtolower($this->_backend->getClassName());
}
private function getAdapter(HPILOEntity $entity)

View File

@ -2,24 +2,19 @@
namespace App\Controllers\Admin;
use CodeIgniter\Controller;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class Home extends AdminController
class Home extends Controller
{
protected $_viewDatas = array();
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
helper('Common');
$this->_viewDatas = [
'layout' => LAYOUTS['admin'],
'title' => '관리자페이지',
];
}
public function index()
{
return view($this->_viewPath . '/welcome_message', $this->_viewDatas);
return view('admin/welcome_message');
}
}

View File

@ -2,7 +2,6 @@
namespace App\Controllers\Admin;
use App\Models\UserModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
@ -11,13 +10,9 @@ class UserController extends AdminController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->_backend = service('user');
parent::initController($request, $response, $logger);
$this->_className .= 'User';
$this->_model = new UserModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
$this->_viewPath .= strtolower($this->_backend->getClassName());
}
//Field별 Form Datas 처리용

View File

@ -2,7 +2,6 @@
namespace App\Controllers\Admin;
use App\Models\UserSNSModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
@ -11,12 +10,8 @@ class UserSNSController extends AdminController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->_backend = service('usersns');
parent::initController($request, $response, $logger);
$this->_className .= 'UserSNS';
$this->_model = new UserSNSModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
$this->_viewPath .= strtolower($this->_backend->getClassName());
}
}

View File

@ -6,15 +6,15 @@ use App\Libraries\Adapter\Auth\Adapter;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Models\UserModel;
class AuthController extends BaseController
{
private $_adapters = array();
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->_backend = service('user');
parent::initController($request, $response, $logger);
helper('Common');
$this->_viewPath .= strtolower($this->_backend->getClassName());
$this->initAdapters();
}

View File

@ -10,8 +10,6 @@ use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Models\UserModel;
use App\Entities\BaseEntity;
/**
* Class BaseController
@ -50,62 +48,21 @@ abstract class BaseController extends Controller
/**
* Constructor.
*/
private $_userModel = null;
private $_user_uids = array();
protected $_model = null;
protected $_className = '/';
protected $_viewPath = '/';
protected $_viewDatas = array();
protected $_backend = null;
protected $_session = null;
protected $_viewPath = '';
protected $_viewDatas = array();
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
// Do Not Edit This Line
parent::initController($request, $response, $logger);
// Preload any models, libraries, etc, here.
// E.g.: $this->session = \Config\Services::session();
$this->_session = \Config\Services::session();
$this->_viewDatas = [
'layout' => LAYOUTS['empty'],
'title' => '',
'session' => $this->_session
];
}
//User모델
final protected function getUserModel(): UserModel
{
return is_null($this->_userModel) ? new UserModel() : $this->_userModel;
}
//Field별 Form Option용
protected function getFieldFormOption(string $field): array
{
switch ($field) {
case 'user_uid':
$options = $this->_user_uids = $this->_user_uids ?: $this->getUserModel()->getFieldFormOptions(['status' => 'use']);
break;
default:
$options = lang($this->_className . '.' . strtoupper($field));
break;
}
if (!is_array($options)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->_className}의 Field:{$field}의 FormOptionData가 array가 아닙니다.\n" . var_export($options, true));
}
return $options;
}
//Field별 Form Option용
final protected function getFieldFormOptions(array $fields): array
{
$fieldFormOptions = array();
foreach ($fields as $field) {
if (!is_string($field)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->_className}의 Field:{$field}가 string 아닙니다.\n" . var_export($fields, true));
}
$fieldFormOptions[$field] = $this->getFieldFormOption($field);
}
return $fieldFormOptions;
$this->_viewDatas['layout'] = LAYOUTS['empty'];
$this->_viewDatas['title'] = lang($this->_backend->getClassName() . '.title');
$this->_viewDatas['session'] = $this->_session;
helper($this->_backend->getClassName());
}
//Field별 Form Datas 처리용
@ -153,14 +110,31 @@ abstract class BaseController extends Controller
return $fileNames;
}
//초기화
final public function init(string $action, $fields = null)
{
switch ($action) {
case 'insert_form':
$action = 'insert';
break;
case 'update_form':
$action = 'update';
break;
}
$this->_viewDatas['fields'] = $fields ?: $this->_backend->getFields($action);
$this->_viewDatas['fieldRules'] = $this->_backend->getFieldRules($this->_viewDatas['fields'], $action);
$this->_viewDatas['fieldFilters'] = $this->_backend->getFieldFilters();
$this->_viewDatas['batchjobFilters'] = $this->_backend->getFieldBatchFilters();
$this->_viewDatas['fieldFormOptions'] = $this->_backend->getFieldFormOptions($this->_viewDatas['fieldFilters']);
return $this->_viewDatas;
}
//Insert관련
final public function insert_form()
{
try {
$this->_viewDatas['fields'] = $this->_model->getFields('insert');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'insert');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas['fieldFormOptions'] = $this->getFieldFormOptions($this->_viewDatas['fieldFilters']);
$this->_viewDatas = $this->init(__FUNCTION__);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
helper(['form']);
$this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
@ -169,44 +143,30 @@ abstract class BaseController extends Controller
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']))->with('return_message', $e->getMessage());
}
}
protected function insert_validate()
protected function insert_process()
{
$this->_viewDatas['fieldDatas'] = array();
//변경할 값 확인
//fieldData Rule 검사
if (!$this->validate($this->_viewDatas['fieldRules'])) {
throw new \Exception("{$this->_viewDatas['title']}의 검증 오류발생\n" . implode("\n", $this->validator->getErrors()));
}
//변경된 값 적용
//fieldData 적용
$this->_viewDatas['fieldDatas'] = array();
foreach ($this->_viewDatas['fields'] as $field) {
$this->_viewDatas['fieldDatas'] = $this->getFieldFormData($field);
}
// echo var_export($this->_viewDatas['fields'], true);
// echo "<HR>";
// echo var_export($this->_viewDatas['fieldDatas'], true);
// echo "<HR>";
// echo var_export($this->_viewDatas['fieldRules'], true);
// exit;
}
protected function insert_process(): BaseEntity
{
return $this->_model->create($this->_viewDatas['fieldDatas']);
}
public function insert()
{
$msg = "";
try {
$this->_viewDatas['fields'] = $this->_model->getFields('insert');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'insert');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->insert_validate();
$entity = $this->insert_process();
$this->_viewDatas = $this->init(__FUNCTION__);
$this->insert_process();
$entity = $this->_backend->insert($this->_viewDatas['fieldDatas']);
$msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다.";
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
} catch (\Exception $e) {
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
log_message("error", $e->getMessage());
log_message("error", var_export($this->_viewDatas['fieldDatas'], true));
return redirect()->back()->withInput();
} finally {
$this->_session->setFlashdata("return_message", $msg);
@ -214,118 +174,132 @@ abstract class BaseController extends Controller
}
//Update관련
protected function update_form_process($entity)
{
$this->_viewDatas['fieldFormOptions'] = $this->getFieldFormOptions($this->_viewDatas['fieldFilters']);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
helper(['form']);
return $entity;
}
final public function update_form($uid)
{
try {
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('update');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'update');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas['entity'] = $this->update_form_process($entity);
$this->_viewDatas = $this->init(__FUNCTION__);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
helper(['form']);
$this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
$this->_viewDatas['entity'] = $this->_backend->getEntity($uid);
return view($this->_viewPath . '/update', $this->_viewDatas);
} catch (\Exception $e) {
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']))->with('return_message', $e->getMessage());
}
}
protected function update_validate($entity)
protected function update_process()
{
//변경된 값 적용
$this->_viewDatas['fieldDatas'] = array();
//변경할 값 확인
//fieldData Rule 검사
if (!$this->validate($this->_viewDatas['fieldRules'])) {
throw new \Exception("{$this->_viewDatas['title']}의 검증 오류발생\n" . implode("\n", $this->validator->getErrors()));
}
//fieldData 적용
$this->_viewDatas['fieldDatas'] = array();
foreach ($this->_viewDatas['fields'] as $field) {
$this->_viewDatas['fieldDatas'] = $this->getFieldFormData($field, $entity);
$this->_viewDatas['fieldDatas'] = $this->getFieldFormData($field, $this->_viewDatas['entity']);
log_message(
"info",
"{$field} : {$entity->$field} => " . var_export($this->_viewDatas['fieldDatas'][$field])
"{$field} : {$this->_viewDatas['entity']->$field} => " . var_export($this->_viewDatas['fieldDatas'][$field])
);
}
return $entity;
}
protected function update_process($entity)
{
return $this->_model->modify($entity, $this->_viewDatas['fieldDatas']);
}
public function update($uid)
{
$msg = "";
try {
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('update');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'update');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$entity = $this->update_validate($entity);
$entity = $this->update_process($entity);
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 완료하였습니다.";
$this->_viewDatas = $this->init(__FUNCTION__);
$entity = $this->_viewDatas['entity'] = $this->_backend->getEntity($uid);
$this->update_process();
$entity = $this->_backend->update($entity, $this->_viewDatas['fieldDatas']);
$msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다.";
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
} catch (\Exception $e) {
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
log_message("error", $e->getMessage());
log_message("error", var_export($this->_viewDatas['fieldDatas'], true));
return redirect()->back()->withInput();
} finally {
$this->_session->setFlashdata("return_message", $msg);
}
}
//Reply관련
final public function reply_form($uid)
{
try {
$this->_viewDatas = $this->init(__FUNCTION__);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
helper(['form']);
$this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
$entity = $this->_backend->getEntity($uid);
$titleField = $this->_backend->getTitleField();
$entity->$titleField = "RE: " . $entity->$titleField;
$contentField = $this->_backend->getContentField();
$entity->$contentField .= "\n----------------------------------------------\n";
$this->_viewDatas['entity'] = $entity;
return view($this->_viewPath . '/reply', $this->_viewDatas);
} catch (\Exception $e) {
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']))->with('return_message', $e->getMessage());
}
}
protected function reply_process()
{
$this->update_process();
}
public function reply($uid)
{
$msg = "";
try {
$this->_viewDatas = $this->init(__FUNCTION__);
$entity = $this->_viewDatas['entity'] = $this->_backend->getEntity($uid);
$this->reply_process();
$entity = $this->_backend->reply($entity, $this->_viewDatas['fieldDatas']);
$msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다.";
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
} catch (\Exception $e) {
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
log_message("error", $e->getMessage());
return redirect()->back()->withInput();
} finally {
$this->_session->setFlashdata("return_message", $msg);
}
}
//Toggle 관련
protected function toggle_validate($entity)
protected function toggle_process()
{
return $this->update_validate($entity);
}
protected function toggle_process($entity)
{
return $this->update_process($entity);
$this->update_process();
}
public function toggle($uid, string $field)
{
$msg = "";
try {
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = [$field];
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'toggle');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$entity = $this->toggle_validate($entity);
$entity = $this->toggle_process($entity);
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 완료하였습니다.";
$this->_viewDatas = $this->init(__FUNCTION__, [$field]);
$entity = $this->_viewDatas['entity'] = $this->_backend->getEntity($uid);
$this->toggle_process();
$entity = $this->_backend->update($entity, $this->_viewDatas['fieldDatas']);
$msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다.";
} catch (\Exception $e) {
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
log_message("error", $e->getMessage());
log_message("error", var_export($this->_viewDatas['fieldDatas'], true));
} finally {
$this->_session->setFlashdata("return_message", $msg);
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
}
}
//Batchjob 관련
protected function batchjob_validate($entity)
protected function batchjob_process()
{
return $this->update_validate($entity);
}
protected function batchjob_process($entity)
{
return $this->update_process($entity);
$this->update_process();
}
public function batchjob()
{
$msg = "";
$entitys = array();
$batchjobs = array();
try {
$uids = $this->request->getVar('batchjob_uids') ?: throw new \Exception($this->_viewDatas['title'] . '에서 변경할 항목(uid)이 선택되지 않았습니다.');
//fields 해당하는 field중 선택된 값이 있는경우만 fields로 정의
$fields = array();
foreach ($this->_model->getFieldBatchFilters() as $field) {
foreach ($this->_backend->getFieldBatchFilters() as $field) {
if ($this->request->getVar($field)) {
array_push($fields, $field);
}
@ -333,41 +307,43 @@ abstract class BaseController extends Controller
if (!is_array($fields) || count($fields) === 0) {
throw new \Exception($this->_viewDatas['title'] . '에서 변경할 항목(field)이 선택되지 않았습니다.');
}
//Transaction manully 시작
$this->_model->transBegin();
//Fields,FielRules재정의
$this->_viewDatas['fields'] = $fields;
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'batchjob');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas = $this->init(__FUNCTION__, $fields);
$uids = $this->request->getVar('batchjob_uids') ?: throw new \Exception($this->_viewDatas['title'] . '에서 변경할 항목(uid)이 선택되지 않았습니다.');
$cnt = 1;
$entitys = array();
//Transaction manully 시작
$this->_backend->transBegin();
foreach ($uids as $uid) {
try {
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$entity = $this->batchjob_validate($entity);
array_push($entitys, $this->batchjob_process($entity));
array_push($batchjobs, "{$cnt}. {$entity->getTitle()}는 완료.");
$entity = $this->_viewDatas['entity'] = $this->_backend->getEntity($uid);
$this->batchjob_process();
array_push($entitys, $this->_backend->update($entity, $this->_viewDatas['fieldDatas']));
array_push($batchjobs, "{$cnt}. {$uid}->{$entity->getTitle()}는 완료.");
} catch (\Exception $e) {
array_push($batchjobs, "{$cnt}. {$entity->getTitle()}는 실패\n" . $e->getMessage());
array_push($batchjobs, "{$cnt}. {$uid}는 실패.");
}
$cnt++;
}
//Transaction manully Commit
$this->_model->transCommit();
$this->_backend->transCommit();
$msg = sprintf(
"%s에서 총:%s중 %s개성공 , %s실패 %s 완료하였습니다.",
"%s에서 총:%s개의 %s 완료하였습니다.",
$this->_viewDatas['title'],
count($batchjobs),
count($entitys),
count($batchjobs) - count($entitys),
__FUNCTION__
);
} catch (\Exception $e) {
//Transaction manully Rollback
$this->_model->transRollback();
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
$this->_backend->transRollback();
log_message('error', sprintf("---------batchjob 작업결과--------\n%s\n", implode("\n", $batchjobs)));
return sprintf(
"총:%s개의 작업중 %s개는 성공하였지만 , %s개가 실패하여 %s 취소되었습니다.\n%s",
count($uids),
count($entitys),
count($uids) - count($entitys),
__FUNCTION__,
);
log_message("error", $e->getMessage());
log_message("error", var_export($this->_viewDatas['fieldDatas'], true));
} finally {
$this->_session->setFlashdata("return_message", $msg);
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
@ -375,26 +351,15 @@ abstract class BaseController extends Controller
}
//Delete 관련
protected function delete_process($entity)
{
if (!$this->_model->delete($entity->getPrimaryKey())) {
log_message("error", __FUNCTION__ . "에서 호출:" . $this->_model->getLastQuery());
log_message("error", implode("\n", $this->_model->errors()));
throw new \Exception(__FUNCTION__ . " 오류 발생.\n" . var_export($this->_model->errors(), true));
}
return $entity;
}
public function delete($uid)
{
$msg = "";
try {
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->delete_process($entity);
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 완료하였습니다.";
$entity = $this->_backend->delete($this->_backend->getEntity($uid));
$msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다.";
} catch (\Exception $e) {
$msg = "{$this->_viewDatas['title']}에서 " . __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage();
log_message("error", $e->getMessage());
log_message("error", var_export($this->_viewDatas['fieldDatas'], true));
} finally {
$this->_session->setFlashdata("return_message", $msg);
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']));
@ -409,16 +374,11 @@ abstract class BaseController extends Controller
public function view($uid)
{
try {
// echo "TEST" . $this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']);
// exit;
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('view');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'view');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas = $this->init(__FUNCTION__);
helper(['form']);
$this->_viewDatas['fieldFormOptions'] = $this->getFieldFormOptions($this->_viewDatas['fieldFilters']);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
$this->_viewDatas['entity'] = $this->view_process($entity);
$entity = $this->_viewDatas['entity'] = $this->_backend->getEntity($uid);
$this->_viewDatas['entity'] = $this->_backend->view($entity);
$this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
return view($this->_viewPath . '/view', $this->_viewDatas);
} catch (\Exception $e) {
@ -427,46 +387,13 @@ abstract class BaseController extends Controller
}
//Index 관련
//index 모델 전처리
protected function index_setCondition()
{
foreach ($this->_viewDatas['fieldFilters'] as $field) {
$value = $this->request->getVar($field) ?: false;
if ($value) {
$this->_model->where($field, $value);
}
}
$word = $this->request->getVar('word') ?: '';
if (isset($word) && $word !== '') {
$this->_model->setIndexWordFilter($word);
}
$start = $this->request->getVar('start') ?: '';
$end = $this->request->getVar('end') ?: '';
if (isset($start) && $start !== '' && isset($end) && $end !== '') {
$this->_model->setIndexDateFilter($start, $end);
}
}
protected function index_getEntitys(int $page = 0, int $per_page = 0): array
{
//Totalcount 처리
$this->index_setCondition();
$this->_viewDatas['total_count'] = $this->_model->countAllResults();
//Rows 처리
$this->index_setCondition();
//OrderBy
$this->_model->setIndexOrderBy($this->request->getVar('order_field'), $this->request->getVar('order_value'));
//Limit
$entitys = $per_page ? $this->_model->findAll($per_page, $page * $per_page - $per_page) : $this->_model->findAll();
// log_message("debug", __METHOD__ . "에서 호출[{$per_page}:{$page}=>{$page}*{$per_page}-{$per_page}]\n" . $this->_model->getLastQuery());
return $entitys;
}
private function index_getPagination($pager_group = 'default', int $segment = 0, $template = 'bootstrap_full'): string
{
// 1.Views/Pagers/에 bootstrap_full.php,bootstrap_simple.php 생성
// 2.app/Config/Pager.php/$templates에 'bootstrap_full => 'Pagers\bootstrap_full',
// 'bootstrap_simple' => 'Pagers\bootstrap_simple', 추가
$pager = \Config\Services::pager();
// $this->_model->paginate($this->_viewDatas['per_page'], $pager_group, $this->_viewDatas['page'], $segment);
// $this->_backend->paginate($this->_viewDatas['per_page'], $pager_group, $this->_viewDatas['page'], $segment);
$pager->makeLinks(
$this->_viewDatas['page'],
$this->_viewDatas['per_page'],
@ -479,27 +406,32 @@ abstract class BaseController extends Controller
$this->_viewDatas['total_page'] = $pager->getPageCount($pager_group);
return $pager->links($pager_group, $template);
}
protected function index_process()
private function index_setCondition()
{
//모델 처리
$this->_viewDatas['entitys'] = $this->index_getEntitys((int)$this->_viewDatas['page'], (int)$this->_viewDatas['per_page']);
//줄수 처리용
$this->_viewDatas['pageOptions'] = array("" => "줄수선택");
for ($i = 10; $i <= $this->_viewDatas['total_count'] + $this->_viewDatas['per_page']; $i += 10) {
$this->_viewDatas['pageOptions'][$i] = $i;
//조건절 처리
$filterFields = array();
foreach ($this->_viewDatas['fieldFilters'] as $field) {
if (!is_null($this->request->getVar($field))) {
$filterFields[$field] = $this->request->getVar($field);
}
//pagenation 처리
$this->_viewDatas['pagination'] = $this->index_getPagination();
}
$word = $this->request->getVar('word');
$start = $this->request->getVar('start');
$end = $this->request->getVar('end');
$order_field = $this->request->getVar('order_field');
$order_value = $this->request->getVar('order_value');
$this->_backend->setCondition($filterFields, $word, $start, $end, $order_field, $order_value);
}
private function index_getEntitys(int $page = 0, int $per_page = 0)
{
$this->index_setCondition();
return $this->_backend->getFindEntitys($page, $per_page);
}
public function index()
{
try {
$this->_viewDatas['fields'] = $this->_model->getFields('index');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'index');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas['batchjobFilters'] = $this->_model->getFieldBatchFilters();
$this->_viewDatas = $this->init(__FUNCTION__);
helper(['form']);
$this->_viewDatas['fieldFormOptions'] = $this->getFieldFormOptions($this->_viewDatas['fieldFilters']);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
foreach ($this->_viewDatas['fieldFilters'] as $field) {
$this->_viewDatas[$field] = $this->request->getVar($field) ?: DEFAULTS['EMPTY'];
@ -512,13 +444,21 @@ abstract class BaseController extends Controller
$this->_viewDatas['page'] = $this->request->getVar('page') ?: 1;
$this->_viewDatas['per_page'] = $this->request->getVar('per_page') ?: DEFAULTS['PERPAGE'];
$this->_viewDatas['uri'] = $this->request->getUri();
$this->index_process();
//Totalcount 처리
$this->index_setCondition();
$this->_viewDatas['total_count'] = $this->_backend->getTotalCount();
//줄수 처리용
$this->_viewDatas['pageOptions'] = array("" => "줄수선택");
for ($i = 10; $i <= $this->_viewDatas['total_count'] + $this->_viewDatas['per_page']; $i += 10) {
$this->_viewDatas['pageOptions'][$i] = $i;
}
//pagenation 처리
$this->_viewDatas['pagination'] = $this->index_getPagination();
//모델 처리
$this->_viewDatas['entitys'] = $this->index_getEntitys((int)$this->_viewDatas['page'], (int)$this->_viewDatas['per_page']);
// log_message("debug", __METHOD__ . "에서 호출:" . $this->_backend->getLastQuery());
//setting return_url to session flashdata
$this->_session->setFlashdata(SESSION_NAMES['RETURN_URL'], current_url() . '?' . $this->request->getUri()->getQuery() ?: "");
// echo "TEST" . var_export($this->_session->get());
// echo "<HR>";
// echo $this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']);
// exit;
return view($this->_viewPath . '/index', $this->_viewDatas);
} catch (\Exception $e) {
return redirect()->back()->with('return_message', $e->getMessage());
@ -526,22 +466,22 @@ abstract class BaseController extends Controller
}
//Excel 관련
protected function excel_spreadSheet()
private function excel_spreadSheet(array $viewDatas)
{
//Excepl 초기화
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
//Header용
$column = 'A';
foreach ($this->_viewDatas['fields'] as $field) {
$sheet->setCellValue($column++ . '1', lang($this->_className . '.label.' . $field));
foreach ($viewDatas['fields'] as $field) {
$sheet->setCellValue($column++ . '1', lang($this->_backend->getClassName() . '.label.' . $field));
}
//본문용
$line = 2;
foreach ($this->index_getEntitys() as $entity) {
$column = 'A';
foreach ($this->_viewDatas['fields'] as $field) {
$value = in_array($field, $this->_viewDatas['fieldFilters']) ? $this->_viewDatas['fieldFormOptions'][$field][$entity->$field] : $entity->$field;
foreach ($viewDatas['fields'] as $field) {
$value = in_array($field, $viewDatas['fieldFilters']) ? $viewDatas['fieldFormOptions'][$field][$entity->$field] : $entity->$field;
$sheet->setCellValue($column . $line, $value);
$column++;
}
@ -549,10 +489,12 @@ abstract class BaseController extends Controller
}
return $spreadsheet;
}
protected function excel_process()
public function excel()
{
try {
$this->_viewDatas = $this->init(__FUNCTION__);
$fileName = date('Y-m-d_Hm') . '.xlsx';
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($this->excel_spreadSheet(), 'Xlsx');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($this->excel_spreadSheet($this->_viewDatas), 'Xlsx');
//결과파일저장
$writer->save(PATHS['EXCEL'] . '/' . $fileName);
//Download시
@ -565,16 +507,6 @@ abstract class BaseController extends Controller
// flush();
// return readfile(PATHS['EXCEL'] . '/' . $fileName);
return $writer->save('php://output');
}
public function excel()
{
try {
$this->_viewDatas['fields'] = $this->_model->getFields('excel');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'excel');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas['batchjobFilters'] = $this->_model->getFieldBatchFilters();
$this->_viewDatas['fieldFormOptions'] = $this->getFieldFormOptions($this->_viewDatas['fieldFilters']);
return $this->excel_process();
} catch (\Exception $e) {
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']))->with('return_message', $e->getMessage());
}
@ -583,7 +515,7 @@ abstract class BaseController extends Controller
final public function download(string $field, $uid)
{
try {
$entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$entity = $this->_backend->getEntity([$this->_backend->getPrimaryKey() => $uid]);
if (!$entity->$field) {
throw new \Exception("첨부파일이 확인되지 않습니다.");
}

View File

@ -1,74 +0,0 @@
<?php
namespace App\Controllers\Front;
use App\Models\BoardConfigModel;
use App\Models\BoardModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class BoardController extends FrontHierarchyController
{
private $_boardConfigModel = null;
private $_board_config_uids = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->_className .= 'Board';
$this->_model = new BoardModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
}
//BoardConfig모델
final protected function getBoardConfigModel(): BoardConfigModel
{
return is_null($this->_boardConfigModel) ? new BoardConfigModel() : $this->_boardConfigModel;
}
//Field별 Form Option용
protected function getFieldFormOption(string $field): array
{
switch ($field) {
case 'board_config_uid':
$options = $this->_board_config_uids = $this->_board_config_uids ?: $this->getBoardConfigModel()->getFieldFormOptions(['status' => 'use']);
break;
default:
return parent::getFieldFormOption($field);
break;
}
if (!is_array($options)) {
throw new \Exception(__FUNCTION__ . "에서 {$this->_className}의 Field:{$field}의 FormOptionData가 array가 아닙니다.\n" . var_export($options, true));
}
return $options;
}
//Field별 Form Datas 처리용
protected function getFieldFormData(string $field, $entity = null): array
{
switch ($field) {
case 'passwd':
$this->_viewDatas['fieldDatas'][$field] = $this->request->getVar($field);
$this->_viewDatas['fieldDatas']['confirmpassword'] = $this->request->getVar('confirmpassword');
break;
case 'board_file':
$this->_viewDatas['fieldDatas'][$field] = $this->single_upload_procedure($field, $entity);
break;
default:
return parent::getFieldFormData($field, $entity);
break;
}
return $this->_viewDatas['fieldDatas'];
}
//View 관련
protected function view_process($entity)
{
// view_cnt에 추가하기위함
$this->_model->increaseViewCount($entity->getPrimaryKey());
return parent::view_process($entity);
}
}

View File

@ -7,7 +7,7 @@ use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class FrontController extends BASEController
class FrontController extends BaseController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{

View File

@ -1,63 +0,0 @@
<?php
namespace App\Controllers\Front;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
abstract class FrontHierarchyController extends FrontController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
}
//Reply관련
protected function reply_form_process($entity)
{
return $this->update_form_process($entity);
}
final public function reply_form($uid)
{
try {
$entity = $entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('reply');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'reply');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$this->_viewDatas['entity'] = $this->reply_form_process($entity);
return view($this->_viewPath . '/reply', $this->_viewDatas);
} catch (\Exception $e) {
return alert_CommonHelper($e->getMessage(), 'back');
}
}
protected function reply_validate($entity)
{
return $this->update_validate($entity);
}
protected function reply_process($entity)
{
return $this->_model->reply($entity, $this->_viewDatas['fieldDatas']);
}
public function reply($uid)
{
$message = "";
try {
$entity = $entity = $this->_model->getEntity([$this->_model->getPrimaryKey() => $uid]);
$this->_viewDatas['fields'] = $this->_model->getFields('reply');
$this->_viewDatas['fieldRules'] = $this->_model->getFieldRules($this->_viewDatas['fields'], 'reply');
$this->_viewDatas['fieldFilters'] = $this->_model->getFieldFilters();
$entity = $this->reply_validate($entity);
$entity = $this->reply_process($entity);
$message = "{$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.";
log_message("info", "{$this->_viewDatas['title']} {$message}");
return alert_CommonHelper($message, $this->_session->get(SESSION_NAMES['RETURN_URL']));
} catch (\Exception $e) {
$message = __FUNCTION__ . " 실패하였습니다.";
log_message("warning", $e->getMessage());
log_message("warning", var_export($this->_viewDatas['fieldDatas'], true));
log_message("info", "{$this->_viewDatas['title']} {$message}",);
return redirect()->back()->withInput()->with("error", $message . "<br>\n{$e->getMessage()}");
}
}
}

View File

@ -1,37 +0,0 @@
<?php
namespace App\Controllers\Front;
use App\Models\UserModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class UserController extends FrontController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->_className .= 'User';
$this->_model = new UserModel();
helper($this->_className);
$this->_viewPath .= strtolower($this->_className);
$this->_viewDatas['title'] = lang($this->_className . '.title');
$this->_viewDatas['className'] = $this->_className;
}
//Field별 Form Datas 처리용
protected function getFieldFormData(string $field, $entity = null): array
{
switch ($field) {
case 'passwd':
$this->_viewDatas['fieldDatas'][$field] = $this->request->getVar($field);
$this->_viewDatas['fieldDatas']['confirmpassword'] = $this->request->getVar('confirmpassword');
break;
default:
return parent::getFieldFormData($field, $entity);
break;
}
return $this->_viewDatas['fieldDatas'];
}
}

View File

@ -2,8 +2,17 @@
namespace App\Controllers;
class Home extends BaseController
use CodeIgniter\Controller;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class Home extends Controller
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
}
public function index()
{
return view('welcome_message');

View File

@ -11,8 +11,10 @@ abstract class BaseHierarchyModel extends BaseModel
{
parent::__construct();
$this->allowedFields = [...$this->allowedFields, "grpno", "grporder", "grpdepth"];
$this->validationRules = [...$this->validationRules,];
}
abstract function reply($parent_entity, array $formDatas): BaseEntity;
abstract public function getContentField();
abstract public function reply($parent_entity, array $formDatas): BaseEntity;
protected function getFieldRule(string $field, array $rules, string $action = ""): array
{
switch ($field) {
@ -30,24 +32,24 @@ abstract class BaseHierarchyModel extends BaseModel
final protected function create_process($entity, array $formDatas)
{
$entity = parent::create_process($entity, $formDatas);
//생성시는 grpno가 primarykey와 같고 숫자여야함
$this->builder()->set("grpno", $entity->getPrimaryKey());
$this->builder()->where($this->primaryKey, $entity->getPrimaryKey());
$this->builder()->update();
return $entity;
//생성시는 grpno의 max값을 구해서 넣는다.
$entity->grpno = $this->selectMax("grpno")->get()->getResult()[0]->grpno + 1;
if (!$entity->grpno) {
throw new \Exception("grpno는 {$entity->grpno}의 값을 가질수 없습니다.");
}
return parent::create_process($entity, $formDatas);
}
final protected function reply_process($parent_entity, $entity, array $formDatas)
{
//부모의 그룹과 grpno가 같고, 부모의 grporder보다 1 큰것을 grporder+1을 해서 update
//escape -> false옵션 반드시 있어야함
$this->builder()->set("grporder", "grporder+1", false);
$this->builder()->where([
$this->set("grporder", "grporder+1", false);
$this->where([
"grpno" => $parent_entity->grpno,
"grporder >" => $parent_entity->grporder
]);
$this->builder()->update();
$this->update();
//reply용 설정
$entity->grpno = $parent_entity->grpno;
$entity->grporder = $parent_entity->grporder + 1;

View File

@ -55,7 +55,7 @@ abstract class BaseModel extends Model
{
return $this->primaryKey;
}
abstract public function getTitle(): string;
abstract public function getTitleField(): string;
abstract public function getEntity($uid): BaseEntity;
abstract public function getFieldFilters(): array;
abstract public function getFields(string $action): array;
@ -183,6 +183,8 @@ abstract class BaseModel extends Model
private function save_process($entity)
{
// echo var_export($entity, true);
// exit;
if ($entity->hasChanged()) {
if (!$this->save($entity)) {
log_message("error", __FUNCTION__ . "에서 호출:" . $this->getLastQuery());

View File

@ -15,21 +15,21 @@ class BoardConfigModel extends BaseModel
$this->allowedFields = [...$this->allowedFields, ...$this->getFields()];
$this->validationRules = [...$this->validationRules, ...$this->getFieldRules($this->allowedFields),];
}
public function getTitle(): string
public function getTitleField(): string
{
return 'name';
}
public function getFields(string $action = ""): array
{
$fields = [
$this->getTitle(), "isaccess", "isread", "iswrite", "isreply", "isupload", "isdownload",
$this->getTitleField(), "isaccess", "isread", "iswrite", "isreply", "isupload", "isdownload",
"status", "head", "tail",
];
switch ($action) {
case "index":
case "excel":
return [
$this->getTitle(), "isaccess", "isread", "iswrite", "isreply", "isupload", "isdownload",
$this->getTitleField(), "isaccess", "isread", "iswrite", "isreply", "isupload", "isdownload",
"status", "created_at"
];
break;
@ -56,7 +56,7 @@ class BoardConfigModel extends BaseModel
$rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";
$rules[$field] .= $action == "insert" ? "|is_unique[{$this->table}.{$field}]" : "";
break;
case $this->getTitle():
case $this->getTitleField():
$rules[$field] = "required|trim|string";
$rules[$field] .= $action == "insert" ? "|is_unique[{$this->table}.{$field}]" : "";
break;

View File

@ -15,20 +15,24 @@ class BoardModel extends BaseHierarchyModel
$this->allowedFields = [...$this->allowedFields, ...$this->getFields(), "user_uid"];
$this->validationRules = [...$this->validationRules, ...$this->getFieldRules($this->allowedFields),];
}
public function getTitle(): string
public function getTitleField(): string
{
return 'title';
}
public function getContentField(): string
{
return 'content';
}
public function getFields(string $action = ""): array
{
$fields = ["board_config_uid", $this->getTitle(), "board_file", "passwd", "status", "content"];
$fields = ["board_config_uid", $this->getTitleField(), "board_file", "passwd", "status", "content"];
switch ($action) {
case "index":
case "excel":
return ["board_config_uid", "user_uid", $this->getTitle(), "board_file", "view_cnt", "status", "created_at"];
return ["board_config_uid", "user_uid", $this->getTitleField(), "board_file", "view_cnt", "status", "created_at"];
break;
case "view":
return ["board_config_uid", "user_uid", $this->getTitle(), "board_file", "view_cnt", "status", "created_at", "content"];
return ["board_config_uid", "user_uid", $this->getTitleField(), "board_file", "view_cnt", "status", "created_at", "content"];
break;
default:
return $fields;
@ -49,7 +53,7 @@ class BoardModel extends BaseHierarchyModel
case "board_config_uid":
$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 $this->getTitle():
case $this->getTitleField():
case "content":
$rules[$field] = "required|string";
break;
@ -88,7 +92,7 @@ class BoardModel extends BaseHierarchyModel
public function setIndexWordFilter(string $word)
{
parent::setIndexWordFilter($word);
$this->orLike($this->getTitle(), $word, "both");
$this->orLike($this->getTitleField(), $word, "both");
$this->orLike("content", $word, "both"); //befor , after , both
}
}

View File

@ -16,20 +16,20 @@ class UserModel extends BaseModel
$this->allowedFields = ["uid", ...$this->allowedFields, ...$this->getFields()];
$this->validationRules = [...$this->validationRules, ...$this->getFieldRules($this->allowedFields),];
}
public function getTitle(): string
public function getTitleField(): string
{
return 'name';
}
public function getFields(string $action = ""): array
{
$fields = ["id", "passwd", $this->getTitle(), "email", "role", "status"];
$fields = ["id", "passwd", $this->getTitleField(), "email", "role", "status"];
switch ($action) {
case "index":
case "excel":
return ["id", $this->getTitle(), "email", "role", "status", 'created_at'];
return ["id", $this->getTitleField(), "email", "role", "status", 'created_at'];
break;
case "view":
return ["id", $this->getTitle(), "email", "role", "status", 'updated_at', 'created_at'];
return ["id", $this->getTitleField(), "email", "role", "status", 'updated_at', 'created_at'];
break;
default:
return $fields;
@ -57,7 +57,7 @@ class UserModel extends BaseModel
$rules["confirmpassword"] = "required|trim|string|matches[passwd]";
}
break;
case $this->getTitle():
case $this->getTitleField():
$rules[$field] = "required|trim|string";
break;
case "email":
@ -105,6 +105,6 @@ class UserModel extends BaseModel
{
parent::setIndexWordFilter($word);
$this->orLike("id", $word, "both");
$this->orLike($this->getTitle(), $word, "both"); //befor , after , both
$this->orLike($this->getTitleField(), $word, "both"); //befor , after , both
}
}

View File

@ -14,17 +14,17 @@ class UserSNSModel extends BaseModel
$this->allowedFields = [...$this->allowedFields, ...$this->getFields(), "user_uid"];
$this->validationRules = [...$this->validationRules, ...$this->getFieldRules($this->allowedFields),];
}
public function getTitle(): string
public function getTitleField(): string
{
return 'name';
}
public function getFields(string $action = ""): array
{
$fields = ["site", "id", $this->getTitle(), "email", "detail", "status"];
$fields = ["site", "id", $this->getTitleField(), "email", "detail", "status"];
switch ($action) {
case "index":
case "excel":
return ["user_uid", "site", "id", $this->getTitle(), "email", "status", "created_at"];
return ["user_uid", "site", "id", $this->getTitleField(), "email", "status", "created_at"];
break;
case "view":
return [...$fields, "updated_at", "created_at"];
@ -49,7 +49,7 @@ class UserSNSModel extends BaseModel
$rules[$field] = "required|trim|string";
$rules[$field] .= $action == "insert" ? "|is_unique[{$this->table}.{$field}]" : "";
break;
case $this->getTitle():
case $this->getTitleField():
$rules[$field] = "required|trim|string";
break;
case "email":
@ -85,7 +85,7 @@ class UserSNSModel extends BaseModel
public function setIndexWordFilter(string $word)
{
parent::setIndexWordFilter($word);
$this->orLike($this->getTitle(), $word, "both");
$this->orLike($this->getTitleField(), $word, "both");
$this->orLike("email", $word, "both"); //befor , after , both
}
}

View File

@ -4,7 +4,6 @@
<?= form_open_multipart(current_url(), $forms['attributes'], $forms['hiddens']) ?>
<table class="form table table-bordered table-hover table-striped">
<?php foreach ($fields as $field) : ?>
<?= csrf_field() ?>
<tr>
<td class="label"><?= getFieldLabel_BoardHelper($field, $fieldRules) ?></td>
<td class="column">

View File

@ -0,0 +1,10 @@
<!-- left menu start -->
<link href="/css/admin/left_menu.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/side_menu.js"></script>
<div id="left_menu" class="shadow-lg rounded">
<div class="accordion accordion-flush">
<?= $this->include($layout['path'] . '/left_menu/base'); ?>
<?= $this->include($layout['path'] . '/left_menu/board'); ?>
<?= $this->include($layout['path'] . '/left_menu/hpilo'); ?>
</div>
</div>