shoppingmallv2 init...

This commit is contained in:
최준흠 2023-08-11 10:28:12 +09:00
parent f592b90073
commit 3de4a451c2
16 changed files with 215 additions and 35 deletions

View File

@ -218,6 +218,10 @@ define('ICONS', [
'HOME' => '<i class="bi bi-house-door-fill"></i>', 'HOME' => '<i class="bi bi-house-door-fill"></i>',
'PLAY' => '<i class="bi bi-play-fill"></i>', 'PLAY' => '<i class="bi bi-play-fill"></i>',
'CART' => '<i class="bi bi-cart4"></i>', 'CART' => '<i class="bi bi-cart4"></i>',
'UP' => '<i class="bi bi-arrow-up"></i>',
'DOWN' => '<i class="bi bi-arrow-down"></i>',
'LEFT' => '<i class="bi bi-arrow-left"></i>',
'RIGHT' => '<i class="bi bi-arrow-right"></i>',
'IMAGE_FILE' => '<i class="bi bi-file-earmark-image"></i>', 'IMAGE_FILE' => '<i class="bi bi-file-earmark-image"></i>',
]); ]);
define('CLASS_ICONS', [ define('CLASS_ICONS', [

View File

@ -169,6 +169,7 @@ $routes->group('front', ['namespace' => 'App\Controllers\Front'], function ($rou
$routes->get('', 'PaymentController::index'); $routes->get('', 'PaymentController::index');
$routes->get('card/(:uuid)', 'PaymentController::card_form/$1'); $routes->get('card/(:uuid)', 'PaymentController::card_form/$1');
$routes->post('card/(:uuid)', 'PaymentController::card/$1'); $routes->post('card/(:uuid)', 'PaymentController::card/$1');
$routes->get('deposit/(:uuid)', 'PaymentController::deposit_form/$1');
}); });
}); });
/* /*

View File

@ -2,16 +2,18 @@
namespace App\Controllers\Front; namespace App\Controllers\Front;
use App\Entities\PaymentEntity;
use App\Libraries\Adapter\Payment\CookiePayment as PaymentAdapter;
use App\Models\OrderModel;
use App\Models\PaymentModel; use App\Models\PaymentModel;
use App\Models\UserModel;
use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use App\Models\OrderModel;
use App\Entities\PaymentEntity;
use App\Libraries\Adapter\Payment\CookiePayment as PaymentAdapter;
class PaymentController extends FrontController class PaymentController extends FrontController
{ {
private $_userModel = null;
private $_orderModel = null; private $_orderModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{ {
@ -23,6 +25,10 @@ class PaymentController extends FrontController
$this->isRole('index'); $this->isRole('index');
} }
private function getUserModel()
{
return $this->_userModel = $this->_userModel ?: new UserModel();
}
private function getOrderModel() private function getOrderModel()
{ {
return $this->_orderModel = $this->_orderModel ?: new OrderModel(); return $this->_orderModel = $this->_orderModel ?: new OrderModel();
@ -74,6 +80,7 @@ class PaymentController extends FrontController
{ {
try { try {
$this->card_init(); $this->card_init();
$this->_viewDatas['user'] = $this->getUserModel()->getEntity([$this->getUserModel()->getPrimaryKey() => $this->_viewDatas['auth'][AUTH_FIELDS['ID']]]);
$this->_viewDatas['order'] = $this->getOrderModel()->getEntity([$this->getOrderModel()->getPrimaryKey() => $uid]); $this->_viewDatas['order'] = $this->getOrderModel()->getEntity([$this->getOrderModel()->getPrimaryKey() => $uid]);
helper(['form']); helper(['form']);
$this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []]; $this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => []];
@ -111,7 +118,7 @@ class PaymentController extends FrontController
{ {
$msg = ""; $msg = "";
try { try {
$this->_viewDatas = $this->card_init(); $this->card_init();
$this->card_validate(); $this->card_validate();
$entity = $this->card_process(); $entity = $this->card_process();
$msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다."; $msg = "{$this->_viewDatas['title']}에서 {$entity->getTitle()}" . __FUNCTION__ . " 완료하였습니다.";
@ -125,4 +132,21 @@ class PaymentController extends FrontController
$this->_session->setFlashdata("return_message", $msg); $this->_session->setFlashdata("return_message", $msg);
} }
} }
public function deposit_form($uid)
{
try {
$this->_viewDatas['bank'] = [
"name" => getenv("payment.deposit.bank.name") ?: "은행명",
"account" => getenv("payment.deposit.bank.account") ?: "계좌번호",
"holder" => getenv("payment.deposit.bank.holder") ?: "예금주"
];
$this->_viewDatas['order'] = $this->getOrderModel()->getEntity([$this->getOrderModel()->getPrimaryKey() => $uid]);
$this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']);
return view($this->_viewPath . '/deposit', ['viewDatas' => $this->_viewDatas]);
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return redirect()->to($this->_session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/")->with('return_message', $e->getMessage());
}
}
} }

View File

@ -105,11 +105,23 @@ function getFieldFilter_BoardHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_BoardHelper($field, array $viewDatas) function getFieldIndex_Column_BoardHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용
function getFieldIndex_Row_BoardHelper($field, $entity, array $viewDatas): string function getFieldIndex_Row_BoardHelper($field, $entity, array $viewDatas): string
{ {

View File

@ -105,9 +105,22 @@ function getFieldFilter_CategoryHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_CategoryHelper($field, array $viewDatas) function getFieldIndex_Column_CategoryHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용

View File

@ -99,9 +99,22 @@ function getFieldFilter_OrderHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_OrderHelper($field, array $viewDatas) function getFieldIndex_Column_OrderHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용
@ -112,7 +125,7 @@ function getFieldIndex_Row_OrderHelper($field, $entity, array $viewDatas): strin
case 'title': case 'title':
case 'name': case 'name':
return sprintf( return sprintf(
"<div class=\"location-left\">%s : %s<BR>%s</div>", "%s : %s<BR>%s",
lang("{$viewDatas['className']}.label.uid"), lang("{$viewDatas['className']}.label.uid"),
$entity->getOrderHint(), $entity->getOrderHint(),
anchor( anchor(
@ -124,11 +137,15 @@ function getFieldIndex_Row_OrderHelper($field, $entity, array $viewDatas): strin
break; break;
case 'status': case 'status':
if ($value == DEFAULTS['STATUS']) { if ($value == DEFAULTS['STATUS']) {
return anchor( return sprintf("<div class=\"payment_card\">%s</div><div class=\"payment_deposit\">%s</div>", anchor(
'/front/payment/card/' . $entity->getPrimaryKey(), '/front/payment/card/' . $entity->getPrimaryKey(),
$viewDatas['fieldFormOptions'][$field][$value], "카드결제",
["class" => "btn btn-sm btn-primary btn-circle", "style" => "color:white", "target" => "_self"] ["class" => "btn btn-sm btn-primary btn-circle", "style" => "color:white", "target" => "_self"]
); ), anchor(
'/front/payment/deposit/' . $entity->getPrimaryKey(),
"무통장입금",
["class" => "btn btn-sm btn-info btn-circle", "style" => "color:white", "target" => "_self"]
));
} else { } else {
return getFieldView_OrderHelper($field, $entity, $viewDatas); return getFieldView_OrderHelper($field, $entity, $viewDatas);
} }

View File

@ -88,6 +88,12 @@ function getFieldForm_PaymentHelper($field, $value, array $viewDatas, array $att
form_dropdown("{$field}[]", $years, DEFAULTS['EMPTY']), form_dropdown("{$field}[]", $years, DEFAULTS['EMPTY']),
); );
break; break;
case 'card_email':
return form_input($field, $viewDatas['user']->email);
break;
case 'card_mobile':
return form_input($field, $viewDatas['user']->mobile);
break;
default: default:
return form_input($field, $value); return form_input($field, $value);
break; break;
@ -129,9 +135,22 @@ function getFieldFilter_PaymentHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_PaymentHelper($field, array $viewDatas) function getFieldIndex_Column_PaymentHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용

View File

@ -114,12 +114,25 @@ function getFieldFilter_ProductHelper($field, $value, array $viewDatas)
return form_dropdown($field, $viewDatas['fieldFormOptions'][$field], $value, ['class' => "select-field"]); return form_dropdown($field, $viewDatas['fieldFormOptions'][$field], $value, ['class' => "select-field"]);
} // } //
function getFieldIndex_Column_ProductHelper($field, array $viewDatas) function getFieldIndex_Column_Productelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용

View File

@ -105,9 +105,22 @@ function getFieldFilter_SitepageHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_SitepageHelper($field, array $viewDatas) function getFieldIndex_Column_SitepageHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용

View File

@ -93,9 +93,22 @@ function getFieldFilter_UserSNSHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_UserSNSHelper($field, array $viewDatas) function getFieldIndex_Column_UserSNSHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용

View File

@ -109,9 +109,22 @@ function getFieldFilter_UserHelper($field, $value, array $viewDatas)
function getFieldIndex_Column_UserHelper($field, array $viewDatas) function getFieldIndex_Column_UserHelper($field, array $viewDatas)
{ {
$label = lang("{$viewDatas['className']}.label.{$field}"); $label = lang("{$viewDatas['className']}.label.{$field}");
$label = $field == $viewDatas['order_field'] ? sprintf('%s <i class="fa fa-arrow-%s"></i>', $label, $viewDatas['order_value'] == 'ASC' ? "up" : "down") : $label; if ($field == $viewDatas['order_field']) {
$label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN'];
}
$value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC";
return anchor(current_url() . "?order_field={$field}&order_value={$value}", $label); $viewDatas['uri']->addQuery('order_field', $field);
$viewDatas['uri']->addQuery('order_value', $value);
$columnData = anchor($viewDatas['uri'], $label);
switch ($field) {
case 'title':
case 'name':
return sprintf("<th style=\"width:100px;\">%s</th>", $columnData);
break;
default:
return sprintf("<th>%s</th>", $columnData);
break;
}
} // } //
//Front용 //Front용

View File

@ -16,7 +16,7 @@ return [
'created_at' => "작성일" 'created_at' => "작성일"
], ],
"STATUS" => [ "STATUS" => [
"use" => "결제하기", "use" => "장바구니",
"unuse" => "주문취소", "unuse" => "주문취소",
"paid" => "결제완료" "paid" => "결제완료"
] ]

View File

@ -19,10 +19,10 @@ class CookiePayment extends Payment
$adapter = new APIAdapter(); $adapter = new APIAdapter();
$adapter->setHeader("content-type", "application/json; charset=utf-8"); $adapter->setHeader("content-type", "application/json; charset=utf-8");
/* 토큰 발행 API */ /* 토큰 발행 API */
$adapter->setURL(getenv("payment.cookiepay.token_url") ?: "{TOKEN 발행 URL}"); $adapter->setURL(getenv("payment.card.pay2.token_url") ?: "{TOKEN 발행 URL}");
$adapter->setDatas(array( $adapter->setDatas(array(
'pay2_id' => 'cookiepayments에서 발급받은 ID', 'pay2_id' => getenv("payment.card.pay2.id") ?: 'cookiepayments에서 발급받은 ID',
'pay2_key' => 'cookiepayments에서 발급받은 연동키', 'pay2_key' => getenv("payment.card.pay2.key") ?: 'cookiepayments에서 발급받은 연동키',
)); ));
$token = $adapter->execute(); $token = $adapter->execute();
/* 여기 까지 */ /* 여기 까지 */
@ -35,9 +35,9 @@ class CookiePayment extends Payment
{ {
$adapter = new APIAdapter(); $adapter = new APIAdapter();
$adapter->setHeader("content-type", "application/json; charset=utf-8"); $adapter->setHeader("content-type", "application/json; charset=utf-8");
$adapter->setHeader("ApiKey", getenv("payment.cookiepay.apikey") ?: "COOKIEPAY에서 발급받은 연동키"); $adapter->setHeader("ApiKey", getenv("payment.card.pay2.apikey") ?: "COOKIEPAY에서 발급받은 연동키");
$adapter->setHeader("TOKEN", $this->getToken()); $adapter->setHeader("TOKEN", $this->getToken());
$adapter->setURL(getenv("payment.cookiepay.url") ?: "{요청도메인}/keyin/payment"); $adapter->setURL(getenv("payment.card.pay2.url") ?: "{요청도메인}/keyin/payment");
$adapter->setDatas(array( $adapter->setDatas(array(
'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID', 'API_ID' => 'COOKIEPAY에서 발급받은 가맹점연동 ID',
'ORDERNO' => '주문번호', 'ORDERNO' => '주문번호',

View File

@ -10,7 +10,7 @@
<thead> <thead>
<tr> <tr>
<th>번호</th> <th>번호</th>
<?php foreach ($viewDatas['fields'] as $field) : ?><th><?= getFieldIndex_Column_OrderHelper($field, $viewDatas) ?></th><?php endforeach ?> <?php foreach ($viewDatas['fields'] as $field) : ?><?= getFieldIndex_Column_OrderHelper($field, $viewDatas) ?><?php endforeach ?>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -21,7 +21,7 @@
<?= $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt) ?> <?= $viewDatas['total_count'] - (($viewDatas['page'] - 1) * $viewDatas['per_page'] + $cnt) ?>
</td> </td>
<?php foreach ($viewDatas['fields'] as $field) : ?> <?php foreach ($viewDatas['fields'] as $field) : ?>
<td nowrap><?= getFieldIndex_Row_OrderHelper($field, $entity, $viewDatas) ?></td> <td><?= getFieldIndex_Row_OrderHelper($field, $entity, $viewDatas) ?></td>
<?php endforeach ?> <?php endforeach ?>
</tr> </tr>
<?php $cnt++ ?> <?php $cnt++ ?>

View File

@ -23,7 +23,7 @@
</tr> </tr>
<?php endforeach; ?> <?php endforeach; ?>
<tr> <tr>
<td valign="bottom" colspan="2"><?= form_submit('', '입력', array("class" => "btn btn-outline btn-primary")); ?></td> <td valign="bottom" colspan="2"><?= form_submit('', '결제', array("class" => "btn btn-outline btn-primary")); ?></td>
</tr> </tr>
</table> </table>
<?= form_close(); ?> <?= form_close(); ?>

View File

@ -0,0 +1,38 @@
<?= $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['category']->head) ?></div>
<table class="form table table-bordered table-hover table-striped">
<tr>
<td class="label">상품명</td>
<td class="column"><?= $viewDatas['order']->getTitle() ?></td>
</tr>
<tr>
<td class="label">결제금액</td>
<td class="column"><?= number_format($viewDatas['order']->price) ?>원</td>
</tr>
<tr>
<td class="label">은행명</td>
<td class="column"><?= $viewDatas['bank']['name'] ?></td>
</tr>
<tr>
<td class="label">계좌번호</td>
<td class="column"><?= $viewDatas['bank']['account'] ?></td>
</tr>
<tr>
<td class="label">예금주</td>
<td class="column"><?= $viewDatas['bank']['holder'] ?></td>
</tr>
<tr>
<td colspan="2">
설명문......
설명문......
설명문......
설명문......
</td>
</tr>
</table>
<div><?= html_entity_decode($viewDatas['category']->tail) ?></div>
</div>
<?= $this->endSection() ?>