From 3a1ecb92ebde2aa85004b09fe1d6974cae174624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A4=80=ED=9D=A0?= Date: Fri, 11 Aug 2023 20:20:30 +0900 Subject: [PATCH] shoppingmallv2 init... --- app/Config/Constants.php | 9 ++- app/Config/Routes.php | 12 +-- app/Controllers/Admin/BoardController.php | 2 +- app/Controllers/BaseController.php | 2 +- app/Controllers/Ecommerce/CartController.php | 1 + .../Ecommerce/EcommerceController.php | 2 +- .../Ecommerce/Payment/CardController.php | 5 +- .../Ecommerce/Payment/DepositController.php | 8 +- .../Ecommerce/Payment/PaymentController.php | 6 ++ app/Controllers/Front/FrontController.php | 2 +- .../{Ecommerce_helper.php => Card_helper.php} | 14 ++-- app/Helpers/Deposit_helper.php | 74 +++++++++++++++++++ app/Helpers/Order_helper.php | 4 +- app/Language/ko/{Ecommerce.php => Card.php} | 3 +- app/Language/ko/Deposit.php | 9 +++ app/Models/BaseHierarchyModel.php | 2 +- app/Models/BaseModel.php | 2 +- app/Models/BoardModel.php | 2 +- app/Models/CategoryModel.php | 2 +- app/Models/OrderModel.php | 2 +- app/Models/PaymentModel.php | 2 +- app/Models/ProductModel.php | 2 +- app/Models/SitepageModel.php | 2 +- app/Models/UserModel.php | 2 +- app/Models/UserSNSModel.php | 2 +- .../{card.php => payment/card/insert.php} | 4 +- .../deposit/insert.php} | 5 +- 27 files changed, 141 insertions(+), 41 deletions(-) rename app/Helpers/{Ecommerce_helper.php => Card_helper.php} (84%) create mode 100644 app/Helpers/Deposit_helper.php rename app/Language/ko/{Ecommerce.php => Card.php} (82%) create mode 100644 app/Language/ko/Deposit.php rename app/Views/ecommerce/{card.php => payment/card/insert.php} (86%) rename app/Views/ecommerce/{deposit.php => payment/deposit/insert.php} (86%) diff --git a/app/Config/Constants.php b/app/Config/Constants.php index d837890..73ef039 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -154,8 +154,8 @@ define('URLS', [ 'LOGOUT' => '/front/user/logout', 'addCart' => '/ecommerce/addCart', 'cancelCart' => '/ecommerce/cancelCart', - 'paymentCard' => '/ecommerce/paymentCard', - 'depositPayment' => '/ecommerce/depositPayment', + 'paymentCard' => '/ecommerce/payment/card', + 'paymentDeposit' => '/ecommerce/payment/deposit', ]); //SESSION 관련 define('SESSION_NAMES', [ @@ -233,9 +233,12 @@ define('CLASS_ICONS', [ 'SITEPAGE' => '', 'CATEGORY' => '', 'PRODUCT' => '', - 'ORDER' => '', + 'ORDER' => '', 'PAYMENT' => '', 'ECOMMERCE' => '', + 'CART' => '', + 'CARD' => '', + 'DEPOSIT' => '', ]); define('AUDIOS', [ 'Alram_GetEmail' => '', diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 5d3cfd0..16326a4 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -37,13 +37,15 @@ $routes->addPlaceholder('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4} $routes->get('/', 'Home::index'); $routes->group('cli', ['namespace' => 'App\Controllers\CLI'], function ($routes) { }); -$routes->group('ecommerce', ['namespace' => 'App\Controllers'], function ($routes) { +$routes->group('ecommerce', ['namespace' => 'App\Controllers\Ecommerce'], function ($routes) { $routes->post('addCart', 'CartController::insert'); $routes->get('cancelCart', 'CartController::delete'); - $routes->get('paymentCard/(:uuid)', 'EcommerceController::cardPayment_form/$1', ['filter' => 'authFilter:user']); - $routes->post('paymentCard/(:uuid)', 'EcommerceController::cardPayment/$1', ['filter' => 'authFilter:user']); - $routes->get('depositPayment/(:uuid)', 'EcommerceController::depositPayment_form/$1', ['filter' => 'authFilter:user']); - $routes->post('depositPayment/(:uuid)', 'EcommerceController::depositPayment/$1', ['filter' => 'authFilter:user']); + $routes->group('payment', ['namespace' => 'App\Controllers\Ecommerce\Payment', 'filter' => 'authFilter:user'], function ($routes) { + $routes->get('card', 'CardController::insert_form'); + $routes->post('card', 'CardController::insert'); + $routes->get('deposit', 'DepositController::insert_form'); + $routes->post('deposit', 'DepositController::insert'); + }); }); // authGuard는 App\Config\Filters.php의 $aliases에 선언한 이름이어야 함 $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'authFilter:manager'], static function ($routes) { diff --git a/app/Controllers/Admin/BoardController.php b/app/Controllers/Admin/BoardController.php index 6375764..84bac6c 100644 --- a/app/Controllers/Admin/BoardController.php +++ b/app/Controllers/Admin/BoardController.php @@ -16,7 +16,7 @@ class BoardController extends AdminController $this->_model = new BoardModel(); $this->_viewDatas['className'] = 'Board'; parent::initController($request, $response, $logger); - $this->_viewPath .= strtolower($this->_viewDatas['className']); + $this->_viewPath .= strtolower($this->_viewDatas['className']);; } public function getFields(string $action = ""): array diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index c454101..94e0611 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -82,7 +82,7 @@ abstract class BaseController extends Controller { switch ($field) { default: - $rules[$field] = $this->_model->getFieldRule($field, $rules, $action); + $rules = $this->_model->getFieldRule($field, $rules, $action); break; } return $rules; diff --git a/app/Controllers/Ecommerce/CartController.php b/app/Controllers/Ecommerce/CartController.php index d26bbe4..b23562e 100644 --- a/app/Controllers/Ecommerce/CartController.php +++ b/app/Controllers/Ecommerce/CartController.php @@ -12,6 +12,7 @@ class CartController extends EcommerceController { $this->_viewDatas['className'] = 'Cart'; parent::initController($request, $response, $logger); + $this->_viewPath .= strtolower($this->_viewDatas['className']); } public function getFields(string $action = ""): array diff --git a/app/Controllers/Ecommerce/EcommerceController.php b/app/Controllers/Ecommerce/EcommerceController.php index 57fd95f..e03768e 100644 --- a/app/Controllers/Ecommerce/EcommerceController.php +++ b/app/Controllers/Ecommerce/EcommerceController.php @@ -22,7 +22,7 @@ abstract class EcommerceController extends BaseController { parent::initController($request, $response, $logger); $this->_session = \Config\Services::session(); - $this->_viewPath .= 'ecommerce/'; + $this->_viewPath = 'ecommerce/'; $this->_viewDatas['control'] = 'front'; $this->_viewDatas['layout'] = LAYOUTS['front']; } diff --git a/app/Controllers/Ecommerce/Payment/CardController.php b/app/Controllers/Ecommerce/Payment/CardController.php index 271661d..c327c25 100644 --- a/app/Controllers/Ecommerce/Payment/CardController.php +++ b/app/Controllers/Ecommerce/Payment/CardController.php @@ -12,6 +12,7 @@ class CardController extends PaymentController { public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) { + $this->_viewDatas['className'] = 'Card'; parent::initController($request, $response, $logger); $this->_viewPath .= strtolower($this->_viewDatas['className']); } @@ -20,7 +21,7 @@ class CardController extends PaymentController { switch ($action) { case 'insert': - return ["order_uid", "card_quota", "card_number", "card_expiration", "email", "mobile"]; + return ["card_quota", "card_number", "card_expiration", "email", "mobile"]; break; default: return []; @@ -83,6 +84,7 @@ class CardController extends PaymentController //Insert관련 protected function insert_form_process() { + parent::insert_form_process(); $this->_viewDatas['forms'] = ['attributes' => ['method' => "post",], 'hiddens' => ['order_uid' => $this->_viewDatas['order']->getPrimaryKey()]]; } public function insert_form() @@ -91,7 +93,6 @@ class CardController extends PaymentController $uid = $this->request->getVar('order_uid') ?: throw new \Exception("주문번호가 지정되지 않았습니다."); $this->_viewDatas = $this->init(__FUNCTION__); $this->_viewDatas['order'] = $this->getOrderModel()->getEntity([$this->getOrderModel()->getPrimaryKey() => $uid]); - $this->_viewDatas['user'] = $this->getUserModel()->getEntity([$this->getUserModel()->getPrimaryKey() => $this->_viewDatas['auth'][AUTH_FIELDS['ID']]]); $this->insert_form_process(); helper(['form']); $this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']); diff --git a/app/Controllers/Ecommerce/Payment/DepositController.php b/app/Controllers/Ecommerce/Payment/DepositController.php index cfeff1c..a005c03 100644 --- a/app/Controllers/Ecommerce/Payment/DepositController.php +++ b/app/Controllers/Ecommerce/Payment/DepositController.php @@ -12,13 +12,14 @@ class DepositController extends PaymentController { $this->_viewDatas['className'] = 'Deposit'; parent::initController($request, $response, $logger); + $this->_viewPath .= strtolower($this->_viewDatas['className']); } public function getFields(string $action = ""): array { switch ($action) { case 'insert': - return ["order_uid", "email", "mobile"]; + return ["email", "mobile"]; break; default: return []; @@ -56,6 +57,7 @@ class DepositController extends PaymentController //Insert관련 protected function insert_form_process() { + parent::insert_form_process(); $this->_viewDatas['bank'] = [ "name" => getenv("payment.deposit.bank.name") ?: "은행명", "account" => getenv("payment.deposit.bank.account") ?: "계좌번호", @@ -69,8 +71,10 @@ class DepositController extends PaymentController $uid = $this->request->getVar('order_uid') ?: throw new \Exception("주문번호가 지정되지 않았습니다."); $this->_viewDatas = $this->init(__FUNCTION__); $this->_viewDatas['order'] = $this->getOrderModel()->getEntity([$this->getOrderModel()->getPrimaryKey() => $uid]); + $this->insert_form_process(); + helper(['form']); $this->_session->keepFlashdata(SESSION_NAMES['RETURN_URL']); - return view($this->_viewPath . '/deposit', ['viewDatas' => $this->_viewDatas]); + return view($this->_viewPath . '/insert', ['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()); diff --git a/app/Controllers/Ecommerce/Payment/PaymentController.php b/app/Controllers/Ecommerce/Payment/PaymentController.php index df59392..a0fdf0c 100644 --- a/app/Controllers/Ecommerce/Payment/PaymentController.php +++ b/app/Controllers/Ecommerce/Payment/PaymentController.php @@ -36,6 +36,12 @@ abstract class PaymentController extends EcommerceController return $this->_categoryModel = $this->_categoryModel ?: new CategoryModel(); } + //insert관련 + protected function insert_form_process() + { + parent::insert_form_process(); + $this->_viewDatas['user'] = $this->getUserModel()->getEntity([$this->getUserModel()->getPrimaryKey() => $this->_viewDatas['auth'][AUTH_FIELDS['ID']]]); + } protected function insert_process() { //Order 테이블에 결제완료 처리 diff --git a/app/Controllers/Front/FrontController.php b/app/Controllers/Front/FrontController.php index 2f554b6..30af901 100644 --- a/app/Controllers/Front/FrontController.php +++ b/app/Controllers/Front/FrontController.php @@ -15,7 +15,7 @@ abstract class FrontController extends BaseController public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) { parent::initController($request, $response, $logger); - $this->_viewPath .= 'front/'; + $this->_viewPath = 'front/'; $this->_viewDatas['control'] = 'front'; $this->_viewDatas['layout'] = LAYOUTS['front']; } diff --git a/app/Helpers/Ecommerce_helper.php b/app/Helpers/Card_helper.php similarity index 84% rename from app/Helpers/Ecommerce_helper.php rename to app/Helpers/Card_helper.php index 13f0856..5107270 100644 --- a/app/Helpers/Ecommerce_helper.php +++ b/app/Helpers/Card_helper.php @@ -1,5 +1,5 @@ $field ?: DEFAULTS['EMPTY']; switch ($field) { @@ -68,13 +68,13 @@ function getFieldView_EcommerceHelper($field, $entity, array $viewDatas) } } // -function getFieldFilter_EcommerceHelper($field, $value, array $viewDatas) +function getFieldFilter_CardHelper($field, $value, array $viewDatas) { $viewDatas['fieldFormOptions'][$field] = [DEFAULTS['EMPTY'] => lang("{$viewDatas['className']}.label.{$field}") . " 선택", ...$viewDatas['fieldFormOptions'][$field]]; return form_dropdown($field, $viewDatas['fieldFormOptions'][$field], $value, ['class' => "select-field"]); } // -function getFieldIndex_Column_EcommerceHelper($field, array $viewDatas) +function getFieldIndex_Column_CardHelper($field, array $viewDatas) { $label = lang("{$viewDatas['className']}.label.{$field}"); if ($field == $viewDatas['order_field']) { @@ -92,12 +92,12 @@ function getFieldIndex_Column_EcommerceHelper($field, array $viewDatas) } // //Front용 -function getFieldIndex_Row_EcommerceHelper($field, $entity, array $viewDatas): string +function getFieldIndex_Row_CardHelper($field, $entity, array $viewDatas): string { $value = $entity->$field ?: DEFAULTS['EMPTY']; switch ($field) { default: - return sprintf("%s", getFieldView_EcommerceHelper($field, $entity, $viewDatas)); + return sprintf("%s", getFieldView_CardHelper($field, $entity, $viewDatas)); break; } } // \ No newline at end of file diff --git a/app/Helpers/Deposit_helper.php b/app/Helpers/Deposit_helper.php new file mode 100644 index 0000000..fd35190 --- /dev/null +++ b/app/Helpers/Deposit_helper.php @@ -0,0 +1,74 @@ +%s", implode(" ", $attributes), lang("{$viewDatas['className']}.label.{$field}")); + break; + } +} +//header.php에서 getFieldForm_Helper사용 +function getFieldForm_DepositHelper($field, $value, array $viewDatas, array $attributes = array()) +{ + $value = $value ?: DEFAULTS['EMPTY']; + switch ($field) { + + case 'email': + return form_input($field, $viewDatas['user']->email); + break; + case 'mobile': + return form_input($field, $viewDatas['user']->mobile); + break; + default: + return form_input($field, $value); + break; + } +} // + +function getFieldView_DepositHelper($field, $entity, array $viewDatas) +{ + $value = $entity->$field ?: DEFAULTS['EMPTY']; + switch ($field) { + default: + return in_array($field, $viewDatas['fieldFilters']) && $value ? $viewDatas['fieldFormOptions'][$field][$value] : $value; + break; + } +} // + +function getFieldFilter_DepositHelper($field, $value, array $viewDatas) +{ + $viewDatas['fieldFormOptions'][$field] = [DEFAULTS['EMPTY'] => lang("{$viewDatas['className']}.label.{$field}") . " 선택", ...$viewDatas['fieldFormOptions'][$field]]; + return form_dropdown($field, $viewDatas['fieldFormOptions'][$field], $value, ['class' => "select-field"]); +} // + +function getFieldIndex_Column_DepositHelper($field, array $viewDatas) +{ + $label = lang("{$viewDatas['className']}.label.{$field}"); + if ($field == $viewDatas['order_field']) { + $label .= $viewDatas['order_value'] == 'ASC' ? ICONS['UP'] : ICONS['DOWN']; + } + $value = $viewDatas['order_value'] == 'DESC' ? "ASC" : "DESC"; + $viewDatas['uri']->addQuery('order_field', $field); + $viewDatas['uri']->addQuery('order_value', $value); + $columnData = anchor($viewDatas['uri'], $label); + switch ($field) { + default: + return sprintf("%s", $columnData); + break; + } +} // + +//Front용 +function getFieldIndex_Row_DepositHelper($field, $entity, array $viewDatas): string +{ + $value = $entity->$field ?: DEFAULTS['EMPTY']; + switch ($field) { + default: + return sprintf("%s", getFieldView_DepositHelper($field, $entity, $viewDatas)); + break; + } +} // \ No newline at end of file diff --git a/app/Helpers/Order_helper.php b/app/Helpers/Order_helper.php index ab7fab5..7e77894 100644 --- a/app/Helpers/Order_helper.php +++ b/app/Helpers/Order_helper.php @@ -140,12 +140,12 @@ function getFieldIndex_Row_OrderHelper($field, $entity, array $viewDatas): strin return sprintf( "
%s
%s
%s
", anchor( - URLS['paymentCard'] . '/' . $entity->getPrimaryKey(), + URLS['paymentCard'] . '?order_uid=' . $entity->getPrimaryKey(), "카드결제", ["class" => "btn btn-sm btn-primary btn-circle", "style" => "color:white", "target" => "_self"] ), anchor( - URLS['depositPayment'] . '/' . $entity->getPrimaryKey(), + URLS['paymentDeposit'] . '?order_uid=' . $entity->getPrimaryKey(), "무통장입금", ["class" => "btn btn-sm btn-info btn-circle", "style" => "color:white", "target" => "_self"] ), diff --git a/app/Language/ko/Ecommerce.php b/app/Language/ko/Card.php similarity index 82% rename from app/Language/ko/Ecommerce.php rename to app/Language/ko/Card.php index be73d58..494b0ac 100644 --- a/app/Language/ko/Ecommerce.php +++ b/app/Language/ko/Card.php @@ -1,7 +1,8 @@ "결제 정보", + 'title' => "카드결제", 'label' => [ + 'order_uid' => '주문번호', 'card_quota' => '카드할부', 'card_number' => '카드번호', 'card_expiration' => '유효기간', diff --git a/app/Language/ko/Deposit.php b/app/Language/ko/Deposit.php new file mode 100644 index 0000000..aecbf23 --- /dev/null +++ b/app/Language/ko/Deposit.php @@ -0,0 +1,9 @@ + "무통장입금결제", + 'label' => [ + 'order_uid' => '주문번호', + 'email' => '이메일', + 'mobile' => '휴대폰(인증용)', + ], +]; diff --git a/app/Models/BaseHierarchyModel.php b/app/Models/BaseHierarchyModel.php index 1f1ed29..afc11b8 100644 --- a/app/Models/BaseHierarchyModel.php +++ b/app/Models/BaseHierarchyModel.php @@ -19,7 +19,7 @@ abstract class BaseHierarchyModel extends BaseModel { return $this->getEntitys(['grpno' => $entity->getHierarchy_No()]); } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case "grpno": diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index a81f3fc..c5cf9a3 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -73,7 +73,7 @@ abstract class BaseModel extends Model { return $this->where($conditions)->findAll(); } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case $this->primaryKey: diff --git a/app/Models/BoardModel.php b/app/Models/BoardModel.php index a3164fb..dceda43 100644 --- a/app/Models/BoardModel.php +++ b/app/Models/BoardModel.php @@ -28,7 +28,7 @@ class BoardModel extends BaseHierarchyModel { return 'content'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case "category_uid": diff --git a/app/Models/CategoryModel.php b/app/Models/CategoryModel.php index 1a4c9b6..1c8bc88 100644 --- a/app/Models/CategoryModel.php +++ b/app/Models/CategoryModel.php @@ -26,7 +26,7 @@ class CategoryModel extends BaseHierarchyModel { return 'head'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case $this->getTitleField(): diff --git a/app/Models/OrderModel.php b/app/Models/OrderModel.php index 411e526..4156cae 100644 --- a/app/Models/OrderModel.php +++ b/app/Models/OrderModel.php @@ -21,7 +21,7 @@ class OrderModel extends BaseModel { return 'name'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case 'product_uid': diff --git a/app/Models/PaymentModel.php b/app/Models/PaymentModel.php index e196701..f965567 100644 --- a/app/Models/PaymentModel.php +++ b/app/Models/PaymentModel.php @@ -20,7 +20,7 @@ class PaymentModel extends BaseModel { return 'name'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case 'product_uid': diff --git a/app/Models/ProductModel.php b/app/Models/ProductModel.php index c830cfa..35a95c8 100644 --- a/app/Models/ProductModel.php +++ b/app/Models/ProductModel.php @@ -28,7 +28,7 @@ class ProductModel extends BaseModel return 'name'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case "category_uid": diff --git a/app/Models/SitepageModel.php b/app/Models/SitepageModel.php index f04b8c6..d11cf36 100644 --- a/app/Models/SitepageModel.php +++ b/app/Models/SitepageModel.php @@ -28,7 +28,7 @@ class SitepageModel extends BaseModel { return 'content'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case "category_uid": diff --git a/app/Models/UserModel.php b/app/Models/UserModel.php index ba93178..e0c428a 100644 --- a/app/Models/UserModel.php +++ b/app/Models/UserModel.php @@ -23,7 +23,7 @@ class UserModel extends BaseModel { return 'name'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case "id": diff --git a/app/Models/UserSNSModel.php b/app/Models/UserSNSModel.php index df81626..3a3ca16 100644 --- a/app/Models/UserSNSModel.php +++ b/app/Models/UserSNSModel.php @@ -22,7 +22,7 @@ class UserSNSModel extends BaseModel return 'name'; } - protected function getFieldRule(string $field, array $rules, string $action = ""): array + public function getFieldRule(string $field, array $rules, string $action = ""): array { switch ($field) { case "id": diff --git a/app/Views/ecommerce/card.php b/app/Views/ecommerce/payment/card/insert.php similarity index 86% rename from app/Views/ecommerce/card.php rename to app/Views/ecommerce/payment/card/insert.php index 6d813df..87f77da 100644 --- a/app/Views/ecommerce/card.php +++ b/app/Views/ecommerce/payment/card/insert.php @@ -15,9 +15,9 @@ - + - + diff --git a/app/Views/ecommerce/deposit.php b/app/Views/ecommerce/payment/deposit/insert.php similarity index 86% rename from app/Views/ecommerce/deposit.php rename to app/Views/ecommerce/payment/deposit/insert.php index 9b88067..4e9f2be 100644 --- a/app/Views/ecommerce/deposit.php +++ b/app/Views/ecommerce/payment/deposit/insert.php @@ -27,9 +27,9 @@ - + - + @@ -47,7 +47,6 @@ -
tail) ?>
tail) ?>