본문으로 건너뛰기

소스 변경 전체 보기

PHP 8 · GODO25
변경 파일 수: 198개
변경 파일 목록
총 198개
게시판 스팸방지 히든 필드 추가
Board.phpComponent/Board/MemoAct.phpComponent/Memo/_plus_review_article.htmldata/skin/front/moment/board/plus_review_article_list.htmldata/skin/front/moment/board/plus_review_article_more_list.htmldata/skin/front/moment/board/_plus_review_container_01.htmldata/skin/front/moment/board/_plus_review_list_01.htmldata/skin/front/moment/board/plus_review_mypage.htmldata/skin/front/moment/board/plus_review_popup_01.htmldata/skin/front/moment/board/plus_review_view_02.htmldata/skin/front/moment/board/popup_goods_board_write.htmldata/skin/front/moment/board/view.htmldata/skin/front/moment/board/skin/default/write.htmldata/skin/front/moment/board/skin/default/view.htmldata/skin/front/moment/board/skin/event/write.htmldata/skin/front/moment/board/skin/event/view.htmldata/skin/front/moment/board/skin/gallery/write.htmldata/skin/front/moment/board/skin/gallery/view.htmldata/skin/front/moment/board/skin/qa/write.htmldata/skin/front/moment/board/skin/qa/view.htmldata/skin/front/moment/board/template/default/write.htmldata/skin/front/moment/board/template/default/view.htmldata/skin/front/moment/board/template/event/write.htmldata/skin/front/moment/board/template/event/view.htmldata/skin/front/moment/board/template/gallery/write.htmldata/skin/front/moment/board/template/gallery/view.htmldata/skin/front/moment/board/template/qa/write.htmldata/skin/front/moment/board/template/qa/goods_board_review_view.htmldata/skin/front/moment/goods/goods_board_write.htmldata/skin/front/moment/goods/gd_board_goods.jsdata/skin/front/moment/js/gd_board_view.jsdata/skin/front/moment/js/_plus_review_article.htmldata/skin/front/mygreek/board/plus_review_article_list.htmldata/skin/front/mygreek/board/plus_review_article_more_list.htmldata/skin/front/mygreek/board/_plus_review_container_01.htmldata/skin/front/mygreek/board/_plus_review_list_01.htmldata/skin/front/mygreek/board/plus_review_mypage.htmldata/skin/front/mygreek/board/plus_review_popup_01.htmldata/skin/front/mygreek/board/plus_review_view_02.htmldata/skin/front/mygreek/board/popup_goods_board_write.htmldata/skin/front/mygreek/board/view.htmldata/skin/front/mygreek/board/skin/default/write.htmldata/skin/front/mygreek/board/skin/default/view.htmldata/skin/front/mygreek/board/skin/event/write.htmldata/skin/front/mygreek/board/skin/event/view.htmldata/skin/front/mygreek/board/skin/gallery/write.htmldata/skin/front/mygreek/board/skin/gallery/view.htmldata/skin/front/mygreek/board/skin/qa/write.htmldata/skin/front/mygreek/board/skin/qa/view.htmldata/skin/front/mygreek/board/template/default/write.htmldata/skin/front/mygreek/board/template/default/view.htmldata/skin/front/mygreek/board/template/event/write.htmldata/skin/front/mygreek/board/template/event/view.htmldata/skin/front/mygreek/board/template/gallery/write.htmldata/skin/front/mygreek/board/template/gallery/view.htmldata/skin/front/mygreek/board/template/qa/write.htmldata/skin/front/mygreek/board/template/qa/goods_board_review_view.htmldata/skin/front/mygreek/goods/goods_board_write.htmldata/skin/front/mygreek/goods/gd_board_goods.jsdata/skin/front/mygreek/js/gd_board_view.jsdata/skin/front/mygreek/js/_plus_review_article.htmldata/skin/front/story_g/board/plus_review_article_list.htmldata/skin/front/story_g/board/plus_review_article_more_list.htmldata/skin/front/story_g/board/_plus_review_container_01.htmldata/skin/front/story_g/board/_plus_review_list_01.htmldata/skin/front/story_g/board/plus_review_mypage.htmldata/skin/front/story_g/board/plus_review_popup_01.htmldata/skin/front/story_g/board/plus_review_view_02.htmldata/skin/front/story_g/board/popup_goods_board_write.htmldata/skin/front/story_g/board/view.htmldata/skin/front/story_g/board/skin/default/write.htmldata/skin/front/story_g/board/skin/default/view.htmldata/skin/front/story_g/board/skin/event/write.htmldata/skin/front/story_g/board/skin/event/view.htmldata/skin/front/story_g/board/skin/gallery/write.htmldata/skin/front/story_g/board/skin/gallery/write.htmldata/skin/front/story_g/board/skin/qa/view.htmldata/skin/front/story_g/board/template/default/write.htmldata/skin/front/story_g/board/template/default/view.htmldata/skin/front/story_g/board/template/event/write.htmldata/skin/front/story_g/board/template/event/view.htmldata/skin/front/story_g/board/template/gallery/write.htmldata/skin/front/story_g/board/template/gallery/write.htmldata/skin/front/story_g/board/template/qa/goods_board_review_view.htmldata/skin/front/story_g/goods/goods_board_write.htmldata/skin/front/story_g/goods/gd_board_goods.jsdata/skin/front/story_g/js/gd_board_view.jsdata/skin/front/story_g/js/plus_review_mypage.htmldata/skin/mobile/moment/board/plus_review_popup_write_01.htmldata/skin/mobile/moment/board/plus_review_view_01.htmldata/skin/mobile/moment/board/view.htmldata/skin/mobile/moment/board/skin/default/write.htmldata/skin/mobile/moment/board/skin/default/view.htmldata/skin/mobile/moment/board/skin/event/write.htmldata/skin/mobile/moment/board/skin/event/view.htmldata/skin/mobile/moment/board/skin/gallery/write.htmldata/skin/mobile/moment/board/skin/gallery/write.htmldata/skin/mobile/moment/board/skin/qa/view.htmldata/skin/mobile/moment/board/template/default/write.htmldata/skin/mobile/moment/board/template/default/view.htmldata/skin/mobile/moment/board/template/event/write.htmldata/skin/mobile/moment/board/template/event/view.htmldata/skin/mobile/moment/board/template/gallery/write.htmldata/skin/mobile/moment/board/template/gallery/write.htmldata/skin/mobile/moment/board/template/qa/goods_board_view.htmldata/skin/mobile/moment/goods/gd_board_view.jsdata/skin/mobile/moment/js/plus_review_mypage.htmldata/skin/mobile/mygreek/board/plus_review_popup_write_01.htmldata/skin/mobile/mygreek/board/plus_review_view_01.htmldata/skin/mobile/mygreek/board/view.htmldata/skin/mobile/mygreek/board/skin/default/write.htmldata/skin/mobile/mygreek/board/skin/default/view.htmldata/skin/mobile/mygreek/board/skin/event/write.htmldata/skin/mobile/mygreek/board/skin/event/view.htmldata/skin/mobile/mygreek/board/skin/gallery/write.htmldata/skin/mobile/mygreek/board/skin/gallery/write.htmldata/skin/mobile/mygreek/board/skin/qa/view.htmldata/skin/mobile/mygreek/board/template/default/write.htmldata/skin/mobile/mygreek/board/template/default/view.htmldata/skin/mobile/mygreek/board/template/event/write.htmldata/skin/mobile/mygreek/board/template/event/view.htmldata/skin/mobile/mygreek/board/template/gallery/write.htmldata/skin/mobile/mygreek/board/template/gallery/write.htmldata/skin/mobile/mygreek/board/template/qa/goods_board_view.htmldata/skin/mobile/mygreek/goods/gd_board_view.jsdata/skin/mobile/mygreek/js/plus_review_mypage.htmldata/skin/mobile/story_g/board/plus_review_popup_write_01.htmldata/skin/mobile/story_g/board/plus_review_view_01.htmldata/skin/mobile/story_g/board/view.htmldata/skin/mobile/story_g/board/skin/default/write.htmldata/skin/mobile/story_g/board/skin/default/view.htmldata/skin/mobile/story_g/board/skin/event/write.htmldata/skin/mobile/story_g/board/skin/event/view.htmldata/skin/mobile/story_g/board/skin/gallery/write.htmldata/skin/mobile/story_g/board/skin/gallery/write.htmldata/skin/mobile/story_g/board/skin/qa/view.htmldata/skin/mobile/story_g/board/template/default/write.htmldata/skin/mobile/story_g/board/template/default/view.htmldata/skin/mobile/story_g/board/template/event/write.htmldata/skin/mobile/story_g/board/template/event/view.htmldata/skin/mobile/story_g/board/template/gallery/write.htmldata/skin/mobile/story_g/board/template/gallery/write.htmldata/skin/mobile/story_g/board/template/qa/goods_board_view.htmldata/skin/mobile/story_g/goods/gd_board_view.jsdata/skin/mobile/story_g/js/
환불완료 주문 상태 정합성 개선
OrderAdminNew.phpComponent/Order/OrderAdmin.phpComponent/Order/
엑셀·CSV 다운로드 및 쿠폰 발급 보안 강화
CouponAdmin.phpComponent/Coupon/ExcelRequest.phpComponent/Excel/
아이디찾기 보안 강화
Member.phpComponent/Member/
상품 복사 시 이미지 폴더 구조 처리 개선
Storage.phpComponent/Storage/
상품 상세페이지 이미지 업로드 안정성 개선
Validator.phpComponent/Validator/
유료 보안서버 제공 정책 변경에 따른 연장 기간 수정
layer_ssl_setting.phpAdmin/policy/ssl_setting.phpAdmin/policy/SecureSocketLayer.phpComponent/SiteLink/
변경 파일 코드
추가삭제
게시판 스팸방지 히든 필드 추가
Component/Board/Board.php+16-45
변경 전Board.php
BoardUtil::checkForbiddenWord($this->req['subject']);
BoardUtil::checkForbiddenWord($this->req['contents']);
 
// 악성(광고성) 게시글 필터 - 비관리자의 신규/답변 작성만 검사
// 스팸으로 판정되면 프론트에는 정상 저장된 것처럼 응답하되(조용한 차단),
// 실제 레코드는 isDelete='y' 로 격리 저장하여 프론트 목록에서 숨긴다.
$spamQuarantine = false;
if ($this->isAdmin() === false && ($this->req['mode'] === 'write' || $this->req['mode'] === 'reply')) {
$spamResult = SpamFilter::inspect([
'writerNm' => $this->req['writerNm'],
'subject' => $this->req['subject'],
'contents' => $this->req['contents'],
]);
if ($spamResult['isSpam'] === true) {
$spamQuarantine = true;
$this->writeSpamLog($spamResult);
 
 
 
 
 
 
}
}
 
$this->setSaveData('writerNm', $this->req['writerNm'], $arrData, $validator);
$this->setSaveData('writerId', $writerId, $arrData, $validator);
$this->setSaveData('writerNick', $writerNick, $arrData, $validator);
// 악성 게시글 격리: 프론트 목록에서 숨김 처리(isDelete='y')
if ($spamQuarantine === true) {
$isDeleteFlag = 'y';
$this->setSaveData('isDelete', $isDeleteFlag, $arrData, $validator);
}
// @fallthrough write/reply 는 modify 와 공통 저장 필드를 공유하므로 의도적으로 fall-through
case "modify":
$this->setSaveData('orderNo', $orderNo, $arrData, $validator);
$this->setSaveData('groupNo', $groupNo, $arrData, $validator);
return $file;
}
 
/**
* 악성(광고성) 게시글 격리 로그 기록
*
* 오탐 복구 및 공격 패턴 분석을 위해 판정 사유·게시판·작성자·IP·제목을 남긴다.
* 로깅 실패가 게시글 저장 흐름에 영향을 주지 않도록 예외를 흡수한다.
*
* @param array $spamResult SpamFilter::inspect() 결과
* @return void
*/
protected function writeSpamLog(array $spamResult)
{
try {
$context = [
'bdId' => $this->cfg['bdId'] ?? '',
'mode' => $this->req['mode'] ?? '',
'writerNm' => $this->req['writerNm'] ?? '',
'writerIp' => Request::getRemoteAddress(),
'subject' => mb_substr((string) ($this->req['subject'] ?? ''), 0, 100),
'score' => $spamResult['score'],
'reason' => $spamResult['reason'],
];
\App::getInstance('logger')->channel('board')->info('[BoardSpam] 악성 게시글 격리', $context);
} catch (\Throwable $e) {
// 로깅 실패는 무시(저장 흐름 보호)
}
}
 
/**
* Anti-Spam 검증
* @param bool $isMemo
 
변경 후Board.php
BoardUtil::checkForbiddenWord($this->req['subject']);
BoardUtil::checkForbiddenWord($this->req['contents']);
 
// 악성(광고성) 게시글·봇 스팸 차단 - 비관리자의 신규/답변 작성만 검사
// 봇으로 판정되면 프론트에는 정상 저장된 것처럼 응답하되(조용한 차단) 실제로는 저장하지 않는다
if (!$this->isAdmin() && ($this->req['mode'] === 'write' || $this->req['mode'] === 'reply')) {
 
 
$spamResult = SpamFilter::inspect([
'writerNm' => $this->req['writerNm'] ?? '',
'subject' => $this->req['subject'] ?? '',
'contents' => $this->req['contents'] ?? '',
], $this->req['url'] ?? '');
if ($spamResult['isSpam']) {
$spamLogContext = array_merge($spamResult, [
'bdId' => $this->cfg['bdId'] ?? '',
'mode' => $this->req['mode'] ?? '',
'writerNm' => $this->req['writerNm'] ?? '',
'subject' => $this->req['subject'] ?? '',
]);
SpamFilter::writeSpamLog($spamLogContext);
return;
}
}
 
$this->setSaveData('writerNm', $this->req['writerNm'], $arrData, $validator);
$this->setSaveData('writerId', $writerId, $arrData, $validator);
$this->setSaveData('writerNick', $writerNick, $arrData, $validator);
 
 
 
 
 
 
case "modify":
$this->setSaveData('orderNo', $orderNo, $arrData, $validator);
$this->setSaveData('groupNo', $groupNo, $arrData, $validator);
return $file;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* Anti-Spam 검증
* @param bool $isMemo
 
Component/Memo/MemoAct.php+20
변경 전MemoAct.php
use Component\Board\BoardFront;
use Component\Board\BoardUtil;
use Component\Board\Board;
 
use Component\Database\DBTableField;
use Component\Validator\Validator;
use Framework\Utility\Strings;
}
 
$this->checkAntiSpam(true);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
BoardUtil::checkForbiddenWord($memo);
switch ($this->req['mode']) {
case 'reply' :
 
변경 후MemoAct.php
use Component\Board\BoardFront;
use Component\Board\BoardUtil;
use Component\Board\Board;
use Bundle\Component\Board\SpamFilter;
use Component\Database\DBTableField;
use Component\Validator\Validator;
use Framework\Utility\Strings;
}
 
$this->checkAntiSpam(true);
 
// 악성(광고성) 댓글·봇 스팸 차단 - 비관리자 작성만 검사
// 봇으로 판정되면 저장하지 않고 정상 등록처럼 응답(조용한 차단)
if (!$this->isAdmin()) {
$spamResult = SpamFilter::inspect([
'writerNm' => $this->req['writerNm'] ?? '',
'contents' => $memo,
], $this->req['url'] ?? '');
if ($spamResult['isSpam']) {
$spamLogContext = array_merge($spamResult, [
'bdId' => $this->cfg['bdId'] ?? '',
'mode' => $this->req['mode'] ?? '',
'writerNm' => $this->req['writerNm'] ?? '',
]);
SpamFilter::writeSpamLog($spamLogContext);
return;
}
}
 
BoardUtil::checkForbiddenWord($memo);
switch ($this->req['mode']) {
case 'reply' :
 
data/skin/front/moment/board/_plus_review_article.html+1
변경 전_plus_review_article.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후_plus_review_article.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/moment/board/plus_review_article_list.html+1
변경 전plus_review_article_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후plus_review_article_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/moment/board/plus_review_article_more_list.html+1
변경 전plus_review_article_more_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후plus_review_article_more_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/moment/board/_plus_review_container_01.html+1
변경 전_plus_review_container_01.html
<div class="plus_review_cont">
<form target="ifrmProcess" id="plusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="add"/>
 
<input type="hidden" name="goodsNo" value="{=goodsNo}"/>
<input type="hidden" name="orderGoodsNo" value="{=plusReview.buyGoodsData.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=plusReview.info.naverReviewCnt}"/>
 
변경 후_plus_review_container_01.html
<div class="plus_review_cont">
<form target="ifrmProcess" id="plusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="add"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=goodsNo}"/>
<input type="hidden" name="orderGoodsNo" value="{=plusReview.buyGoodsData.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=plusReview.info.naverReviewCnt}"/>
 
data/skin/front/moment/board/_plus_review_list_01.html+1
변경 전_plus_review_list_01.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후_plus_review_list_01.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/moment/board/plus_review_mypage.html+1
변경 전plus_review_mypage.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
 
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
<input type="hidden" name="plusReviewCnt" value="{=data.buyGoodsData.plusReviewCnt}"/>
<div class="ly_ct">
 
변경 후plus_review_mypage.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
<input type="hidden" name="plusReviewCnt" value="{=data.buyGoodsData.plusReviewCnt}"/>
<div class="ly_ct">
 
data/skin/front/moment/board/plus_review_popup_01.html+1
변경 전plus_review_popup_01.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" target="ifrmProcess" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addPopup"/>
 
<div class="ly_ct">
<div class="content plus_review_register">
<!--{? plusReviewConfig.reviewBenefitInfo}-->
 
변경 후plus_review_popup_01.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" target="ifrmProcess" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addPopup"/>
<input type="hidden" name="url" id="url"/>
<div class="ly_ct">
<div class="content plus_review_register">
<!--{? plusReviewConfig.reviewBenefitInfo}-->
 
data/skin/front/moment/board/plus_review_view_02.html+1
변경 전plus_review_view_02.html
<!--{ ? data.auth.canWriteMemo === true}-->
<form onsubmit="return false;">
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false }-->
<div class="plus_review_nonmember_form">
 
변경 후plus_review_view_02.html
<!--{ ? data.auth.canWriteMemo === true}-->
<form onsubmit="return false;">
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false }-->
<div class="plus_review_nonmember_form">
 
data/skin/front/moment/board/popup_goods_board_write.html+1
변경 전popup_goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
변경 후popup_goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
data/skin/front/moment/board/skin/default/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
data/skin/front/moment/board/skin/default/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/moment/board/skin/event/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
data/skin/front/moment/board/skin/event/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/board/skin/gallery/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
data/skin/front/moment/board/skin/gallery/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/board/skin/qa/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/moment/board/skin/qa/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/board/template/default/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/moment/board/template/default/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/board/template/event/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/moment/board/template/event/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/board/template/gallery/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/moment/board/template/gallery/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/board/template/qa/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/moment/board/template/qa/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/moment/goods/goods_board_review_view.html+3
변경 전goods_board_review_view.html
</div>
</div>
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //view_comment_list -->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //board_comment_box -->
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후goods_board_review_view.html
</div>
</div>
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //view_comment_list -->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //board_comment_box -->
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/moment/goods/goods_board_write.html+1
변경 전goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=querySdling}"/>
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{ / }-->
 
변경 후goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=querySdling}"/>
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{ / }-->
 
data/skin/front/moment/js/gd_board_goods.js+5
변경 전gd_board_goods.js
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
init: function () {
this.writerNm.val(null);
this.password.val(null);
 
변경 후gd_board_goods.js
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
init: function () {
this.writerNm.val(null);
this.password.val(null);
 
data/skin/front/moment/js/gd_board_view.js+5
변경 전gd_board_view.js
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno) {
return {
memo: this.commentRow(memoSno).find('textarea[name=memo]'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
 
변경 후gd_board_view.js
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno) {
return {
memo: this.commentRow(memoSno).find('textarea[name=memo]'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
 
data/skin/front/mygreek/board/_plus_review_article.html+1
변경 전_plus_review_article.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후_plus_review_article.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/mygreek/board/plus_review_article_list.html+1
변경 전plus_review_article_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후plus_review_article_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/mygreek/board/plus_review_article_more_list.html+1
변경 전plus_review_article_more_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후plus_review_article_more_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/mygreek/board/_plus_review_container_01.html+2-1
변경 전_plus_review_container_01.html
</script>
<div class="plus_review_cont">
<form target="ifrmProcess" id="plusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="add"/>
 
<input type="hidden" name="goodsNo" value="{=goodsNo}"/>
<input type="hidden" name="orderGoodsNo" value="{=plusReview.buyGoodsData.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=plusReview.info.naverReviewCnt}"/>
 
변경 후_plus_review_container_01.html
</script>
<div class="plus_review_cont">
<form target="ifrmProcess" id="plusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="add"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=goodsNo}"/>
<input type="hidden" name="orderGoodsNo" value="{=plusReview.buyGoodsData.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=plusReview.info.naverReviewCnt}"/>
 
data/skin/front/mygreek/board/_plus_review_list_01.html+1
변경 전_plus_review_list_01.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
변경 후_plus_review_list_01.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}"/>
<div class="board_comment_box">
<div class="board_comment_write">
 
data/skin/front/mygreek/board/plus_review_mypage.html+1
변경 전plus_review_mypage.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
 
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
<input type="hidden" name="plusReviewCnt" value="{=data.buyGoodsData.plusReviewCnt}"/>
<div class="ly_ct">
 
변경 후plus_review_mypage.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
<input type="hidden" name="plusReviewCnt" value="{=data.buyGoodsData.plusReviewCnt}"/>
<div class="ly_ct">
 
data/skin/front/mygreek/board/plus_review_popup_01.html+1
변경 전plus_review_popup_01.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" target="ifrmProcess" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addPopup"/>
 
<div class="ly_ct">
<div class="content plus_review_register">
<!--{? plusReviewConfig.reviewBenefitInfo}-->
 
변경 후plus_review_popup_01.html
<div class="view" style="width:400px;">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" target="ifrmProcess" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addPopup"/>
<input type="hidden" name="url" id="url"/>
<div class="ly_ct">
<div class="content plus_review_register">
<!--{? plusReviewConfig.reviewBenefitInfo}-->
 
data/skin/front/mygreek/board/plus_review_view_02.html+1
변경 전plus_review_view_02.html
<!--{ ? data.auth.canWriteMemo === true}-->
<form onsubmit="return false;">
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false }-->
<div class="plus_review_nonmember_form">
 
변경 후plus_review_view_02.html
<!--{ ? data.auth.canWriteMemo === true}-->
<form onsubmit="return false;">
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false }-->
<div class="plus_review_nonmember_form">
 
data/skin/front/mygreek/board/popup_goods_board_write.html+1
변경 전popup_goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
변경 후popup_goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
data/skin/front/mygreek/board/skin/default/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
data/skin/front/mygreek/board/skin/default/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/mygreek/board/skin/event/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
data/skin/front/mygreek/board/skin/event/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/board/skin/gallery/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="form_element">
 
data/skin/front/mygreek/board/skin/gallery/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/board/skin/qa/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_btn_report" data-bdsno="{req.sno}" data-bdid="{req.bdId}" data-memosno="{.sno}"><span>{=__('신고')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/mygreek/board/skin/qa/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/board/template/default/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/mygreek/board/template/default/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/board/template/event/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/mygreek/board/template/event/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/board/template/gallery/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/mygreek/board/template/gallery/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/board/template/qa/view.html+3
변경 전view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
변경 후view.html
<!--{ ? bdView.cfg.bdMemoFl == 'y'}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
<!-- //board_comment_box -->
<!--{:}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
<span class="btn_gray_list"><button type="button" class="btn_gray_small js_comment_btn_delete"><span>{=__('삭제')}</span></button></span>
<!--{/}-->
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? gd_is_login() }-->
<div class="comment_textarea">
 
data/skin/front/mygreek/board/template/qa/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
 
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey"/>-->
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{/}-->
 
 
data/skin/front/mygreek/goods/goods_board_review_view.html+3
변경 전goods_board_review_view.html
</div>
</div>
<div class="board_comment_box js_action_form" style="display: none">
 
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //view_comment_list -->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
 
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //board_comment_box -->
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후goods_board_review_view.html
</div>
</div>
<div class="board_comment_box js_action_form" style="display: none">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //view_comment_list -->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="board_comment_box js_form_write">
<input type="hidden" name="url"/>
<div class="board_comment_write">
<!--{ ? !gd_is_login() }-->
<input type="text" name="writerNm" placeholder="{=__('이름')}"/>
<!-- //board_comment_box -->
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/mygreek/goods/goods_board_write.html+1
변경 전goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=querySdling}"/>
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{ / }-->
 
변경 후goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}"/>
<input type="hidden" name="returnUrl" value="{=querySdling}"/>
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"/><!--{ / }-->
 
data/skin/front/mygreek/js/gd_board_goods.js+5
변경 전gd_board_goods.js
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
init: function () {
this.writerNm.val(null);
this.password.val(null);
 
변경 후gd_board_goods.js
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
init: function () {
this.writerNm.val(null);
this.password.val(null);
 
data/skin/front/mygreek/js/gd_board_view.js+5
변경 전gd_board_view.js
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno) {
return {
memo: this.commentRow(memoSno).find('textarea[name=memo]'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
 
변경 후gd_board_view.js
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno) {
return {
memo: this.commentRow(memoSno).find('textarea[name=memo]'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
btn: this.commentRow(memoSno).find('.js_comment_btn_action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
 
data/skin/front/story_g/board/_plus_review_article.html+1
변경 전_plus_review_article.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
변경 후_plus_review_article.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
data/skin/front/story_g/board/plus_review_article_list.html+1
변경 전plus_review_article_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
변경 후plus_review_article_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
data/skin/front/story_g/board/plus_review_article_more_list.html+1
변경 전plus_review_article_more_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
변경 후plus_review_article_more_list.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
data/skin/front/story_g/board/_plus_review_container_01.html+1
변경 전_plus_review_container_01.html
<div class="section-body">
<form target="ifrmProcess" id="plusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="add">
 
<input type="hidden" name="goodsNo" value="{=goodsNo}">
<input type="hidden" name="orderGoodsNo" value="{=plusReview.buyGoodsData.sno}">
<input type="hidden" name="naverReviewCnt" value="{=plusReview.info.naverReviewCnt}"/>
 
변경 후_plus_review_container_01.html
<div class="section-body">
<form target="ifrmProcess" id="plusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="add">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=goodsNo}">
<input type="hidden" name="orderGoodsNo" value="{=plusReview.buyGoodsData.sno}">
<input type="hidden" name="naverReviewCnt" value="{=plusReview.info.naverReviewCnt}"/>
 
data/skin/front/story_g/board/_plus_review_list_01.html+1
변경 전_plus_review_list_01.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
변경 후_plus_review_list_01.html
<!--{ ? .auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=.goodsNo}">
<div class="reply">
<!--{ ? gd_is_login() }-->
 
data/skin/front/story_g/board/plus_review_mypage.html+1
변경 전plus_review_mypage.html
<section class="content plus_review_register">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage">
 
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
<input type="hidden" name="plusReviewCnt" value="{=data.buyGoodsData.plusReviewCnt}"/>
<div class="goods-area" style="border-top:1px solid #ddd">
 
변경 후plus_review_mypage.html
<section class="content plus_review_register">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
<input type="hidden" name="plusReviewCnt" value="{=data.buyGoodsData.plusReviewCnt}"/>
<div class="goods-area" style="border-top:1px solid #ddd">
 
data/skin/front/story_g/board/plus_review_popup_01.html+1
변경 전plus_review_popup_01.html
<section class="content plus_review_register">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" target="ifrmProcess" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addPopup">
 
<div class="goods-area">
<div>
<!--{? plusReviewConfig.reviewBenefitInfo}-->
 
변경 후plus_review_popup_01.html
<section class="content plus_review_register">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" target="ifrmProcess" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addPopup">
<input type="hidden" name="url" id="url"/>
<div class="goods-area">
<div>
<!--{? plusReviewConfig.reviewBenefitInfo}-->
 
data/skin/front/story_g/board/plus_review_view_02.html+1
변경 전plus_review_view_02.html
<!--{ ? data.auth.canWriteMemo === true}-->
<form onsubmit="return false;">
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false }-->
<div class="plus_review_nonmember_form">
 
변경 후plus_review_view_02.html
<!--{ ? data.auth.canWriteMemo === true}-->
<form onsubmit="return false;">
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false }-->
<div class="plus_review_nonmember_form">
 
data/skin/front/story_g/board/popup_goods_board_write.html+1
변경 전popup_goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
변경 후popup_goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
data/skin/front/story_g/board/skin/default/view.html+3
변경 전view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/board/skin/default/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/skin/event/view.html+3
변경 전view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/board/skin/event/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/skin/gallery/view.html+3
변경 전view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/board/skin/gallery/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/skin/qa/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/template/default/view.html+3
변경 전view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}">{.memo}</textarea>
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}"></textarea>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}">{.memo}</textarea>
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}"></textarea>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/board/template/default/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/template/event/view.html+3
변경 전view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}">{.memo}</textarea>
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}"></textarea>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}">{.memo}</textarea>
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}"></textarea>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/board/template/event/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/template/gallery/view.html+3
변경 전view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}">{.memo}</textarea>
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}"></textarea>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후view.html
</div>
 
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}">{.memo}</textarea>
 
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="cttl">
<textarea type="text" name="memo" class="text" placeholder="{=__('댓글 내용을 입력하세요')}"></textarea>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/board/template/gallery/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/board/template/qa/write.html+1
변경 전write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
변경 후write.html
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<!--<input type="hidden" name="chkSpamKey" id="chkSpamKey">-->
<input type="hidden" name="url" id="url">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
 
data/skin/front/story_g/goods/goods_board_review_view.html+3
변경 전goods_board_review_view.html
</div>
</div>
<div class="comment-reply js-action-form" style="display: none">
 
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
</ul>
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후goods_board_review_view.html
</div>
</div>
<div class="comment-reply js-action-form" style="display: none">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login()}-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyModify }-->
</ul>
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
<div class="form-element secret-reply-checkbox-login">
<!--{ secretReplyCheck.replyWrite }-->
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/front/story_g/goods/goods_board_write.html+1
변경 전goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
변경 후goods_board_write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=gd_isset(req.goodsNo)}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword}--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{/}-->
 
data/skin/front/story_g/js/gd_board_goods.js+5
변경 전gd_board_goods.js
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js-comment-btn-action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
init: function () {
this.writerNm.val(null);
this.password.val(null);
 
변경 후gd_board_goods.js
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js-comment-btn-action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
init: function () {
this.writerNm.val(null);
this.password.val(null);
 
data/skin/front/story_g/js/gd_board_view.js+5
변경 전gd_board_view.js
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js-comment-btn-action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
init: function () {
this.writerNm.val(null);
this.password.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
 
변경 후gd_board_view.js
memo: formWrite.find('textarea[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno) {
return {
btn: this.commentRow(memoSno).find('.js-comment-btn-action'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
init: function () {
this.writerNm.val(null);
this.password.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
 
data/skin/mobile/moment/board/plus_review_mypage.html+1
변경 전plus_review_mypage.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
 
변경 후plus_review_mypage.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
 
data/skin/mobile/moment/board/plus_review_popup_write_01.html+1
변경 전plus_review_popup_write_01.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="{=req.mode}"/>
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
 
 
변경 후plus_review_popup_write_01.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="{=req.mode}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
 
 
data/skin/mobile/moment/board/plus_review_view_01.html+1
변경 전plus_review_view_01.html
<!--{ ? data.auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<!--{ ? gd_is_login() === false}-->
<dl class="b_guest_info">
 
변경 후plus_review_view_01.html
<!--{ ? data.auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<!--{ ? gd_is_login() === false}-->
<dl class="b_guest_info">
 
data/skin/mobile/moment/board/skin/default/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/moment/board/skin/default/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/skin/event/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/moment/board/skin/event/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/skin/gallery/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/moment/board/skin/gallery/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/skin/qa/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/template/default/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/moment/board/template/default/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/template/event/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/moment/board/template/event/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/template/gallery/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/moment/board/template/gallery/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/board/template/qa/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/moment/goods/goods_board_view.html+3
변경 전goods_board_view.html
</div>
<!-- 비회원 개인정보 수집동의 -->
<div class="js_action_form reply_form" style="display:none">
 
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
<!--{/}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
</div>
<!--{:}-->
<div class="comment_write js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후goods_board_view.html
</div>
<!-- 비회원 개인정보 수집동의 -->
<div class="js_action_form reply_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
<!--{/}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
</div>
<!--{:}-->
<div class="comment_write js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/mobile/moment/js/gd_board_view.js+5
변경 전gd_board_view.js
memo: formWrite.find('[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno, notice) {
return {
btn: this.commentRow(memoSno, notice).find('.js_comment_btn_action'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
this.writerNm.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
 
변경 후gd_board_view.js
memo: formWrite.find('[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno, notice) {
return {
btn: this.commentRow(memoSno, notice).find('.js_comment_btn_action'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
this.writerNm.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
 
data/skin/mobile/mygreek/board/plus_review_mypage.html+1
변경 전plus_review_mypage.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
 
변경 후plus_review_mypage.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
 
data/skin/mobile/mygreek/board/plus_review_popup_write_01.html+1
변경 전plus_review_popup_write_01.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="{=req.mode}"/>
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
 
 
변경 후plus_review_popup_write_01.html
<div class="ly_ct">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="{=req.mode}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<input type="hidden" name="sno" value="{=req.sno}"/>
 
 
data/skin/mobile/mygreek/board/plus_review_view_01.html+1
변경 전plus_review_view_01.html
<!--{ ? data.auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<!--{ ? gd_is_login() === false}-->
<dl class="b_guest_info">
 
변경 후plus_review_view_01.html
<!--{ ? data.auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo"/>
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}"/>
<!--{ ? gd_is_login() === false}-->
<dl class="b_guest_info">
 
data/skin/mobile/mygreek/board/skin/default/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/mygreek/board/skin/default/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/skin/event/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/mygreek/board/skin/event/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/skin/gallery/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/mygreek/board/skin/gallery/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/skin/qa/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/template/default/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/mygreek/board/template/default/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/template/event/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/mygreek/board/template/event/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/template/gallery/view.html+2
변경 전view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
변경 후view.html
</div>
</div>
<div class="reply_form js_action_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
<!--{ ? bdView.cfg.auth.memo == 'y' }-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login() }-->
<dl class="b_guest_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
 
data/skin/mobile/mygreek/board/template/gallery/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/board/template/qa/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}"/>
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}"/>
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}"/>
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}"/>
<input type="hidden" name="returnUrl" value="{=queryString}"/>
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/mygreek/goods/goods_board_view.html+3
변경 전goods_board_view.html
</div>
<!-- 비회원 개인정보 수집동의 -->
<div class="js_action_form reply_form" style="display:none">
 
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
<!--{/}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="reply_form js_form_write">
 
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
</div>
<!--{:}-->
<div class="comment_write js_form_write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후goods_board_view.html
</div>
<!-- 비회원 개인정보 수집동의 -->
<div class="js_action_form reply_form" style="display:none">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
<!--{/}-->
<!--{? bdView.cfg.auth.memo == 'y'}-->
<div class="reply_form js_form_write">
<input type="hidden" name="url"/>
<!--{ ? !gd_is_login()}-->
<dl class="reply_info">
<dd><input type="text" name="writerNm" placeholder="{=__('이름')}"/></dd>
</div>
<!--{:}-->
<div class="comment_write js_form_write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/mobile/mygreek/js/gd_board_view.js+5
변경 전gd_board_view.js
memo: formWrite.find('[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno, notice) {
return {
btn: this.commentRow(memoSno, notice).find('.js_comment_btn_action'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
this.writerNm.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
 
변경 후gd_board_view.js
memo: formWrite.find('[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno, notice) {
return {
btn: this.commentRow(memoSno, notice).find('.js_comment_btn_action'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
this.writerNm.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
 
data/skin/mobile/story_g/board/plus_review_mypage.html+1
변경 전plus_review_mypage.html
<section class="content plus-review-write-section">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage">
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<input type="hidden" name="sno" value="{=req.sno}">
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
 
변경 후plus_review_mypage.html
<section class="content plus-review-write-section">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="addMypage">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<input type="hidden" name="sno" value="{=req.sno}">
<input type="hidden" name="naverReviewCnt" value="{=data.buyGoodsData.naverReviewCnt}"/>
 
data/skin/mobile/story_g/board/plus_review_popup_write_01.html+1
변경 전plus_review_popup_write_01.html
<section class="content plus-review-write-section">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="{=req.mode}">
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<input type="hidden" name="sno" value="{=req.sno}">
 
 
변경 후plus_review_popup_write_01.html
<section class="content plus-review-write-section">
<form id="plusPlusReviewForm" method="post" action="../board/plus_review_ps.php" enctype="multipart/form-data">
<input type="hidden" name="mode" value="{=req.mode}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<input type="hidden" name="sno" value="{=req.sno}">
 
 
data/skin/mobile/story_g/board/plus_review_view_01.html+1
변경 전plus_review_view_01.html
<!--{ ? data.auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
 
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false}-->
<div class="non-member">
 
변경 후plus_review_view_01.html
<!--{ ? data.auth.canWriteMemo == 'y'}-->
<form>
<input type="hidden" name="mode" value="addMemo">
<input type="hidden" name="url"/>
<input type="hidden" name="goodsNo" value="{=data.goodsNo}">
<!--{ ? gd_is_login() === false}-->
<div class="non-member">
 
data/skin/mobile/story_g/board/skin/default/view.html+2
변경 전view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
변경 후view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
data/skin/mobile/story_g/board/skin/default/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/story_g/board/skin/event/view.html+2
변경 전view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
변경 후view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
data/skin/mobile/story_g/board/skin/event/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}">
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/story_g/board/skin/gallery/view.html+2
변경 전view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
변경 후view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
data/skin/mobile/story_g/board/skin/gallery/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/story_g/board/skin/qa/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/story_g/board/template/default/view.html+2
변경 전view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
변경 후view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
data/skin/mobile/story_g/board/template/default/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{ / }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{ / }-->
 
data/skin/mobile/story_g/board/template/event/view.html+2
변경 전view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
변경 후view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
data/skin/mobile/story_g/board/template/event/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="returnUrl" value="{=queryString}">
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{ / }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="returnUrl" value="{=queryString}">
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{ / }-->
 
data/skin/mobile/story_g/board/template/gallery/view.html+2
변경 전view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
변경 후view.html
</div>
 
<div class="reply-form js-action-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<tbody>
<!--{ ? !gd_is_login() }-->
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
 
data/skin/mobile/story_g/board/template/gallery/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{? req.orderGoodsNo }-->
 
data/skin/mobile/story_g/board/template/qa/write.html+1
변경 전write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
 
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{ / }-->
 
변경 후write.html
<input type="hidden" name="bdId" value="{=bdWrite.cfg.bdId}">
<input type="hidden" name="sno" value="{=gd_isset(req.sno)}">
<input type="hidden" name="mode" value="{=gd_isset(req.mode)}">
<input type="hidden" name="url" id="url"/>
<input type="hidden" name="goodsNo" value="{=req.goodsNo}">
<input type="hidden" name="returnUrl" value="{=queryString}">
<!--{ ? oldPassword }--><input type="hidden" name="oldPassword" value="{=oldPassword}"><!--{ / }-->
 
data/skin/mobile/story_g/goods/goods_board_view.html+3
변경 전goods_board_view.html
 
<!-- 비회원 개인정보 수집동의 -->
<div class="js-action-form reply-form" style="display:none">
 
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<col width="75%"/>
<col/>
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
 
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
 
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
변경 후goods_board_view.html
 
<!-- 비회원 개인정보 수집동의 -->
<div class="js-action-form reply-form" style="display:none">
<input type="hidden" name="url"/>
<table width="100%" cellspacing="0" cellpadding="0" class="comment-reply">
<col width="75%"/>
<col/>
<div class="memo-outer">
<div class="memo-box">
<textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea>
<input type="hidden" name="url"/>
</div>
<div class="memo-submit">
<button type="button" class="comment_button js-comment-btn-write">{=__('작성 완료')}</button>
</div>
<!--{:}-->
<div class="comment-write js-form-write">
<input type="hidden" name="url"/>
<!--{ ? gd_is_login() }-->
{=__('댓글 권한이 없습니다.')}
<!--{:}-->
 
data/skin/mobile/story_g/js/gd_board_view.js+5
변경 전gd_board_view.js
memo: formWrite.find('[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
 
},
commentFormAction: function (memoSno, notice) {
return {
btn: this.commentRow(memoSno, notice).find('.js-comment-btn-action'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
 
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
this.writerNm.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
 
},
dataType: 'json'
}).success(function (data) {
 
변경 후gd_board_view.js
memo: formWrite.find('[name=memo]'),
isSecret: formWrite.find('input[name=isSecretReply]'),
captchaKey: formWrite.find('input[name=captchaKey]'),
url: formWrite.find('input[name=url]'),
},
commentFormAction: function (memoSno, notice) {
return {
btn: this.commentRow(memoSno, notice).find('.js-comment-btn-action'),
isSecret: this.commentRow(memoSno).find('input[name=isSecretReply]'),
captchaKey: this.commentRow(memoSno).find('input[name=captchaKey]'),
url: this.commentRow(memoSno).find('input[name=url]'),
secretReply: this.commentRow(memoSno).find('input[name=secretReply]'),
init: function () {
this.writerNm.val(null);
isSecret: isSecret,
captchaKey: domRoot.commentFormWrite.captchaKey.val(),
altcha: altchaPayload(domRoot.commentFormWrite.element),
url: domRoot.commentFormWrite.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
isSecret: isSecret,
captchaKey: commentFormAction.captchaKey.val(),
altcha: altchaPayload(commentFormAction.element),
url: commentFormAction.url.val(),
},
dataType: 'json'
}).success(function (data) {
 
네이버쇼핑 상품평 평점 컬럼 추가
Component/Worker/DbUrl.php+123
변경 전DbUrl.php
use Component\Board\ArticleListAdmin;
use Component\Board\Board;
use Component\Board\BoardList;
 
use Component\Coupon\Coupon;
use Component\Database\DBTableField;
use Component\Delivery\Delivery;
public $arrBind;
public $goodsCateList;
public $imageStoragePath;
 
 
 
public function __construct()
$result .= '<<<revct>>>' . $reviewCnt . chr(13) . chr(10);
}
 
 
 
$result .= '<<<deliv>>>' . gd_isset($deliveryPrice) . chr(13) . chr(10); // [선택] 배송비
 
if (gd_isset($installationCosts)) $result .= '<<<insco>>>' . gd_isset($installationCosts) . chr(13) . chr(10); // 추가설치비용
 
return $reviewCnt;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
변경 후DbUrl.php
use Component\Board\ArticleListAdmin;
use Component\Board\Board;
use Component\Board\BoardList;
use Component\Board\BoardUtil;
use Component\Coupon\Coupon;
use Component\Database\DBTableField;
use Component\Delivery\Delivery;
public $arrBind;
public $goodsCateList;
public $imageStoragePath;
protected $useGoodsReviewBoardPt;
 
 
public function __construct()
$result .= '<<<revct>>>' . $reviewCnt . chr(13) . chr(10);
}
 
$result .= '<<<satisfylevel>>>' . $this->getNaverSatisfyLevel($data['goodsNo']) . chr(13) . chr(10); // [선택] 상품 평균 평점
 
$result .= '<<<deliv>>>' . gd_isset($deliveryPrice) . chr(13) . chr(10); // [선택] 배송비
 
if (gd_isset($installationCosts)) $result .= '<<<insco>>>' . gd_isset($installationCosts) . chr(13) . chr(10); // 추가설치비용
 
return $reviewCnt;
}
 
/**
* 네이버쇼핑 EP satisfylevel(상품 단위 평균 평점) 산출
*
* '네이버 쇼핑 상품평 개수' 설정(naverReviewChannel)과 동일한 소스에서 평점을 집계한다.
* both 는 평균의 평균이 아닌 (두 소스 평점 합계의 합 ÷ 두 소스 평점 입력 리뷰 수의 합)으로 계산한다.
*
* @param int $goodsNo 상품 번호
*
* @return float 소수 첫째 자리 반올림 평균 평점 (평점 입력 리뷰가 없으면 0)
*/
protected function getNaverSatisfyLevel(int $goodsNo): float
{
if (empty($goodsNo)) {
return 0;
}
 
if ($this->configData['naverReviewChannel'] === 'plusReview') {
$rating = $this->getReviewRating(DB_PLUS_REVIEW_ARTICLE, $goodsNo, ['applyFl' => 'y']);
} elseif ($this->configData['naverReviewChannel'] === 'both') {
$plusRating = $this->getReviewRating(DB_PLUS_REVIEW_ARTICLE, $goodsNo, ['applyFl' => 'y']);
$boardRating = ['sumGoodsPt' => 0, 'ratedCnt' => 0];
if ($this->useGoodsReviewBoardPoint()) {
$boardRating = $this->getReviewRating(DB_BD_ . 'goodsreview', $goodsNo, ['isDelete' => 'n', 'isSecret' => 'n']);
}
$rating = [
'sumGoodsPt' => $plusRating['sumGoodsPt'] + $boardRating['sumGoodsPt'],
'ratedCnt' => $plusRating['ratedCnt'] + $boardRating['ratedCnt'],
];
} else {
if (!$this->useGoodsReviewBoardPoint()) {
return 0;
}
$rating = $this->getReviewRating(DB_BD_ . 'goodsreview', $goodsNo, ['isDelete' => 'n', 'isSecret' => 'n']);
}
 
return $this->calculateSatisfyLevel($rating['sumGoodsPt'], $rating['ratedCnt']);
}
 
/**
* 평점 합계와 평점 입력 리뷰 수로 satisfylevel 계산
*
* @param float $sumGoodsPt 평점 합계
* @param int $ratedCnt 평점 입력(goodsPt > 0) 리뷰 수
*
* @return float 소수 첫째 자리 반올림 평균 평점 (모수가 없으면 0)
*/
protected function calculateSatisfyLevel(float $sumGoodsPt, int $ratedCnt): float
{
if ($ratedCnt <= 0) {
return 0;
}
 
return round($sumGoodsPt / $ratedCnt, 1);
}
 
/**
* 리뷰 평점 합계·평점 입력 리뷰 수 집계
*
* 집계 제외 조건은 NaverDbUrl::getReviewCounting() 과 동일하며, 평점 미입력(goodsPt = 0)
* 리뷰와 외부 유입 네이버 리뷰(externalNaverReviewFl = 'y')는 합계·모수에서 모두 제외한다.
*
* @param string $tableName 리뷰 테이블명
* @param int $goodsNo 상품 번호
* @param array $addWhere key-value 형태 추가 조건
*
* @return array sumGoodsPt(평점 합계), ratedCnt(평점 입력 리뷰 수)
*/
protected function getReviewRating(string $tableName, int $goodsNo, array $addWhere): array
{
$arrBind = $arrWhere = $arrOrWhere = [];
 
$this->db->strField = 'SUM(goodsPt) AS sumGoodsPt, COUNT(*) AS ratedCnt';
$arrWhere[] = "goodsNo = ?";
$this->db->bind_param_push($arrBind, 'i', $goodsNo);
$arrWhere[] = "goodsPt > 0";
 
if (!empty($addWhere)) {
foreach ($addWhere as $key => $value) {
$arrWhere[] = $key . " = ? ";
$this->db->bind_param_push($arrBind, 's', $value);
}
}
 
// 외부 유입 네이버 리뷰는 리뷰 개수 집계와 동일하게 평점 모수에서도 제외 (컬럼 NULL 과거 데이터 포함)
$arrWhere[] = "(externalNaverReviewFl != 'y' OR externalNaverReviewFl IS NULL)";
 
// 네이버페이 주문형 리뷰는 EP 전송 제외 대상이라 평점 산정에서 제외
$arrOrWhere[] = "(channel != 'naverpay' AND memNo > 0)";
if ($tableName === DB_BD_ . 'goodsreview') {
$arrOrWhere[] = "(channel IS NULL AND memNo > 0)";
}
 
$this->db->strWhere = implode(' AND ', $arrWhere) . " AND (" . implode(' OR ', $arrOrWhere) . ")";
 
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . $tableName . implode(' ', $query);
$resultSet = $this->db->query_fetch($strSQL, $arrBind, false);
 
return [
'sumGoodsPt' => (float)$resultSet['sumGoodsPt'],
'ratedCnt' => (int)$resultSet['ratedCnt'],
];
}
 
/**
* 상품후기 게시판의 별점(점수) 사용 여부
*
* @return bool
*/
protected function useGoodsReviewBoardPoint(): bool
{
if ($this->useGoodsReviewBoardPt === null) {
$boardConfig = BoardUtil::getData(Board::BASIC_GOODS_REIVEW_ID);
$this->useGoodsReviewBoardPt = isset($boardConfig['bdGoodsPtFl']) && $boardConfig['bdGoodsPtFl'] == 'y';
}
 
return $this->useGoodsReviewBoardPt;
}
}
 
Component/Worker/NaverDbUrl3.php+2-1
변경 전NaverDbUrl3.php
{
/** @var array $header naver dburl 3.0 header */
//@formatter:off
protected $header = ['id','title','price_pc','normal_price','link','image_link','add_image_link','category_name1','category_name2','category_name3','category_name4','naver_category','naver_product_id','condition','import_flag','parallel_import','order_made','product_flag','rental_info','adult','brand','maker','origin','event_words','partner_coupon_download','interest_free_event',' point','installation_costs','search_tag','minimum_purchase_quantity','review_count','shipping','delivery_grade','delivery_detail','attribute','age_group','gender','npay_unable','npay_unable_acum','brand_certification','shipping_settings','unit_price'];
//@formatter:on
/** @var array $mobileConfig mobile.config policy */
protected $mobileConfig = [];
$totalcnt = StringUtils::strIsSet($this->getNaverReviewCount($goods), 0) . chr(9);
}
$result .= $totalcnt;
 
 
$result .= StringUtils::strIsSet($deliveryPrice) . chr(9); // [선택] 배송비
$result .= StringUtils::strIsSet($deliveryGrade) . chr(9); // 배송 · 설치비용
 
변경 후NaverDbUrl3.php
{
/** @var array $header naver dburl 3.0 header */
//@formatter:off
protected $header = ['id','title','price_pc','normal_price','link','image_link','add_image_link','category_name1','category_name2','category_name3','category_name4','naver_category','naver_product_id','condition','import_flag','parallel_import','order_made','product_flag','rental_info','adult','brand','maker','origin','event_words','partner_coupon_download','interest_free_event',' point','installation_costs','search_tag','minimum_purchase_quantity','review_count','satisfylevel','shipping','delivery_grade','delivery_detail','attribute','age_group','gender','npay_unable','npay_unable_acum','brand_certification','shipping_settings','unit_price'];
//@formatter:on
/** @var array $mobileConfig mobile.config policy */
protected $mobileConfig = [];
$totalcnt = StringUtils::strIsSet($this->getNaverReviewCount($goods), 0) . chr(9);
}
$result .= $totalcnt;
$result .= $this->getNaverSatisfyLevel($goods['goodsNo']) . chr(9); // [선택] 상품 평균 평점
 
$result .= StringUtils::strIsSet($deliveryPrice) . chr(9); // [선택] 배송비
$result .= StringUtils::strIsSet($deliveryGrade) . chr(9); // 배송 · 설치비용
 
Component/Worker/NaverDbUrl.php+125
변경 전NaverDbUrl.php
 
 
use Bundle\Component\Board\Board;
 
use Framework\Utility\NumberUtils;
use Framework\Utility\StringUtils;
use Monolog\Formatter\LineFormatter;
{
protected $salesIndexDbUrl, $salesDate, $db, $salesPath;
protected $salesHeader = ['mall_id', 'sale_count', 'sale_price', 'order_count', 'dt'];
 
 
/**
* DbUrl 정책 호출
if (($reviewCnt = $this->getNaverReviewCount($goods)) > 0) {
$this->writeDbUrl('<<<revct>>>' . $reviewCnt);
}
 
$this->writeDbUrl('<<<deliv>>>' . StringUtils::strIsSet($deliveryPrice)); // [선택] 배송비
if (StringUtils::strIsSet($installationCosts)) {
$this->writeDbUrl('<<<insco>>>' . StringUtils::strIsSet($installationCosts)); // 추가설치비용
return $reviewCnt;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* salesIndexInit
*
 
변경 후NaverDbUrl.php
 
 
use Bundle\Component\Board\Board;
use Component\Board\BoardUtil;
use Framework\Utility\NumberUtils;
use Framework\Utility\StringUtils;
use Monolog\Formatter\LineFormatter;
{
protected $salesIndexDbUrl, $salesDate, $db, $salesPath;
protected $salesHeader = ['mall_id', 'sale_count', 'sale_price', 'order_count', 'dt'];
protected $useGoodsReviewBoardPt;
 
/**
* DbUrl 정책 호출
if (($reviewCnt = $this->getNaverReviewCount($goods)) > 0) {
$this->writeDbUrl('<<<revct>>>' . $reviewCnt);
}
$this->writeDbUrl('<<<satisfylevel>>>' . $this->getNaverSatisfyLevel($goods['goodsNo'])); // [선택] 상품 평균 평점
$this->writeDbUrl('<<<deliv>>>' . StringUtils::strIsSet($deliveryPrice)); // [선택] 배송비
if (StringUtils::strIsSet($installationCosts)) {
$this->writeDbUrl('<<<insco>>>' . StringUtils::strIsSet($installationCosts)); // 추가설치비용
return $reviewCnt;
}
 
/**
* 네이버쇼핑 EP satisfylevel(상품 단위 평균 평점) 산출
*
* '네이버 쇼핑 상품평 개수' 설정(naverReviewChannel)과 동일한 소스에서 평점을 집계한다.
* both 는 평균의 평균이 아닌 (두 소스 평점 합계의 합 ÷ 두 소스 평점 입력 리뷰 수의 합)으로 계산한다.
*
* @param int $goodsNo 상품 번호
*
* @return float 소수 첫째 자리 반올림 평균 평점 (평점 입력 리뷰가 없으면 0)
*/
protected function getNaverSatisfyLevel(int $goodsNo): float
{
if (empty($goodsNo)) {
return 0;
}
 
if ($this->config['naverReviewChannel'] === 'plusReview') {
$rating = $this->getReviewRating(DB_PLUS_REVIEW_ARTICLE, $goodsNo, ['applyFl' => 'y']);
} elseif ($this->config['naverReviewChannel'] === 'both') {
$plusRating = $this->getReviewRating(DB_PLUS_REVIEW_ARTICLE, $goodsNo, ['applyFl' => 'y']);
$boardRating = ['sumGoodsPt' => 0, 'ratedCnt' => 0];
if ($this->useGoodsReviewBoardPoint()) {
$boardRating = $this->getReviewRating(DB_BD_ . 'goodsreview', $goodsNo, ['isDelete' => 'n', 'isSecret' => 'n']);
}
$rating = [
'sumGoodsPt' => $plusRating['sumGoodsPt'] + $boardRating['sumGoodsPt'],
'ratedCnt' => $plusRating['ratedCnt'] + $boardRating['ratedCnt'],
];
} else {
if (!$this->useGoodsReviewBoardPoint()) {
return 0;
}
$rating = $this->getReviewRating(DB_BD_ . 'goodsreview', $goodsNo, ['isDelete' => 'n', 'isSecret' => 'n']);
}
 
return $this->calculateSatisfyLevel($rating['sumGoodsPt'], $rating['ratedCnt']);
}
 
/**
* 평점 합계와 평점 입력 리뷰 수로 satisfylevel 계산
*
* @param float $sumGoodsPt 평점 합계
* @param int $ratedCnt 평점 입력(goodsPt > 0) 리뷰 수
*
* @return float 소수 첫째 자리 반올림 평균 평점 (모수가 없으면 0)
*/
protected function calculateSatisfyLevel(float $sumGoodsPt, int $ratedCnt): float
{
if ($ratedCnt <= 0) {
return 0;
}
 
return round($sumGoodsPt / $ratedCnt, 1);
}
 
/**
* 리뷰 평점 합계·평점 입력 리뷰 수 집계
*
* 집계 제외 조건은 getReviewCounting() 과 동일하며, 평점 미입력(goodsPt = 0) 리뷰와
* 외부 유입 네이버 리뷰(externalNaverReviewFl = 'y')는 합계·모수에서 모두 제외한다.
*
* @param string $tableName 리뷰 테이블명
* @param int $goodsNo 상품 번호
* @param array $addWhere key-value 형태 추가 조건
*
* @return array sumGoodsPt(평점 합계), ratedCnt(평점 입력 리뷰 수)
*/
protected function getReviewRating(string $tableName, int $goodsNo, array $addWhere): array
{
if ($this->db === null) {
$this->db = \App::load('DB');
}
$arrBind = $arrWhere = $arrOrWhere = [];
 
$this->db->strField = 'SUM(goodsPt) AS sumGoodsPt, COUNT(*) AS ratedCnt';
$arrWhere[] = "goodsNo = ?";
$this->db->bind_param_push($arrBind, 'i', $goodsNo);
$arrWhere[] = "goodsPt > 0";
 
if (!empty($addWhere)) {
foreach ($addWhere as $key => $value) {
$arrWhere[] = $key . " = ? ";
$this->db->bind_param_push($arrBind, 's', $value);
}
}
 
// 외부 유입 네이버 리뷰는 리뷰 개수 집계와 동일하게 평점 모수에서도 제외 (컬럼 NULL 과거 데이터 포함)
$arrWhere[] = "(externalNaverReviewFl != 'y' OR externalNaverReviewFl IS NULL)";
 
// 네이버페이 주문형 리뷰는 EP 전송 제외 대상이라 평점 산정에서 제외
$arrOrWhere[] = "(channel != 'naverpay' AND memNo > 0)";
if ($tableName === DB_BD_ . 'goodsreview') {
$arrOrWhere[] = "(channel IS NULL AND memNo > 0)";
}
 
$this->db->strWhere = implode(' AND ', $arrWhere) . " AND (" . implode(' OR ', $arrOrWhere) . ")";
 
$query = $this->db->query_complete();
$strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . $tableName . implode(' ', $query);
$resultSet = $this->db->query_fetch($strSQL, $arrBind, false);
 
return [
'sumGoodsPt' => (float)$resultSet['sumGoodsPt'],
'ratedCnt' => (int)$resultSet['ratedCnt'],
];
}
 
/**
* 상품후기 게시판의 별점(점수) 사용 여부
*
* @return bool
*/
protected function useGoodsReviewBoardPoint(): bool
{
if ($this->useGoodsReviewBoardPt === null) {
$boardConfig = BoardUtil::getData(Board::BASIC_GOODS_REIVEW_ID);
$this->useGoodsReviewBoardPt = isset($boardConfig['bdGoodsPtFl']) && $boardConfig['bdGoodsPtFl'] == 'y';
}
 
return $this->useGoodsReviewBoardPt;
}
 
/**
* salesIndexInit
*
 
재입고 알림 신청 보안 강화
Admin/goods/goods_restock.php+5
변경 전goods_restock.php
</div>
</div>
 
 
 
 
 
 
<!-- 검색 -->
<div class="table-title gd-help-manual">
신청 내역 검색
 
변경 후goods_restock.php
</div>
</div>
 
<div class="design-notice-box mgb20">
재입고 알림 신청 내역은 알림 발송 시점으로부터 5일 후 자동으로 삭제 처리됩니다.<br />
신청 이후 6개월 경과 시 해당 내역은 자동으로 삭제 처리되니 유의하시길 바랍니다.
</div>
 
<!-- 검색 -->
<div class="table-title gd-help-manual">
신청 내역 검색
 
Component/Goods/GoodsAdmin.php+2-1
변경 전GoodsAdmin.php
$snoArray = gd_array_column($restockUpdateData, 'sno');
$snoArray = @array_chunk($snoArray, 100);
foreach ($snoArray as $key => $valueArray) {
$this->db->set_update_db(DB_GOODS_RESTOCK, "smsSendFl='y'", "sno IN ('" . gd_implode("','", $valueArray) . "')");
 
}
}
}
 
변경 후GoodsAdmin.php
$snoArray = gd_array_column($restockUpdateData, 'sno');
$snoArray = @array_chunk($snoArray, 100);
foreach ($snoArray as $key => $valueArray) {
// 재발송 시에도 최초 발송일자를 유지해야 파기 기준일이 밀리지 않음
$this->db->set_update_db(DB_GOODS_RESTOCK, "smsSendFl='y', smsSendingDt=IFNULL(smsSendingDt, NOW())", "sno IN ('" . gd_implode("','", $valueArray) . "')");
}
}
}
 
웹FTP 파일 목록 파일명 보안 강화
Admin/share/popup_webftp.php+29-17
변경 전popup_webftp.php
</thead>
<tbody>
<?php foreach ($dirArray as $name => $fileInfo) { ?>
<tr class="text-center" data-name="<?= $name; ?>" data-href="<?= $fileInfo['url_path']; ?>">
<td data-sort="<?= $name; ?>" class="text-left">
<?php if ($fileInfo['is_image']) { ?>
<a href="<?php echo $fileInfo['url_path']; ?>" class="btn btn-link <?= $fileInfo['icon_class']; ?>" data-title="<?= basename($fileInfo['file_path']) ?>" data-gallery="godomall5Image"
data-toggle="lightbox"><?= $name; ?></a>
<?php } elseif ($fileInfo['is_html']) { ?>
<span class="<?= $fileInfo['icon_class']; ?>"><?= $name; ?></span>
<?php } else { ?>
<a href="<?php echo $fileInfo['url_path']; ?>" class="btn btn-link <?= $fileInfo['icon_class']; ?>"><?= $name; ?></a>
<?php } ?>
</td>
<td data-sort="<?= $fileInfo['file_size'] ?>" class="font-num"><?= $fileInfo['file_size']; ?></td>
<td data-sort="<?= $fileInfo['mod_time'] ?>" class="font-date"><?= $fileInfo['mod_time'] ?></td>
<td>
<?php if ($name != '..') { ?>
<button type="button" class="btn btn-sm btn-gray js-clipboard" title="주소복사하기" data-clipboard-text="/<?= $fileInfo['file_path'] ?>">주소복사</button>
<?php if (is_file($fileInfo['file_path'])) { ?>
<a href="popup_webftp_ps.php?mode=download&file=<?= $fileInfo['file_path'] ?>" class="btn btn-sm btn-white js-file-download">다운로드</a>
<?php } ?>
<button type="button" data-dirpath="<?= $currentDirectory ?>" data-file="<?= $fileInfo['file_path'] ?>" class="btn btn-sm btn-white js-file-rename">이름변경</button>
<button type="button" data-file="<?= $fileInfo['file_path'] ?>" class="btn btn-sm btn-white js-file-delete">삭제</button>
<?php } ?>
</td>
</tr>
var $btn_search = $('#btnSearch');
var $search_text = $('#' + $btn_search.data('target-id'));
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* 검색함수
*/
$item.addClass('display-none');
}
var $child = $(item).find('td:first a.fa-folder,a.fa-picture-o,span.fa-code');
$child.html(name);
var child_html = $child.text();
$child.html(exec_search(child_html, search_text));
});
var result = '';
var breakCnt = 0;
if (search == '') {
return html;
}
while (html != '' && breakCnt < 10) {
var exec = regexp.exec(html);
if (exec == null) {
result += html.substring(0, html.length);
break;
}
if (exec.index > 0) {
result += html.substring(0, exec.index);
result += append_highlight(exec[0]);
html = html.substring(exec.index + exec[0].length, html.length);
} else {
* @returns {string} 하이라이트처리된 html
*/
function append_highlight(text) {
return '<span style="background-color:#ffff00; color:#000000;">' + text + '</span>';
}
 
// 검색 버튼 이벤트
var filename = $(this).data('file');
BootstrapDialog.confirm({
title: '파일 삭제하기',
message: '"' + filename + '" 을(를) 정말로 삭제하시겠습니까?<br>삭제 후 복구하실 수 없습니다.',
callback: function (result) {
if (result) {
var params = {
var filename = $(this).data('file');
var compiled = _.template($('#fileRenameForm').html());
var datas = {
filename: filename
};
 
BootstrapDialog.show({
 
변경 후popup_webftp.php
</thead>
<tbody>
<?php foreach ($dirArray as $name => $fileInfo) { ?>
<tr class="text-center" data-name="<?= gd_htmlspecialchars($name); ?>" data-href="<?= $fileInfo['url_path']; ?>">
<td data-sort="<?= gd_htmlspecialchars($name); ?>" class="text-left">
<?php if ($fileInfo['is_image']) { ?>
<a href="<?php echo $fileInfo['url_path']; ?>" class="btn btn-link <?= $fileInfo['icon_class']; ?>" data-title="<?= gd_htmlspecialchars(basename($fileInfo['file_path'])) ?>" data-gallery="godomall5Image"
data-toggle="lightbox"><?= gd_htmlspecialchars($name); ?></a>
<?php } elseif ($fileInfo['is_html']) { ?>
<span class="<?= $fileInfo['icon_class']; ?>"><?= gd_htmlspecialchars($name); ?></span>
<?php } else { ?>
<a href="<?php echo $fileInfo['url_path']; ?>" class="btn btn-link <?= $fileInfo['icon_class']; ?>"><?= gd_htmlspecialchars($name); ?></a>
<?php } ?>
</td>
<td data-sort="<?= $fileInfo['file_size'] ?>" class="font-num"><?= $fileInfo['file_size']; ?></td>
<td data-sort="<?= $fileInfo['mod_time'] ?>" class="font-date"><?= $fileInfo['mod_time'] ?></td>
<td>
<?php if ($name != '..') { ?>
<button type="button" class="btn btn-sm btn-gray js-clipboard" title="주소복사하기" data-clipboard-text="/<?= gd_htmlspecialchars($fileInfo['file_path']) ?>">주소복사</button>
<?php if (is_file($fileInfo['file_path'])) { ?>
<a href="popup_webftp_ps.php?mode=download&file=<?= gd_htmlspecialchars($fileInfo['file_path']) ?>" class="btn btn-sm btn-white js-file-download">다운로드</a>
<?php } ?>
<button type="button" data-dirpath="<?= $currentDirectory ?>" data-file="<?= gd_htmlspecialchars($fileInfo['file_path']) ?>" class="btn btn-sm btn-white js-file-rename">이름변경</button>
<button type="button" data-file="<?= gd_htmlspecialchars($fileInfo['file_path']) ?>" class="btn btn-sm btn-white js-file-delete">삭제</button>
<?php } ?>
</td>
</tr>
var $btn_search = $('#btnSearch');
var $search_text = $('#' + $btn_search.data('target-id'));
 
/**
* HTML 특수문자 escape (파일명을 DOM 에 주입할 때 XSS 방지)
*/
function htmlEscape(str) {
return String(str)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;');
}
 
/**
* 검색함수
*/
$item.addClass('display-none');
}
var $child = $(item).find('td:first a.fa-folder,a.fa-picture-o,span.fa-code');
$child.text(name);
var child_html = $child.text();
$child.html(exec_search(child_html, search_text));
});
var result = '';
var breakCnt = 0;
if (search == '') {
return htmlEscape(html);
}
while (html != '' && breakCnt < 10) {
var exec = regexp.exec(html);
if (exec == null) {
result += htmlEscape(html.substring(0, html.length));
break;
}
if (exec.index > 0) {
result += htmlEscape(html.substring(0, exec.index));
result += append_highlight(exec[0]);
html = html.substring(exec.index + exec[0].length, html.length);
} else {
* @returns {string} 하이라이트처리된 html
*/
function append_highlight(text) {
return '<span style="background-color:#ffff00; color:#000000;">' + htmlEscape(text) + '</span>';
}
 
// 검색 버튼 이벤트
var filename = $(this).data('file');
BootstrapDialog.confirm({
title: '파일 삭제하기',
message: '"' + htmlEscape(filename) + '" 을(를) 정말로 삭제하시겠습니까?<br>삭제 후 복구하실 수 없습니다.',
callback: function (result) {
if (result) {
var params = {
var filename = $(this).data('file');
var compiled = _.template($('#fileRenameForm').html());
var datas = {
filename: htmlEscape(filename)
};
 
BootstrapDialog.show({
 
Component/File/Webftp.php+88-94
변경 전Webftp.php
*/
class Webftp
{
 
 
 
 
 
/**
* @var null
*/
// Cleanup directory path
$directory = $this->setDirectoryPath($directory);
 
if ($directory != '.' && $this->_isHidden($directory)) {
echo "Access denied.";
}
 
$filenameNoExt = basename($directory);
 
if ($directory == '.') {
$filenameNoExt = 'Home';
}
 
// We deliver a zip file
header('Content-Type: archive/zip');
 
{
 
// Build the path
if ($this->_directory == '.') {
$path = $this->_appURL;
} else {
$path = $this->_appURL . $this->_directory;
}
 
// Return the path
return $path;
 
// Check for an empty variable
if (empty($dir) || $dir == '.') {
return '.';
}
 
// Eliminate double slashes
// Set the error message
$this->setSystemMessage('danger', '<b>ERROR:</b> File path does not exist');
 
// Return the web root
return '.';
 
 
 
 
 
 
 
 
}
 
// Prevent access to hidden files
// Set the error message
$this->setSystemMessage('danger', '<b>ERROR:</b> Access denied');
 
// Set the directory to web root
return '.';
}
 
// Prevent access to parent folders
// Set the error message
$this->setSystemMessage('danger', '<b>ERROR:</b> An invalid path string was detected');
 
// Set the directory to web root
return '.';
} else {
// Should stop all URL wrappers (Thanks to Hexatex)
$directoryPath = $dir;
$relativePath = substr($relativePath, 2);
}
 
// Don't check parent dir if we're in the root dir
if ($this->_directory == '.' && $file == '..') {
continue;
 
 
 
 
} else {
// Get files absolute path
$realPath = realpath($relativePath);
 
// Determine file type by extension
if (is_dir($realPath)) {
$iconClass = 'fa-folder';
$sort = 1;
} else {
// Get file extension
$fileExt = strtolower(pathinfo($realPath, PATHINFO_EXTENSION));
 
if (isset($this->_fileTypes[$fileExt])) {
$iconClass = $this->_fileTypes[$fileExt];
} else {
$iconClass = $this->_fileTypes['blank'];
}
 
$sort = 2;
}
 
 
}
 
if ($file == '..') {
 
if ($this->_directory != '.') {
// Get parent directory path
$pathArray = explode('/', $relativePath);
unset($pathArray[gd_count($pathArray) - 1]);
unset($pathArray[gd_count($pathArray) - 1]);
$directoryPath = gd_implode('/', $pathArray);
 
if (!empty($directoryPath)) {
$directoryPath = '?dir=' . rawurlencode($directoryPath);
}
 
// 한글명 패치
$directoryPath = iconv('CP949', 'UTF-8', $directoryPath);
 
// Add file info to the array
$directoryArray['..'] = [
'file_path' => $directoryPath,
'url_path' => $this->_appURL . $directoryPath,
'file_size' => '-',
'file_permission' => $this->getPermission($realPath),
'mod_time' => date('Y-m-d H:i:s', filemtime($realPath)),
'icon_class' => 'fa-level-up',
'sort' => 0,
];
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
} elseif (!$this->_isHidden($relativePath)) {
 
// Add all non-hidden files to the array
if ($this->_directory != '.' || $file != 'index.php') {
 
// Build the file path
$urlPath = gd_implode('/', array_map('rawurlencode', explode('/', $relativePath)));
 
if (is_dir($relativePath)) {
$urlPath = '?dir=' . $urlPath;
} else {
$urlPath = '/' . $urlPath;
}
 
// 한글명 패치
$relativePath = iconv('CP949', 'UTF-8', $relativePath);
 
// Add the info to the main array
$directoryArray[pathinfo($relativePath, PATHINFO_BASENAME)] = [
'file_path' => $relativePath,
'url_path' => $urlPath,
'file_size' => is_dir($realPath) ? '-' : $this->getFileSize($realPath),
'file_permission' => $this->getPermission($realPath),
'mod_time' => date('Y-m-d H:i:s', filemtime($realPath)),
'icon_class' => $iconClass,
'sort' => $sort,
'is_deleteable' => is_dir($realPath) ? $this->isRecursivelyDeleteable($realPath) : is_writable($realPath),
'is_image' => FileUtils::isImageFile($realPath),
'is_html' => gd_in_array(
$fileExt, [
'html',
'css',
'js',
]
),
];
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
unset($fileExt);
}
 
변경 후Webftp.php
*/
class Webftp
{
/**
* WebFTP 샌드박스 루트 — 잘못된 경로의 폴백 목적지이자 초기 진입 기본 디렉토리
*/
public const DEFAULT_DIRECTORY = 'data';
 
/**
* @var null
*/
// Cleanup directory path
$directory = $this->setDirectoryPath($directory);
 
if ($this->_isHidden($directory)) {
echo "Access denied.";
}
 
$filenameNoExt = basename($directory);
 
 
 
 
 
// We deliver a zip file
header('Content-Type: archive/zip');
 
{
 
// Build the path
$path = $this->_appURL . $this->_directory;
 
 
 
 
 
// Return the path
return $path;
 
// Check for an empty variable
if (empty($dir) || $dir == '.') {
return self::DEFAULT_DIRECTORY;
}
 
// Eliminate double slashes
// Set the error message
$this->setSystemMessage('danger', '<b>ERROR:</b> File path does not exist');
 
// 잘못된 경로는 webftp 루트(data)로 폴백 — 도큐먼트 루트 노출 방지
return self::DEFAULT_DIRECTORY;
}
 
// 정규화 후 실제 경로가 도큐먼트 루트로 귀결되면 data 로 폴백
// (상단 empty/'.' 가드는 정규화 전이라 './', './/', './.' 등이 통과해 웹루트가 노출됨)
if (realpath($dir) === realpath('.')) {
$this->setSystemMessage('danger', '<b>ERROR:</b> An invalid path string was detected');
 
return self::DEFAULT_DIRECTORY;
}
 
// Prevent access to hidden files
// Set the error message
$this->setSystemMessage('danger', '<b>ERROR:</b> Access denied');
 
// 잘못된 경로는 webftp 루트(data)로 폴백 — 도큐먼트 루트 노출 방지
return self::DEFAULT_DIRECTORY;
}
 
// Prevent access to parent folders
// Set the error message
$this->setSystemMessage('danger', '<b>ERROR:</b> An invalid path string was detected');
 
// 잘못된 경로는 webftp 루트(data)로 폴백 — 도큐먼트 루트 노출 방지
return self::DEFAULT_DIRECTORY;
} else {
// Should stop all URL wrappers (Thanks to Hexatex)
$directoryPath = $dir;
$relativePath = substr($relativePath, 2);
}
 
// Get files absolute path
$realPath = realpath($relativePath);
 
// Determine file type by extension
if (is_dir($realPath)) {
$iconClass = 'fa-folder';
$sort = 1;
} else {
// Get file extension
$fileExt = strtolower(pathinfo($realPath, PATHINFO_EXTENSION));
 
if (isset($this->_fileTypes[$fileExt])) {
$iconClass = $this->_fileTypes[$fileExt];
 
 
} else {
$iconClass = $this->_fileTypes['blank'];
 
 
 
 
 
 
 
 
 
}
 
$sort = 2;
}
 
if ($file == '..') {
 
// Get parent directory path
$pathArray = explode('/', $relativePath);
unset($pathArray[gd_count($pathArray) - 1]);
unset($pathArray[gd_count($pathArray) - 1]);
$directoryPath = gd_implode('/', $pathArray);
 
if (!empty($directoryPath)) {
$directoryPath = '?dir=' . rawurlencode($directoryPath);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
// 한글명 패치
$directoryPath = iconv('CP949', 'UTF-8', $directoryPath);
 
// Add file info to the array
$directoryArray['..'] = [
'file_path' => $directoryPath,
'url_path' => $this->_appURL . $directoryPath,
'file_size' => '-',
'file_permission' => $this->getPermission($realPath),
'mod_time' => date('Y-m-d H:i:s', filemtime($realPath)),
'icon_class' => 'fa-level-up',
'sort' => 0,
];
 
} elseif (!$this->_isHidden($relativePath)) {
 
// Build the file path
$urlPath = gd_implode('/', array_map('rawurlencode', explode('/', $relativePath)));
 
if (is_dir($relativePath)) {
$urlPath = '?dir=' . $urlPath;
} else {
$urlPath = '/' . $urlPath;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
// 한글명 패치
$relativePath = iconv('CP949', 'UTF-8', $relativePath);
 
// Add the info to the main array
$directoryArray[pathinfo($relativePath, PATHINFO_BASENAME)] = [
'file_path' => $relativePath,
'url_path' => $urlPath,
'file_size' => is_dir($realPath) ? '-' : $this->getFileSize($realPath),
'file_permission' => $this->getPermission($realPath),
'mod_time' => date('Y-m-d H:i:s', filemtime($realPath)),
'icon_class' => $iconClass,
'sort' => $sort,
'is_deleteable' => is_dir($realPath) ? $this->isRecursivelyDeleteable($realPath) : is_writable($realPath),
'is_image' => FileUtils::isImageFile($realPath),
'is_html' => gd_in_array(
$fileExt, [
'html',
'css',
'js',
]
),
];
}
unset($fileExt);
}
 
Controller/Admin/Share/PopupWebftpController.php+2-2
변경 전PopupWebftpController.php
$dirArray = $webftp->listDirectory(Request::get()->get('dir'));
$currentDirectory = Request::get()->get('dir');
} else {
$dirArray = $webftp->listDirectory('data');
$currentDirectory = 'data';
}
}
$this->setData('currentDirectory', $currentDirectory);
 
변경 후PopupWebftpController.php
$dirArray = $webftp->listDirectory(Request::get()->get('dir'));
$currentDirectory = Request::get()->get('dir');
} else {
$dirArray = $webftp->listDirectory(Webftp::DEFAULT_DIRECTORY);
$currentDirectory = Webftp::DEFAULT_DIRECTORY;
}
}
$this->setData('currentDirectory', $currentDirectory);
 
관리자 답변 게시글 보안 강화
Component/Board/ArticleAdmin.php+3
변경 전ArticleAdmin.php
$data['eventEnd'] = date_format(date_create($data['eventEnd']), "Y.m.d");
}
$data['subject'] = $this->xssClean($data['subject']);
 
 
 
$data['replyStatusText'] = '-';
$data['replyComplete'] = false;
if ($this->cfg['bdReplyStatusFl'] == 'y' || $this->cfg['bdAnswerStatusFl'] == 'y') {
 
변경 후ArticleAdmin.php
$data['eventEnd'] = date_format(date_create($data['eventEnd']), "Y.m.d");
}
$data['subject'] = $this->xssClean($data['subject']);
if (isset($data['answerSubject'])) {
$data['answerSubject'] = $this->xssClean($data['answerSubject']);
}
$data['replyStatusText'] = '-';
$data['replyComplete'] = false;
if ($this->cfg['bdReplyStatusFl'] == 'y' || $this->cfg['bdAnswerStatusFl'] == 'y') {
 
Component/Board/BoardFront.php+3
변경 전BoardFront.php
}
}
$data['subject'] = $this->xssClean($data['subject']);
 
 
 
$data['replyStatusText'] = '-';
$data['replyComplete'] = false;
$isMobile = $data['isMobile'] == 'y' ? true : false;
 
변경 후BoardFront.php
}
}
$data['subject'] = $this->xssClean($data['subject']);
if (isset($data['answerSubject'])) {
$data['answerSubject'] = $this->xssClean($data['answerSubject']);
}
$data['replyStatusText'] = '-';
$data['replyComplete'] = false;
$isMobile = $data['isMobile'] == 'y' ? true : false;
 
Controller/Admin/Board/ArticlePsController.php+1
변경 전ArticlePsController.php
case 'replyQa' :
try {
/** @var \Bundle\Component\Board\ArticleActAdmin $articleActAdmin */
 
$req['answerContents'] = StringUtils::xssClean($req['answerContents']);
$articleActAdmin = new ArticleActAdmin($req);
$articleActAdmin->updateAnswer($msgs);
 
변경 후ArticlePsController.php
case 'replyQa' :
try {
/** @var \Bundle\Component\Board\ArticleActAdmin $articleActAdmin */
$req['answerSubject'] = StringUtils::xssClean($req['answerSubject']);
$req['answerContents'] = StringUtils::xssClean($req['answerContents']);
$articleActAdmin = new ArticleActAdmin($req);
$articleActAdmin->updateAnswer($msgs);
 
보안 강화
Controller/Front/Main/HtmlController.php+5
변경 전HtmlController.php
$pageName = $this->_realpath($pageTmp[0]);
$pageName = $this->_setPageName($pageName);
 
 
 
 
 
 
$this->getView()->setPageName($pageName);
}
 
 
변경 후HtmlController.php
$pageName = $this->_realpath($pageTmp[0]);
$pageName = $this->_setPageName($pageName);
 
// htmid 는 스킨 페이지 식별자 — 영숫자·_·-·/·. 외 문자가 섞이면 비정상 입력으로 차단
if ($pageName === '' || preg_match('/[^a-zA-Z0-9_\-\/.]/', $pageName)) {
throw new \Exception('invalid htmid');
}
 
$this->getView()->setPageName($pageName);
}
 
 
Controller/Mobile/Main/HtmlController.php+5
변경 전HtmlController.php
$pageName = $this->_realpath($pageTmp[0]);
$pageName = $this->_setPageName($pageName);
 
 
 
 
 
 
$this->getView()->setPageName($pageName);
}
 
 
변경 후HtmlController.php
$pageName = $this->_realpath($pageTmp[0]);
$pageName = $this->_setPageName($pageName);
 
// htmid 는 스킨 페이지 식별자 — 영숫자·_·-·/·. 외 문자가 섞이면 비정상 입력으로 차단
if ($pageName === '' || preg_match('/[^a-zA-Z0-9_\-\/.]/', $pageName)) {
throw new \Exception('invalid htmid');
}
 
$this->getView()->setPageName($pageName);
}
 
 
zip 압축·파일 처리 보안 강화
Component/File/Webftp.php+89-23
변경 전Webftp.php
namespace Bundle\Component\File;
 
use Component\Validator\Validator;
 
use Framework\Utility\ArrayUtils;
use Framework\Utility\FileUtils;
use App;
//change directory so the zip file doesnt have a tree structure in it.
chdir($directory);
 
// TODO: Probably we have to parse exclude list more carefully
$excludeList = gd_implode(' ', gd_array_merge($this->_config['hidden_files'], ['index.php']));
$excludeList = str_replace("*", "\*", $excludeList);
 
if ($this->_config['zip_stream']) {
 
 
 
// zip the stuff (dir and all in there) into the streamed zip file
$stream = popen('/usr/bin/zip -' . $this->_config['zip_compression_level'] . ' -r -q - * -x ' . $excludeList, 'r');
 
if ($stream) {
fpassthru($stream);
fclose($stream);
}
 
} else {
 
// get a tmp name for the .zip
$tmpZip = tempnam('tmp', 'tempzip') . '.zip';
 
// zip the stuff (dir and all in there) into the tmp_zip file
exec('zip -' . $this->_config['zip_compression_level'] . ' -r ' . $tmpZip . ' * -x ' . $excludeList);
 
// calc the length of the zip. it is needed for the progress bar of the browser
$filesize = filesize($tmpZip);
header("Content-Length: $filesize");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
// deliver the zip file
$fp = fopen($tmpZip, 'r');
echo fpassthru($fp);
 
 
 
 
 
 
 
 
 
 
// clean up the tmp zip file
unlink($tmpZip);
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
/**
 
변경 후Webftp.php
namespace Bundle\Component\File;
 
use Component\Validator\Validator;
use Framework\File\Archive\ArchiveHandler;
use Framework\Utility\ArrayUtils;
use Framework\Utility\FileUtils;
use App;
//change directory so the zip file doesnt have a tree structure in it.
chdir($directory);
 
$excludePatterns = array_merge($this->_config['hidden_files'], ['index.php']);
$targetList = $this->_collectZipTargets('.', $excludePatterns);
 
 
// ZipArchive 는 스트림 출력을 지원하지 않아 임시 파일을 거쳐 전달한다
// 확장자를 덧붙이면 대상이 없어 아카이브를 만들지 않았을 때 존재하지 않는 경로를 다루게 된다
$tmpZip = tempnam(sys_get_temp_dir(), 'tempzip');
 
if (!empty($targetList)) {
(new ArchiveHandler())->create($tmpZip, $targetList, null, 'zip');
}
 
 
 
 
 
 
 
 
 
 
if (!$this->_config['zip_stream']) {
 
 
// calc the length of the zip. it is needed for the progress bar of the browser
$filesize = filesize($tmpZip);
header("Content-Length: $filesize");
}
 
// deliver the zip file
$fp = fopen($tmpZip, 'r');
 
if ($fp) {
fpassthru($fp);
fclose($fp);
}
 
// clean up the tmp zip file
unlink($tmpZip);
}
}
 
/**
* Collects relative paths of files to be archived.
*
* @param string $directory Relative path of directory to collect
* @param array $excludePatterns fnmatch patterns to exclude
*
* @return array Relative paths of target files
* @access protected
*/
protected function _collectZipTargets(string $directory, array $excludePatterns): array
{
$targetList = [];
 
try {
$iterator = new \DirectoryIterator($directory);
} catch (\UnexpectedValueException $e) {
// 기존 zip -r 도 열 수 없는 디렉토리는 건너뛰고 나머지를 계속 압축했다
return $targetList;
}
 
foreach ($iterator as $item) {
if ($item->isDot()) {
continue;
}
 
// 최상위 dot file 은 기존 shell glob(*) 이 걸러내던 대상
if ($directory === '.' && str_starts_with($item->getFilename(), '.')) {
continue;
}
 
$relativePath = $directory === '.' ? $item->getFilename() : $directory . '/' . $item->getFilename();
 
if ($item->isDir()) {
$collectedList = $this->_collectZipTargets($relativePath, $excludePatterns);
 
if (!empty($collectedList)) {
array_push($targetList, ...$collectedList);
}
continue;
}
 
if ($this->_isExcluded($relativePath, $excludePatterns)) {
continue;
}
 
$targetList[] = $relativePath;
}
 
return $targetList;
}
 
/**
* Checks if the file matches any exclude pattern.
*
* @param string $relativePath Relative path of file to check
* @param array $excludePatterns fnmatch patterns to exclude
*
* @return bool
* @access protected
*/
protected function _isExcluded(string $relativePath, array $excludePatterns): bool
{
foreach ($excludePatterns as $excludePattern) {
if (fnmatch($excludePattern, $relativePath)) {
return true;
}
}
 
return false;
}
 
/**
 
Component/Sms/SmsSender.php+2-4
변경 전SmsSender.php
use Component\Sms\SmsLog;
use Component\Sms\SmsUtil;
use Component\Validator\Validator;
 
use Framework\File\FileHandler;
use Framework\Security\CredentialsFile;
use Framework\Security\Otp;
$fileHandler->delete($compressFileName, true);
}
// 압축 대상
$compressTarget = self::SMS_LARGE_TXT_FILE_NAME;
// 파일 압축
exec('cd ' . $this->_smsLargeFilePath . ' && zip -r "' . $compressFileName . '" ' . $compressTarget);
// 압축파일 체크
if ($fileHandler->isExists($compressFileName) === false) {
 
변경 후SmsSender.php
use Component\Sms\SmsLog;
use Component\Sms\SmsUtil;
use Component\Validator\Validator;
use Framework\File\Archive\ArchiveHandler;
use Framework\File\FileHandler;
use Framework\Security\CredentialsFile;
use Framework\Security\Otp;
$fileHandler->delete($compressFileName, true);
}
 
 
 
// 파일 압축
(new ArchiveHandler())->create($compressFileName, [$tmpFilePath], null, 'zip', $this->_smsLargeFilePath);
// 압축파일 체크
if ($fileHandler->isExists($compressFileName) === false) {
 
Component/Worker/DbUrl.php+21-6
변경 전DbUrl.php
$this->mergedFilePath = $path;
if($this->totalDburlData >= $this->dburl_max_count || $lastPageNum == $page) {
$this->fileMerge($this->totalDburlPage, $path);
exec('cp ' . $path . " " . $path.'_back_up');
return true;
}
 
$this->mergedFilePath = $path;
if($this->totalDburlData >= $this->dburl_max_count || $lastPageNum == $page) {
$this->fileMerge($this->totalDburlPage, $path);
exec('cp ' . $path . " " . $path.'_back_up');
return true;
}
 
$this->mergedFilePath = $path;
if(/*$this->totalDburlData >= $this->dburl_max_count || */$lastPageNum == $page) {
$this->fileMerge($this->totalDburlPage, $path);
exec('cp ' . $path . " " . $path.'_back_up');
return true;
}
}
*/
private function fileMerge($tmpFileCnt, $path)
{
//초기화
exec('cat /dev/null > ' . $path);
 
for ($num = 0; $num < $tmpFileCnt; $num++) {
$tmpFileName = $path . '_tmp_' . $num;
//머지 후 삭제
if (is_file($tmpFileName) === true) {
exec('cat ' . $tmpFileName . ' >> ' . $path);
 
 
 
 
 
 
 
 
 
 
unlink($tmpFileName);
}
}
 
 
 
 
 
$this->isMerge = true;
}
 
 
변경 후DbUrl.php
$this->mergedFilePath = $path;
if($this->totalDburlData >= $this->dburl_max_count || $lastPageNum == $page) {
$this->fileMerge($this->totalDburlPage, $path);
copy($path, $path . '_back_up');
return true;
}
 
$this->mergedFilePath = $path;
if($this->totalDburlData >= $this->dburl_max_count || $lastPageNum == $page) {
$this->fileMerge($this->totalDburlPage, $path);
copy($path, $path . '_back_up');
return true;
}
 
$this->mergedFilePath = $path;
if(/*$this->totalDburlData >= $this->dburl_max_count || */$lastPageNum == $page) {
$this->fileMerge($this->totalDburlPage, $path);
copy($path, $path . '_back_up');
return true;
}
}
*/
private function fileMerge($tmpFileCnt, $path)
{
// 쓰기 모드로 한 번만 열어 초기화까지 겸한다
$mergedHandle = fopen($path, 'wb');
 
for ($num = 0; $num < $tmpFileCnt; $num++) {
$tmpFileName = $path . '_tmp_' . $num;
//머지 후 삭제
if (is_file($tmpFileName) === true) {
$tmpHandle = fopen($tmpFileName, 'rb');
 
if ($tmpHandle !== false) {
if ($mergedHandle !== false) {
// 대용량 파일을 메모리에 적재하지 않도록 스트림으로 이어 붙인다
stream_copy_to_stream($tmpHandle, $mergedHandle);
}
 
fclose($tmpHandle);
}
 
unlink($tmpFileName);
}
}
 
if ($mergedHandle !== false) {
fclose($mergedHandle);
}
 
$this->isMerge = true;
}
 
 
Controller/Admin/Share/PopupWebftpController.php+3
변경 전PopupWebftpController.php
}
 
if (Request::get()->has('zip')) {
 
 
 
$dirArray = $webftp->zipDirectory(Request::get()->get('zip'));
} else {
// Initialize the directory array
 
변경 후PopupWebftpController.php
}
 
if (Request::get()->has('zip')) {
// ZipArchive 압축은 스크립트 실행시간에 포함되어 대용량 디렉토리에서 기본 30초를 초과할 수 있다
set_time_limit(RUN_TIME_LIMIT);
 
$dirArray = $webftp->zipDirectory(Request::get()->get('zip'));
} else {
// Initialize the directory array
 
환불완료 주문 상태 정합성 개선
Component/Order/OrderAdminNew.php+7-2
변경 전OrderAdminNew.php
}
 
// 환불완료/취소/실패인 경우 무조건 상태변경 금지
if ($val['orderStatus'] == 'r3' || $val['orderStatus'] == 'c' || $val['orderStatus'] == 'f') {
if($channel != 'naverpay') {
 
 
 
 
 
$changeStatusCheck = false;
 
if ($changeStatus === 'r3') {
 
변경 후OrderAdminNew.php
}
 
// 환불완료/취소/실패인 경우 무조건 상태변경 금지
// 스냅샷($val)뿐 아니라 FOR UPDATE 잠금조회로 최신 상태까지 확인해 배치 중 커밋된 환불완료(r3) 덮어쓰기 방지
if ($channel != 'naverpay') {
$lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', ['is', $val['sno'], $orderNo], false);
$currentOrderStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus'];
 
if ($val['orderStatus'] == 'r3' || $val['orderStatus'] == 'c' || $val['orderStatus'] == 'f'
|| $currentOrderStatus == 'r3' || $currentOrderStatus == 'c' || $currentOrderStatus == 'f') {
$changeStatusCheck = false;
 
if ($changeStatus === 'r3') {
 
Component/Order/OrderAdmin.php+4-2
변경 전OrderAdmin.php
$changeStatusCheck = false;
}
} else {
// 실제 주문상품의 주문상태
$orderGoodsStatus = $this->getOrderGoods($orderNo,$val['sno'])[0]['orderStatus'];
 
 
 
if ($changeStatus === 'r3') {
$this->setCommonLog(
 
변경 후OrderAdmin.php
$changeStatusCheck = false;
}
} else {
// 실제 주문상품의 주문상태 배치 트랜잭션 스냅샷(REPEATABLE READ)에 가려진 환불완료(r3)를 놓치지 않도록
// FOR UPDATE 잠금조회로 최신 커밋 상태 재조회 (덮어쓰기 방지)
$lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', ['is', $val['sno'], $orderNo], false);
$orderGoodsStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus'];
 
if ($changeStatus === 'r3') {
$this->setCommonLog(
 
엑셀·CSV 다운로드 및 쿠폰 발급 보안 강화
Component/Coupon/CouponAdmin.php+7-1
변경 전CouponAdmin.php
$fileHandler->write(\App::getUserBasePath() . '/config/CliSaveCoupon', json_encode($tempMemberData));
$aTempData = array('arrData' => $arrData, 'searchQuery' => 'T');
$sData = json_encode($aTempData);
exec("/usr/local/php/bin/php " . \App::getUserBasePath() . "/route.php job --name='CliSaveCoupon' --extravalue='" . $sData . "'" . " > /dev/null 2>/dev/null &");
 
 
 
 
 
 
return 'C';
exit;
}
 
변경 후CouponAdmin.php
$fileHandler->write(\App::getUserBasePath() . '/config/CliSaveCoupon', json_encode($tempMemberData));
$aTempData = array('arrData' => $arrData, 'searchQuery' => 'T');
$sData = json_encode($aTempData);
$script = sprintf(
'/usr/local/php/bin/php %s job --name=%s --extravalue=%s > /dev/null 2>/dev/null &',
escapeshellarg(\App::getUserBasePath() . '/route.php'),
escapeshellarg('CliSaveCoupon'),
escapeshellarg($sData)
);
exec($script);
return 'C';
exit;
}
 
Component/Excel/ExcelRequest.php+14-7
변경 전ExcelRequest.php
}
 
if ($arrData['passwordFl'] == 'y') {
// 특정문자 치환
$replace = ['$', '"', '`'];
foreach ($replace as $key => $val) {
$arrData['password'] = str_replace($val, '\\' . $val, $arrData['password']);
}
$this->fileConfig['password'] = gd_isset($arrData['password']);
} else {
$this->fileConfig['password'] = "";
$fileName = pathinfo($tmpFilePath)['filename'];
 
$zipFilePath = UserFilePath::data('excel', $this->fileConfig['menu'], $fileName . ".zip")->getRealPath();
exec('cd ' . pathinfo($tmpFilePath)['dirname'] . ' && zip -P ' . $this->fileConfig['password'] . ' -r "' . $zipFilePath . '" "' . $fileName . '.xls"');
 
 
 
 
 
 
$this->fileConfig['fileName'][] = $fileName . ".zip";
FileHandler::delete($tmpFilePath);
}
$tmpFilePath = UserFilePath::data('excel', $this->fileConfig['menu'], '_tmp', $fileName . ".xls")->getRealPath();
FileHandler::write($tmpFilePath, $inputData, 0707);
$zipFilePath = UserFilePath::data('excel', $this->fileConfig['menu'], $fileName . ".zip")->getRealPath();
exec('cd ' . pathinfo($tmpFilePath)['dirname'] . ' && zip -P ' . $this->fileConfig['password'] . ' -r "' . $zipFilePath . '" "' . $fileName . '.xls"');
 
 
 
 
 
 
$this->fileConfig['fileName'][] = $fileName . '.zip';
FileHandler::delete($tmpFilePath);
} else {
 
변경 후ExcelRequest.php
}
 
if ($arrData['passwordFl'] == 'y') {
 
 
 
 
 
$this->fileConfig['password'] = gd_isset($arrData['password']);
} else {
$this->fileConfig['password'] = "";
$fileName = pathinfo($tmpFilePath)['filename'];
 
$zipFilePath = UserFilePath::data('excel', $this->fileConfig['menu'], $fileName . ".zip")->getRealPath();
exec(sprintf(
'cd %s && zip -P %s -r %s %s',
escapeshellarg(pathinfo($tmpFilePath)['dirname']),
escapeshellarg($this->fileConfig['password']),
escapeshellarg($zipFilePath),
escapeshellarg($fileName . '.xls')
));
$this->fileConfig['fileName'][] = $fileName . ".zip";
FileHandler::delete($tmpFilePath);
}
$tmpFilePath = UserFilePath::data('excel', $this->fileConfig['menu'], '_tmp', $fileName . ".xls")->getRealPath();
FileHandler::write($tmpFilePath, $inputData, 0707);
$zipFilePath = UserFilePath::data('excel', $this->fileConfig['menu'], $fileName . ".zip")->getRealPath();
exec(sprintf(
'cd %s && zip -P %s -r %s %s',
escapeshellarg(pathinfo($tmpFilePath)['dirname']),
escapeshellarg($this->fileConfig['password']),
escapeshellarg($zipFilePath),
escapeshellarg($fileName . '.xls')
));
$this->fileConfig['fileName'][] = $fileName . '.zip';
FileHandler::delete($tmpFilePath);
} else {
 
주문·SMS 처리 안정성 개선
Component/Order/OrderNew.php+12-2
변경 전OrderNew.php
use Session;
use Framework\Utility\DateTimeUtils;
use Component\Payment\Tosspay\TosspayConfig;
 
 
 
/**
// 현재 상태 수정 처리
$arrWhere[] = 'sno = ?';
$arrWhere[] = 'orderNo = ?';
 
 
 
 
 
 
foreach ($arrData['sno'] as $key => $val) {
// 주문 로그 저장
$logCode01 = $this->getOrderStatusAdmin($arrData['orderStatus'][$key]) . '(' . $arrData['orderStatus'][$key] . ')';
$orderLogData = $this->db->query_fetch($strSQL, $arrBind, false);
 
if ((int)$orderLogData['cnt'] == 0 || $isClaim === true) {
foreach ($aGoodsSno['sno'] as $v) {
 
 
 
$aValue = array();
 
$aOrderGoodsData = $this->getOnlyOrderGoodsData($orderNo, $v);
 
// 인서트 or 업데이트
$aMemberOrderGoodsCountData = $this->getMemberOrderGoodsCountData($aOrderData['memNo'], $aOrderGoodsData['goodsNo']);
 
변경 후OrderNew.php
use Session;
use Framework\Utility\DateTimeUtils;
use Component\Payment\Tosspay\TosspayConfig;
use Util\Order\OrderGoodsLockSortUtil;
 
 
/**
// 현재 상태 수정 처리
$arrWhere[] = 'sno = ?';
$arrWhere[] = 'orderNo = ?';
// [데드락 회피] 같은 주문의 여러 es_orderGoods 행을 트랜잭션마다 동일한 순서(sno 오름차순)로 잠그도록 통일
// 클레임(취소/교환)이 동시 실행될 때 행 잠금 순서가 엇갈려 발생하던 교착(패턴 L)을 예방
// 키를 유지하는 asort 로 정렬하므로 아래 $arrData['orderStatus'][$key] 쌍 대응은 그대로 보존
if (is_array($arrData['sno'])) {
asort($arrData['sno'], SORT_NUMERIC);
}
foreach ($arrData['sno'] as $key => $val) {
// 주문 로그 저장
$logCode01 = $this->getOrderStatusAdmin($arrData['orderStatus'][$key]) . '(' . $arrData['orderStatus'][$key] . ')';
$orderLogData = $this->db->query_fetch($strSQL, $arrBind, false);
 
if ((int)$orderLogData['cnt'] == 0 || $isClaim === true) {
// [데드락 회피] es_memberOrderGoodsCount 잠금 순서 통일을 위해 goodsNo 오름차순으로 처리(상세: OrderGoodsLockSortUtil)
$aResolvedGoodsList = OrderGoodsLockSortUtil::resolveOrderGoodsSortedByGoodsNo($this, $orderNo, $aGoodsSno['sno']);
 
foreach ($aResolvedGoodsList as $aResolved) {
$aValue = array();
 
$aOrderGoodsData = $aResolved['data'];
 
// 인서트 or 업데이트
$aMemberOrderGoodsCountData = $this->getMemberOrderGoodsCountData($aOrderData['memNo'], $aOrderGoodsData['goodsNo']);
 
Component/Order/Order.php+12-2
변경 전Order.php
use Framework\Utility\DateTimeUtils;
use Framework\Utility\KafkaUtils;
use Bundle\Component\Payment\Tosspay\TosspayConfig;
 
 
/**
* 주문 class
// 현재 상태 수정 처리
$arrWhere[] = 'sno = ?';
$arrWhere[] = 'orderNo = ?';
 
 
 
 
 
 
foreach ($arrData['sno'] as $key => $val) {
// 주문 로그 저장
$logCode01 = $this->getOrderStatusAdmin($arrData['orderStatus'][$key]) . '(' . $arrData['orderStatus'][$key] . ')';
$orderLogData = $this->db->query_fetch($strSQL, $arrBind, false);
 
if ((int)$orderLogData['cnt'] == 0 || $isClaim === true) {
foreach ($aGoodsSno['sno'] as $v) {
 
 
 
$aValue = array();
 
$aOrderGoodsData = $this->getOnlyOrderGoodsData($orderNo, $v);
 
// 인서트 or 업데이트
$aMemberOrderGoodsCountData = $this->getMemberOrderGoodsCountData($aOrderData['memNo'], $aOrderGoodsData['goodsNo']);
 
변경 후Order.php
use Framework\Utility\DateTimeUtils;
use Framework\Utility\KafkaUtils;
use Bundle\Component\Payment\Tosspay\TosspayConfig;
use Util\Order\OrderGoodsLockSortUtil;
 
/**
* 주문 class
// 현재 상태 수정 처리
$arrWhere[] = 'sno = ?';
$arrWhere[] = 'orderNo = ?';
// [데드락 회피] 같은 주문의 여러 es_orderGoods 행을 트랜잭션마다 동일한 순서(sno 오름차순)로 잠그도록 통일
// 클레임(취소/교환)이 동시 실행될 때 행 잠금 순서가 엇갈려 발생하던 교착(패턴 L)을 예방
// 키를 유지하는 asort 로 정렬하므로 아래 $arrData['orderStatus'][$key] 쌍 대응은 그대로 보존
if (is_array($arrData['sno'])) {
asort($arrData['sno'], SORT_NUMERIC);
}
foreach ($arrData['sno'] as $key => $val) {
// 주문 로그 저장
$logCode01 = $this->getOrderStatusAdmin($arrData['orderStatus'][$key]) . '(' . $arrData['orderStatus'][$key] . ')';
$orderLogData = $this->db->query_fetch($strSQL, $arrBind, false);
 
if ((int)$orderLogData['cnt'] == 0 || $isClaim === true) {
// [데드락 회피] es_memberOrderGoodsCount 잠금 순서 통일을 위해 goodsNo 오름차순으로 처리(상세: OrderGoodsLockSortUtil)
$aResolvedGoodsList = OrderGoodsLockSortUtil::resolveOrderGoodsSortedByGoodsNo($this, $orderNo, $aGoodsSno['sno']);
 
foreach ($aResolvedGoodsList as $aResolved) {
$aValue = array();
 
$aOrderGoodsData = $aResolved['data'];
 
// 인서트 or 업데이트
$aMemberOrderGoodsCountData = $this->getMemberOrderGoodsCountData($aOrderData['memNo'], $aOrderGoodsData['goodsNo']);
 
Util/Order/OrderGoodsLockSortUtil.php+59
변경 전OrderGoodsLockSortUtil.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
변경 후OrderGoodsLockSortUtil.php
<?php
/*
* Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved
*
* Unauthorized copying or redistribution of this file in source and binary forms via any medium
* is strictly prohibited.
*/
 
namespace Bundle\Util\Order;
 
/**
* [데드락 회피] 주문상품 잠금 순서 통일용 정렬 유틸.
*
* es_memberOrderGoodsCount 는 (memNo, goodsNo) 기준으로 잠기므로, 여러 상품을 갱신할 때
* goodsNo 오름차순으로 처리해 트랜잭션 간 잠금 순서를 통일한다(데드락 패턴 A 예방)
* Order / OrderNew 양쪽에서 동일 로직을 공용으로 사용하기 위해 분리
*/
class OrderGoodsLockSortUtil
{
/**
* 주문상품 sno 목록을 실제 주문상품 정보로 해석한 뒤 goodsNo 오름차순으로 정렬해 반환
*
* sno 입력 순서에 의존하지 않으며, 같은 goodsNo 의 상대 순서는 원본 순서를 보존
* (정렬 안정성 → 중복 goodsNo 누적 처리 동작 불변). goodsNo 를 해석하지 못한 항목은 0 으로 앞에 정렬
*
* @param object $order getOnlyOrderGoodsData(orderNo, sno) 를 제공하는 주문 객체(Order|OrderNew)
* @param string $orderNo 주문번호
* @param array $orderGoodsSnoList 주문상품 sno 목록
*
* @return array 각 항목이 array('seq'=>입력순번, 'goodsNo'=>정렬키, 'data'=>getOnlyOrderGoodsData 결과)
* 이며 goodsNo 오름차순으로 정렬된 목록
*/
public static function resolveOrderGoodsSortedByGoodsNo(object $order, string $orderNo, array $orderGoodsSnoList): array
{
// 재사용 대비 방어: getOnlyOrderGoodsData 를 제공하지 않는 객체면 빈 목록 반환
if (!is_object($order) || !method_exists($order, 'getOnlyOrderGoodsData')) {
return [];
}
 
$resolvedList = [];
foreach ($orderGoodsSnoList as $seq => $orderGoodsSno) {
$orderGoodsData = $order->getOnlyOrderGoodsData($orderNo, $orderGoodsSno);
$resolvedList[] = [
'seq' => $seq,
'goodsNo' => (is_array($orderGoodsData) && isset($orderGoodsData['goodsNo'])) ? (int) $orderGoodsData['goodsNo'] : 0,
'data' => $orderGoodsData,
];
}
usort($resolvedList, function ($leftGoods, $rightGoods) {
if ($leftGoods['goodsNo'] === $rightGoods['goodsNo']) {
return $leftGoods['seq'] - $rightGoods['seq']; // 동률은 원본 순서 유지(정렬 안정성 보장)
}
 
return $leftGoods['goodsNo'] - $rightGoods['goodsNo'];
});
 
return $resolvedList;
}
}
 
아이디찾기 보안 강화
Component/Member/Member.php+4
변경 전Member.php
$session = \App::getInstance('session');
$mall = $session->get(SESSION_GLOBAL_MALL);
gd_isset($param['findIdFl'], 'email');
 
 
 
 
 
if ($param['findIdFl'] === 'email') {
if (Validator::email($param['userEmail'], true) === false) {
 
변경 후Member.php
$session = \App::getInstance('session');
$mall = $session->get(SESSION_GLOBAL_MALL);
gd_isset($param['findIdFl'], 'email');
// findIdFl 은 SQL 컬럼명 위치에 결합되어 값 바인딩으로 방어 불가 → 허용 컬럼 화이트리스트로 차단
if (!in_array($param['findIdFl'], ['email', 'cellPhone'], true)) {
throw new \Exception(__('회원정보를 찾을 수 없습니다.'));
}
 
if ($param['findIdFl'] === 'email') {
if (Validator::email($param['userEmail'], true) === false) {
 
상품 복사 시 이미지 폴더 구조 처리 개선
Component/Storage/Storage.php+22-8
변경 전Storage.php
const PATH_CODE_EVENT_GROUP_TMP = 30;
const PATH_CODE_JOIN_EVENT = 31;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
public static function copy($pathCode, $toStorageName, $toPath, $fromStorageName, $fromPath, $recursive = false)
{
$toStorage = Storage::disk($pathCode, $toStorageName, true);
set_time_limit(1000);
$result = false;
$contents = $manager->listContents('to://' . $toPath, $recursive);
$addRecursive = '';
foreach ($contents as $entry) {
$update = true;
if ($update) {
if ($entry['type'] == 'file') {
$result = $manager->copy('to://' . $entry['path'], 'from://' . $fromStorage->getMountPath($fromPath . $addRecursive . $entry['basename']));
} else {
$addRecursive .= $entry['filename'] . DS;
}
}
 
 
 
 
}
return $result;
 
변경 후Storage.php
const PATH_CODE_EVENT_GROUP_TMP = 30;
const PATH_CODE_JOIN_EVENT = 31;
/**
* 파일 또는 디렉토리를 복사한다.
*
* 디렉토리를 복사할 때 대상 경로는 항상 $fromPath 바로 아래에 평면으로 구성된다.
* 원본의 하위 디렉토리 구조는 보존하지 않는다.
*
* @param int $pathCode
* @param string $toStorageName
* @param string $toPath
* @param string $fromStorageName
* @param string $fromPath
* @param bool $recursive 원본 목록 조회 범위에만 적용된다. 대상 경로 구성에는 영향을 주지 않으므로,
* true 로 호출하면 하위 디렉토리의 파일도 대상 폴더 최상위로 복사된다.
*
* @return bool
*/
public static function copy($pathCode, $toStorageName, $toPath, $fromStorageName, $fromPath, $recursive = false)
{
$toStorage = Storage::disk($pathCode, $toStorageName, true);
set_time_limit(1000);
$result = false;
$contents = $manager->listContents('to://' . $toPath, $recursive);
 
foreach ($contents as $entry) {
if ($entry['type'] !== 'file') {
continue;
 
 
 
 
 
}
// 대상 경로는 항상 $fromPath 바로 아래로 만든다.
// 디렉토리 엔트리 이름을 누적해 두면 그 뒤에 나오는 형제 파일까지 하위 디렉토리로 밀려 들어간다.
$result = $manager->copy('to://' . $entry['path'], 'from://' . $fromStorage->getMountPath($fromPath . $entry['basename']));
}
return $result;
 
상품 상세페이지 이미지 업로드 안정성 개선
Component/Validator/Validator.php+38-9
변경 전Validator.php
const TEXT_USERID_INVALID = '%s은(는) 아이디형식에 맞지 않습니다.';
const TEXT_YN_INVALID = '%s은(는) y 또는 n 이어야 합니다.';
const TEXT_BOOLEAN_INVALID = '%s은(는) true 또는 false 이어야 합니다.';
 
 
 
 
 
/**
* act 함수 실행 시 데이터가 없는경우에도 체크하도록 하기 위한 플래그
* @var bool
}
 
/*
* PHP 열림 태그(<?php / <?=)부터 닫힘 태그(또는 파일 끝)까지 추출 — 닫힘 태그 우회 차단 + 바이너리 false positive 회피.
* 열림 태그를 <?php / <?= 로 한정: 바이너리에 우연히 나온 <? 가 거대한 가짜 PHP 블록을 만들어 정상 이미지를 오탐하던 문제 차단.
* /s 모디파이어로 . 가 newline 도 매칭하여 nl2br 트릭 불필요. /i 로 <?PHP 대소문자 무시.
 
 
 
 
 
*/
if (preg_match_all('/<\?(?:php|=)(.*?)(?:\?>|$)/si', $text, $matches)) {
$dangerPatterns = [
'variable_access' => [
'description' => '슈퍼글로벌 변수 및 변수 변수 접근',
'patterns' => [
'\$_(?:GET|POST|REQUEST|COOKIE|SERVER|FILES|ENV|SESSION)',
'\$\{\s*[\'"]?_(?:GET|POST|REQUEST|COOKIE|SERVER|FILES|ENV|SESSION)',
'\$\$\w+',
]
],
'code_execution' => [
 
$combinedPattern = '/' . implode('|', array_merge(...array_column($dangerPatterns, 'patterns'))) . '/i';
 
foreach ($matches[1] as $phpContent) {
if (preg_match($combinedPattern, $phpContent)) {
return false;
 
 
 
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
}
}
return true;
 
변경 후Validator.php
const TEXT_USERID_INVALID = '%s은(는) 아이디형식에 맞지 않습니다.';
const TEXT_YN_INVALID = '%s은(는) y 또는 n 이어야 합니다.';
const TEXT_BOOLEAN_INVALID = '%s은(는) true 또는 false 이어야 합니다.';
/**
* 웹쉘 검사 시 PHP 열림 태그 뒤로 훑을 최대 바이트 수
* 실제 페이로드는 태그 뒤 100바이트 안쪽에 나오고 범위를 넓힐수록 바이너리 오탐이 늘어, 4096 에서 절충
*/
const INCLUDE_EVAL_SCAN_WINDOW = 4096;
/**
* act 함수 실행 시 데이터가 없는경우에도 체크하도록 하기 위한 플래그
* @var bool
}
 
/*
* PHP 열림 태그 위치만 찾아, 각 태그 뒤 INCLUDE_EVAL_SCAN_WINDOW 바이트만 검사한다.
* 열림 태그부터 파일 끝까지를 한 블록으로 잡으면 바이너리에 우연히 섞인 3바이트 열림 태그
* 하나가 뒤쪽 전체를 검사 대상으로 끌고 와 정상 이미지를 오탐한다 (용량이 클수록 확률 증가).
* 정규식이 블록을 소비하지 않으므로, 이미지 뒤에 이어붙인 웹쉘의 열림 태그도 개별로 검사된다.
*
* 겹치는 윈도우는 하나의 구간으로 합쳐 한 번만 검사한다. 검사 대상 바이트의 합집합은 같지만,
* 열림 태그를 빽빽이 채운 파일에서 같은 구간을 태그 수만큼 다시 훑는 비용이 사라진다.
* 태그 위치를 한꺼번에 모으지 않고 흘려보내므로 태그 수가 많아도 메모리가 늘지 않는다.
*/
if (str_contains($text, '<?')) {
$dangerPatterns = [
'variable_access' => [
'description' => '슈퍼글로벌 변수 및 변수 변수 함수 호출',
'patterns' => [
'\$_(?:GET|POST|REQUEST|COOKIE|SERVER|FILES|ENV|SESSION)',
'\$\{\s*[\'"]?_(?:GET|POST|REQUEST|COOKIE|SERVER|FILES|ENV|SESSION)',
'\$\$\{?\w+\}?(?:\[[^\]\n]{0,64}\])?\s*\(',
]
],
'code_execution' => [
 
$combinedPattern = '/' . implode('|', array_merge(...array_column($dangerPatterns, 'patterns'))) . '/i';
 
$scanPattern = '/<\?(?:php|=)/i';
$rangeStart = null;
$rangeEnd = 0;
$offset = 0;
while (preg_match($scanPattern, $text, $openTag, PREG_OFFSET_CAPTURE, $offset)) {
// PREG_OFFSET_CAPTURE 오프셋은 int 지만 preg_match 스텁이 string[] 이라 분석기용 캐스팅
$tagOffset = (int) $openTag[0][1];
if ($rangeStart === null) {
$rangeStart = $tagOffset;
} elseif ($tagOffset > $rangeEnd) {
// 앞 구간과 떨어진 태그 — 앞 구간을 먼저 검사하고 새 구간을 시작한다
if (preg_match($combinedPattern, substr($text, $rangeStart, $rangeEnd - $rangeStart))) {
return false;
}
$rangeStart = $tagOffset;
}
$rangeEnd = $tagOffset + self::INCLUDE_EVAL_SCAN_WINDOW;
$offset = $tagOffset + 1;
}
 
if ($rangeStart !== null
&& preg_match($combinedPattern, substr($text, $rangeStart, $rangeEnd - $rangeStart))) {
return false;
}
}
return true;
 
관리자 SEO 페이지 로드 안정성 개선
Admin/policy/base_seo.php+2-2
변경 전base_seo.php
<tr>
<th>PC 쇼핑몰</th>
<td class="form-inline">
http://<?=$data['mallDomain']?>/<input type="text" name="errPage[front]" value="<?php echo $data['errPage']['front']; ?>" class="form-control width-lg"/>
</td>
</tr>
<tr>
<th>모바일 쇼핑몰</th>
<td class="form-inline">
<?=$data['mallMobileDomain'] ?? URI_MOBILE?><input type="text" name="errPage[mobile]" value="<?php echo $data['errPage']['mobile']; ?>" class="form-control width-lg"/>
</td>
</tr>
</table>
 
변경 후base_seo.php
<tr>
<th>PC 쇼핑몰</th>
<td class="form-inline">
http://<?=$data['mallDomain']?>/<input type="text" name="errPage[front]" value="<?php echo $data['errPage']['front'] ?? ''; ?>" class="form-control width-lg"/>
</td>
</tr>
<tr>
<th>모바일 쇼핑몰</th>
<td class="form-inline">
<?=$data['mallMobileDomain'] ?? URI_MOBILE?><input type="text" name="errPage[mobile]" value="<?php echo $data['errPage']['mobile'] ?? ''; ?>" class="form-control width-lg"/>
</td>
</tr>
</table>
 
Component/Policy/Policy.php+3-1
변경 전Policy.php
 
// rss처리
if (Request::files()->has('rss') === true) {
$setRssData = gd_policy('basic.seo')['rss'];
 
 
foreach (Request::files()->get('rss')['tmp_name'] as $key => $val) {
// 사이트맵 저장 화일명
$rssFileName = 'rss' . ucwords($key) . '.xml';
 
변경 후Policy.php
 
// rss처리
if (Request::files()->has('rss') === true) {
// 정책 데이터가 깨진 상점에서 배열이 아닌 값이 올 수 있어 방어
$seoPolicy = gd_policy('basic.seo');
$setRssData = is_array($seoPolicy) ? ($seoPolicy['rss'] ?? []) : [];
foreach (Request::files()->get('rss')['tmp_name'] as $key => $val) {
// 사이트맵 저장 화일명
$rssFileName = 'rss' . ucwords($key) . '.xml';
 
Controller/Admin/Policy/BaseSeoController.php+15-6
변경 전BaseSeoController.php
// 사이트맵 설정
$data['sitemap'] = gd_policy('basic.sitemap');
 
 
 
gd_isset($data['sitemap']['sitemapAutoFl'],"n");
$checked['sitemap']['sitemapAutoFl'][$data['sitemap']['sitemapAutoFl']] = 'checked="checked"';
//RSS 설정 ,페이지 경로 설정 , 대표URL 설정 , 연관채널 설정
$seoData = gd_policy('basic.seo', $mallSno);
$data['rss'] = $seoData['rss'];
$data['errPage'] = $seoData['errPage'];
$data['canonicalUrl'] = $seoData['canonicalUrl'];
$data['relationChannel'] = gd_array_filter($seoData['relationChannel']);
 
 
 
 
 
 
$checked['rss']['useFl'][$data['rss']['useFl']] = $checked['errPage']['useFl'][$data['errPage']['useFl']] = $checked['canonicalUrl']['useFl'][$data['canonicalUrl']['useFl']] = 'checked="checked"';
} catch (Exception $e) {
//echo $e->getMessage();
}
// --- 관리자 디자인 템플릿
 
변경 후BaseSeoController.php
// 사이트맵 설정
$data['sitemap'] = gd_policy('basic.sitemap');
if (!is_array($data['sitemap'])) {
$data['sitemap'] = [];
}
gd_isset($data['sitemap']['sitemapAutoFl'],"n");
$checked['sitemap']['sitemapAutoFl'][$data['sitemap']['sitemapAutoFl']] = 'checked="checked"';
//RSS 설정 ,페이지 경로 설정 , 대표URL 설정 , 연관채널 설정
$seoData = gd_policy('basic.seo', $mallSno);
if (!is_array($seoData)) {
$seoData = [];
}
$data['rss'] = $seoData['rss'] ?? [];
$data['errPage'] = $seoData['errPage'] ?? [];
$data['canonicalUrl'] = $seoData['canonicalUrl'] ?? [];
$data['relationChannel'] = gd_array_filter($seoData['relationChannel'] ?? []);
$data['rss']['useFl'] ??= 'n';
$data['errPage']['useFl'] ??= 'n';
$data['canonicalUrl']['useFl'] ??= 'n';
$checked['rss']['useFl'][$data['rss']['useFl']] = $checked['errPage']['useFl'][$data['errPage']['useFl']] = $checked['canonicalUrl']['useFl'][$data['canonicalUrl']['useFl']] = 'checked="checked"';
} catch (\Throwable $e) {
\Logger::channel('adminLog')->error(__METHOD__, ['exception' => $e]);
}
// --- 관리자 디자인 템플릿
 
Controller/Front/RssController.php+3-2
변경 전RssController.php
*/
public function index()
{
// RSS 설정 정보
$rssData = gd_policy('basic.seo')['rss'];
 
// 사이트맵 설정
$rssFl = true;
 
변경 후RssController.php
*/
public function index()
{
// RSS 설정 정보 (정책 데이터가 깨진 상점에서 배열이 아닌 값이 올 수 있어 방어)
$seoPolicy = gd_policy('basic.seo');
$rssData = is_array($seoPolicy) ? ($seoPolicy['rss'] ?? []) : [];
// 사이트맵 설정
$rssFl = true;
 
결혼여부 기본값 저장 안정성 개선
Admin/member/_member_view_other.php+2-2
변경 전_member_view_other.php
<td>
<label class="radio-inline">
<input type="radio" name="marriFl" value="n"
data-target="input[name=marriDate]" <?= $checked['marriFl']['n']; ?>>
미혼
</label>
<label class="radio-inline">
<input type="radio" name="marriFl" value="y"
data-target="input[name=marriDate]" <?= $checked['marriFl']['y']; ?>>
기혼
</label>
</td>
 
변경 후_member_view_other.php
<td>
<label class="radio-inline">
<input type="radio" name="marriFl" value="n"
data-target="input[name=marriDate]" <?= $checked['marriFl']['n'] ?? ''; ?>>
미혼
</label>
<label class="radio-inline">
<input type="radio" name="marriFl" value="y"
data-target="input[name=marriDate]" <?= $checked['marriFl']['y'] ?? ''; ?>>
기혼
</label>
</td>
 
Component/Database/MemberTableField.php+1-1
변경 전MemberTableField.php
[
'val' => 'marriFl',
'typ' => 's',
'def' => 'n',
],
// 결혼여부
[
 
변경 후MemberTableField.php
[
'val' => 'marriFl',
'typ' => 's',
'def' => '',
],
// 결혼여부
[
 
Component/Member/History.php+1
변경 전History.php
}
if ('marriFl' == $key) {
$displayArray = [
 
'n' => __('미혼'),
'y' => __('기혼'),
];
 
변경 후History.php
}
if ('marriFl' == $key) {
$displayArray = [
'' => __('선택안함'),
'n' => __('미혼'),
'y' => __('기혼'),
];
 
Component/Member/MemberAdmin.php+1-1
변경 전MemberAdmin.php
 
if (isset($params['marriFl']) === true && $params['marriFl'] == 'y') {
$v->add('marriDate', '', $require['marriDate'], '{' . __('결혼기념일') . '}'); // 결혼기념일
} elseif (isset($params['marriFl']) === true && $params['marriFl'] == 'n') {
$v->add('marriDate', '', false, '{' . __('결혼기념일') . '}'); // 결혼기념일
$params['marriDate'] = '';
}
 
변경 후MemberAdmin.php
 
if (isset($params['marriFl']) === true && $params['marriFl'] == 'y') {
$v->add('marriDate', '', $require['marriDate'], '{' . __('결혼기념일') . '}'); // 결혼기념일
} elseif (isset($params['marriFl']) === true) {
$v->add('marriDate', '', false, '{' . __('결혼기념일') . '}'); // 결혼기념일
$params['marriDate'] = '';
}
 
Component/Member/MyPage.php+1-1
변경 전MyPage.php
$requestParams['marriDate'] = $requestParams['marriYear'].'-'.$requestParams['marriMonth'].'-'.$requestParams['marriDay'];
}
$v->add('marriDate', '', $require['marriDate'], '{' . __('결혼기념일') . '}'); // 결혼기념일
} elseif (isset($requestParams['marriFl']) === true && $requestParams['marriFl'] == 'n') {
$v->add('marriDate', '', false, '{' . __('결혼기념일') . '}'); // 결혼기념일
$requestParams['marriDate'] = '';
}
 
변경 후MyPage.php
$requestParams['marriDate'] = $requestParams['marriYear'].'-'.$requestParams['marriMonth'].'-'.$requestParams['marriDay'];
}
$v->add('marriDate', '', $require['marriDate'], '{' . __('결혼기념일') . '}'); // 결혼기념일
} elseif (isset($requestParams['marriFl']) === true) {
$v->add('marriDate', '', false, '{' . __('결혼기념일') . '}'); // 결혼기념일
$requestParams['marriDate'] = '';
}
 
data/skin/front/moment/member/_join_view_other.html+1-1
변경 전_join_view_other.html
</tr>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<tr class="js_marridateinfo {? data.marriFl == 'n'}dn{/}">
<th><span>{=__('결혼기념일')}</span></th>
<td>
<div class="member_warning">{=gd_select_box('marriYear', 'marriYear', DateYearMarri, null, data.marriYear, __('년'), 'style="width: 100px;"', 'chosen-single')}</div>
 
변경 후_join_view_other.html
</tr>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<tr class="js_marridateinfo {? joinField.marriFl.use == 'y' && data.marriFl != 'y'}dn{/}">
<th><span>{=__('결혼기념일')}</span></th>
<td>
<div class="member_warning">{=gd_select_box('marriYear', 'marriYear', DateYearMarri, null, data.marriYear, __('년'), 'style="width: 100px;"', 'chosen-single')}</div>
 
data/skin/front/mygreek/member/_join_view_other.html+1-1
변경 전_join_view_other.html
</tr>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<tr class="js_marridateinfo {? data.marriFl == 'n'}dn{/}">
<th><span>{=__('결혼기념일')}</span></th>
<td>
<div class="member_warning">{=gd_select_box('marriYear', 'marriYear', DateYearMarri, null, data.marriYear, __('년'), 'style="width: 100px;"', 'chosen-single')}</div>
 
변경 후_join_view_other.html
</tr>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<tr class="js_marridateinfo {? joinField.marriFl.use == 'y' && data.marriFl != 'y'}dn{/}">
<th><span>{=__('결혼기념일')}</span></th>
<td>
<div class="member_warning">{=gd_select_box('marriYear', 'marriYear', DateYearMarri, null, data.marriYear, __('년'), 'style="width: 100px;"', 'chosen-single')}</div>
 
data/skin/front/story_g/member/_join_view_other.html+1-1
변경 전_join_view_other.html
</tr>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<tr class="marridateinfo {? data.marriFl == 'n'}dn{/}">
<th class="ta-l">{=__('결혼기념일')}</th>
<td>
<div class="marry">
 
변경 후_join_view_other.html
</tr>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<tr class="marridateinfo {? joinField.marriFl.use == 'y' && data.marriFl != 'y'}dn{/}">
<th class="ta-l">{=__('결혼기념일')}</th>
<td>
<div class="marry">
 
data/skin/mobile/moment/member/_join_view_other.html+1-1
변경 전_join_view_other.html
</div>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<div class="input_wrap marridateinfo {? data.marriFl == 'n'}dn{/}">
<div class="input_title">{=__('결혼기념일')}</div>
<div class="input_content">
<div class="inp_sel">
 
변경 후_join_view_other.html
</div>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<div class="input_wrap marridateinfo {? joinField.marriFl.use == 'y' && data.marriFl != 'y'}dn{/}">
<div class="input_title">{=__('결혼기념일')}</div>
<div class="input_content">
<div class="inp_sel">
 
data/skin/mobile/mygreek/member/_join_view_other.html+1-1
변경 전_join_view_other.html
</div>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<div class="input_wrap marridateinfo {? data.marriFl == 'n'}dn{/}">
<div class="input_title">{=__('결혼기념일')}</div>
<div class="input_content">
<div class="inp_sel">
 
변경 후_join_view_other.html
</div>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<div class="input_wrap marridateinfo {? joinField.marriFl.use == 'y' && data.marriFl != 'y'}dn{/}">
<div class="input_title">{=__('결혼기념일')}</div>
<div class="input_content">
<div class="inp_sel">
 
data/skin/mobile/story_g/member/_join_view_other.html+1-1
변경 전_join_view_other.html
</div>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<div class="input_wrap marridateinfo {? data.marriFl == 'n'}dn{/}">
<div class="input_title">{=__('결혼기념일')}</div>
<div class="input_content">
<div class="inp_sel">
 
변경 후_join_view_other.html
</div>
<!--{/}-->
<!--{? joinField.marriDate.use == 'y'}-->
<div class="input_wrap marridateinfo {? joinField.marriFl.use == 'y' && data.marriFl != 'y'}dn{/}">
<div class="input_title">{=__('결혼기념일')}</div>
<div class="input_content">
<div class="inp_sel">
 
특정 회원등급 할인 가격 적용 개선
Admin/goods/goods_batch_mileage.php+3-3
변경 전goods_batch_mileage.php
<td>
<div class="goods-discount-all form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscount" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default();?></option>
 
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="text" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
 
변경 후goods_batch_mileage.php
<td>
<div class="goods-discount-all form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscount" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default();?></option>
 
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="number" step="any" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
 
Admin/goods/goods_benefit_register.php+11-4
변경 전goods_benefit_register.php
}
});
 
 
 
 
 
 
 
display_goods_discount_set();
display_toggle_class('goodsDiscountFl', 'goodsDiscountConfig');
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="text" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
<td>
<div class="goods-discount-all hide form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscount" value="<?=$data['goodsDiscountUnit'] == 'percent' ? $data['goodsDiscount'] : gd_money_format($data['goodsDiscount'], false);?>" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountUnit']['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountUnit']['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, $val, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="<?php echo $data['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key] == 'percent' ? $data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key] : gd_money_format($data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key], false);?>" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
 
변경 후goods_benefit_register.php
}
});
//number 에서 validator가 문제가 되어, ajax로 넘어가지 않아서, 여기서는 name으로 비교하도록 수정
$('#frmBenefit').data('validator').findByName = function (name) {
return $(this.currentForm).find('input, select, textarea').filter(function () {
return this.name === name;
});
};
display_goods_discount_set();
display_toggle_class('goodsDiscountFl', 'goodsDiscountConfig');
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="number" step="any" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
<td>
<div class="goods-discount-all hide form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscount" value="<?=$data['goodsDiscountUnit'] == 'percent' ? str_replace(',', '', $data['goodsDiscount']) : gd_money_format($data['goodsDiscount'], false);?>" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountUnit']['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountUnit']['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, $val, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="<?php echo $data['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key] == 'percent' ? str_replace(',', '', $data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key]) : gd_money_format($data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key], false);?>" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
 
Admin/goods/goods_register_option_stock.php+11-4
변경 전goods_register_option_stock.php
}
});
 
 
 
 
 
 
 
 
 
$('#imageStorage').trigger('click');
image_storage_selector('<?=$data['imageStorage'];?>');
<td>
<div class="goods-discount-all hide form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscount" value="<?=$data['goodsDiscountUnit'] == 'percent' ? $data['goodsDiscount'] : gd_money_format($data['goodsDiscount'], false);?>" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountUnit']['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountUnit']['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, $val, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="<?php echo $data['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key] == 'percent' ? $data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key] : gd_money_format($data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key], false);?>" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
 
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="text" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
 
변경 후goods_register_option_stock.php
}
});
 
//number 에서 validator가 문제가 되어, ajax로 넘어가지 않아서, 여기서는 name으로 비교하도록 수정
$('#frmGoods').data('validator').findByName = function (name) {
return $(this.currentForm).find('input, select, textarea').filter(function () {
return this.name === name;
});
};
 
 
$('#imageStorage').trigger('click');
image_storage_selector('<?=$data['imageStorage'];?>');
<td>
<div class="goods-discount-all hide form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscount" value="<?=$data['goodsDiscountUnit'] == 'percent' ? str_replace(',', '', $data['goodsDiscount']) : gd_money_format($data['goodsDiscount'], false);?>" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountUnit']['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountUnit']['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, $val, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="<?php echo $data['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key] == 'percent' ? str_replace(',', '', $data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key]) : gd_money_format($data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key], false);?>" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
 
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="number" step="any" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
 
Admin/goods/goods_register.php+11-4
변경 전goods_register.php
}
});
 
 
 
 
 
 
 
 
 
$('#imageStorage').trigger('click');
image_storage_selector('<?=$data['imageStorage'];?>');
<td>
<div class="goods-discount-all hide form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscount" value="<?=$data['goodsDiscountUnit'] == 'percent' ? $data['goodsDiscount'] : gd_money_format($data['goodsDiscount'], false);?>" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountUnit']['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountUnit']['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, $val, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="<?php echo $data['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key] == 'percent' ? $data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key] : gd_money_format($data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key], false);?>" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="text" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
 
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="text" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
 
변경 후goods_register.php
}
});
 
//number 에서 validator가 문제가 되어, ajax로 넘어가지 않아서, 여기서는 name으로 비교하도록 수정
$('#frmGoods').data('validator').findByName = function (name) {
return $(this.currentForm).find('input, select, textarea').filter(function () {
return this.name === name;
});
};
 
 
$('#imageStorage').trigger('click');
image_storage_selector('<?=$data['imageStorage'];?>');
<td>
<div class="goods-discount-all hide form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscount" value="<?=$data['goodsDiscountUnit'] == 'percent' ? str_replace(',', '', $data['goodsDiscount']) : gd_money_format($data['goodsDiscount'], false);?>" class="form-control width-sm">
<select name="goodsDiscountUnit" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountUnit']['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountUnit']['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, $val, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="<?php echo $data['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key] == 'percent' ? str_replace(',', '', $data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key]) : gd_money_format($data['goodsDiscountGroupMemberInfo']['goodsDiscount'][$key], false);?>" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['percent']); ?>>%</option>
<option value="price" <?=gd_isset($selected['goodsDiscountGroupMemberInfo']['goodsDiscountUnit'][$key]['price']); ?>><?=gd_currency_default(); ?></option>
<td><?php echo gd_select_box(null, "goodsDiscountGroupMemberInfo['groupSno'][]", $groupList, null, null, '=회원등급 선택='); ?></td>
<td class="form-inline">
<span class="goods-title">구매금액의</span>
<input type="number" step="any" name="goodsDiscountGroupMemberInfo['goodsDiscount'][]" value="" class="form-control width-sm">
<select name="goodsDiscountGroupMemberInfo['goodsDiscountUnit'][]" class="goods-unit form-control width-2xs">
<option value="percent" selected="selected">%</option>
<option value="price"><?=gd_currency_default(); ?></option>
 
var html = '<tr>' +
'<td>' + groupSnoInfo + '</td>' +
'<td class="form-inline"><span class="goods-title">구매금액의</span> <input type="number" step="any" name="' + inputName + '" value="" class="form-control width-sm"> ' + goodsUnitInfo + ' <input type="button" value="삭제" class="btn btn-sm btn-white btn-icon-minus del-groupSno"></td>' +
'</tr>';
$('.' + appendClassName + ' table').append(html);
});
 
Component/Goods/GoodsAdmin.php+7
변경 전GoodsAdmin.php
use Framework\Debug\Exception\AlertOnlyException;
use Framework\File\FileHandler;
use Framework\ObjectStorage\Service\ImageUploadService;
 
use Framework\Utility\ProducerUtils;
use Framework\Utility\StringUtils;
use Framework\Utility\ArrayUtils;
$arrData['mileageGroupMemberInfo'] = str_replace('\'', '', json_encode($arrData['mileageGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
$arrData['mileageGroupInfo'] = @gd_implode(INT_DIVISION, $arrData['mileageGroupInfo']);
$arrData['fixedGoodsDiscount'] = @gd_implode(STR_DIVISION, $arrData['fixedGoodsDiscount']);
 
 
 
$arrData['goodsDiscountGroupMemberInfo'] = str_replace('\'', '', json_encode($arrData['goodsDiscountGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
$arrData['exceptBenefit'] = @gd_implode(STR_DIVISION, $arrData['exceptBenefit']);
if (empty($arrData['exceptBenefit']) === true) $arrData['exceptBenefitGroup'] = '';
$setData['goodsDiscountFl'] = $getData['goodsDiscountFl'];
$setData['fixedGoodsDiscount'] = @gd_implode(STR_DIVISION, $getData['fixedGoodsDiscount']);
$setData['goodsDiscountGroup'] = $getData['goodsDiscountGroup'];
 
 
$setData['goodsDiscount'] = $getData['goodsDiscount'];
$setData['goodsDiscountUnit'] = $getData['goodsDiscountUnit'];
 
$setData['goodsDiscountGroupMemberInfo'] = str_replace('\'', '', json_encode($getData['goodsDiscountGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
 
}else{ //상품 혜택 적용
 
변경 후GoodsAdmin.php
use Framework\Debug\Exception\AlertOnlyException;
use Framework\File\FileHandler;
use Framework\ObjectStorage\Service\ImageUploadService;
use Framework\Utility\NumberUtils;
use Framework\Utility\ProducerUtils;
use Framework\Utility\StringUtils;
use Framework\Utility\ArrayUtils;
$arrData['mileageGroupMemberInfo'] = str_replace('\'', '', json_encode($arrData['mileageGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
$arrData['mileageGroupInfo'] = @gd_implode(INT_DIVISION, $arrData['mileageGroupInfo']);
$arrData['fixedGoodsDiscount'] = @gd_implode(STR_DIVISION, $arrData['fixedGoodsDiscount']);
// 할인값의 천 단위 콤마 제거 (미제거 시 할인가 숫자 연산이 깨짐)
$arrData = NumberUtils::removeCommaByField($arrData, 'goodsDiscount');
$arrData['goodsDiscountGroupMemberInfo'] = NumberUtils::removeCommaByField($arrData['goodsDiscountGroupMemberInfo'], 'goodsDiscount');
$arrData['goodsDiscountGroupMemberInfo'] = str_replace('\'', '', json_encode($arrData['goodsDiscountGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
$arrData['exceptBenefit'] = @gd_implode(STR_DIVISION, $arrData['exceptBenefit']);
if (empty($arrData['exceptBenefit']) === true) $arrData['exceptBenefitGroup'] = '';
$setData['goodsDiscountFl'] = $getData['goodsDiscountFl'];
$setData['fixedGoodsDiscount'] = @gd_implode(STR_DIVISION, $getData['fixedGoodsDiscount']);
$setData['goodsDiscountGroup'] = $getData['goodsDiscountGroup'];
// 할인값의 천 단위 콤마 제거 (미제거 시 할인가 숫자 연산이 깨짐)
$getData = NumberUtils::removeCommaByField($getData, 'goodsDiscount');
$setData['goodsDiscount'] = $getData['goodsDiscount'];
$setData['goodsDiscountUnit'] = $getData['goodsDiscountUnit'];
$getData['goodsDiscountGroupMemberInfo'] = NumberUtils::removeCommaByField($getData['goodsDiscountGroupMemberInfo'], 'goodsDiscount');
$setData['goodsDiscountGroupMemberInfo'] = str_replace('\'', '', json_encode($getData['goodsDiscountGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
 
}else{ //상품 혜택 적용
 
Component/Goods/GoodsBenefit.php+9
변경 전GoodsBenefit.php
use LogHandler;
use Request;
use Exception;
 
/**
* Class 상품 혜택 관리
//특정회원등급 등록시
$arrData['fixedGoodsDiscount'] = @gd_implode(STR_DIVISION, $arrData['fixedGoodsDiscount']);
 
 
 
$arrData['goodsDiscountGroupMemberInfo'] = str_replace('\'', '', json_encode($arrData['goodsDiscountGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
$arrData['exceptBenefit'] = @gd_implode(STR_DIVISION, $arrData['exceptBenefit']);
if (empty($arrData['exceptBenefit']) === true) $arrData['exceptBenefitGroup'] = '';
$configTrunc = gd_policy('basic.trunc');
$goodsConfigTrunc = $configTrunc['goods']; // 상품금액절사
 
 
 
switch ($goodsData['goodsDiscountGroup']) {
case 'group':
$goodsDiscountGroupMemberInfoData = json_decode($goodsData['goodsDiscountGroupMemberInfo'], true);
 
 
$discountKey = gd_array_flip($goodsDiscountGroupMemberInfoData['groupSno'])[$memInfo['groupSno']];
if ($discountKey >= 0) {
 
변경 후GoodsBenefit.php
use LogHandler;
use Request;
use Exception;
use Framework\Utility\NumberUtils;
/**
* Class 상품 혜택 관리
//특정회원등급 등록시
$arrData['fixedGoodsDiscount'] = @gd_implode(STR_DIVISION, $arrData['fixedGoodsDiscount']);
// 할인값의 천 단위 콤마 제거 (미제거 시 할인가 숫자 연산이 깨짐)
$arrData = NumberUtils::removeCommaByField($arrData, 'goodsDiscount');
$arrData['goodsDiscountGroupMemberInfo'] = NumberUtils::removeCommaByField($arrData['goodsDiscountGroupMemberInfo'], 'goodsDiscount');
$arrData['goodsDiscountGroupMemberInfo'] = str_replace('\'', '', json_encode($arrData['goodsDiscountGroupMemberInfo'], JSON_UNESCAPED_UNICODE));
$arrData['exceptBenefit'] = @gd_implode(STR_DIVISION, $arrData['exceptBenefit']);
if (empty($arrData['exceptBenefit']) === true) $arrData['exceptBenefitGroup'] = '';
$configTrunc = gd_policy('basic.trunc');
$goodsConfigTrunc = $configTrunc['goods']; // 상품금액절사
// 콤마가 저장된 기존 할인 데이터 방어를 위해 조회 시점에도 콤마 제거
$goodsData = NumberUtils::removeCommaByField($goodsData, 'goodsDiscount');
switch ($goodsData['goodsDiscountGroup']) {
case 'group':
$goodsDiscountGroupMemberInfoData = json_decode($goodsData['goodsDiscountGroupMemberInfo'], true);
// 콤마가 저장된 기존 할인 데이터 방어를 위해 조회 시점에도 콤마 제거
$goodsDiscountGroupMemberInfoData = NumberUtils::removeCommaByField($goodsDiscountGroupMemberInfoData, 'goodsDiscount');
$discountKey = gd_array_flip($goodsDiscountGroupMemberInfoData['groupSno'])[$memInfo['groupSno']];
if ($discountKey >= 0) {
 
Component/Goods/Goods.php+5-5
변경 전Goods.php
* 상품의 상품할인가 반환
*
* @param array $aGoodsInfo 상품정보
* @return int 상품할인가반환
*/
public function getGoodsDcPrice($aGoodsInfo)
{
// 상품할인금액
$goodsDcPrice = gd_number_figure($tmp['discountByPrice'] * $discountPercent, $tmp['trunc']['unitPrecision'], $tmp['trunc']['unitRound']);
} else {
// 상품할인금액 (정액인 경우 해당 설정된 금액으로)
$goodsDcPrice = $goodsDiscountGroupMemberInfoData['goodsDiscount'][$discountKey];
}
}
break;
$discountPercent = $aGoodsInfo['goodsDiscount'] / 100;
$goodsDcPrice = gd_number_figure($tmp['discountByPrice'] * $discountPercent, $tmp['trunc']['unitPrecision'], $tmp['trunc']['unitRound']);
} else {
// 상품할인금액 (정액인 경우 해당 설정된 금액으로)
$goodsDcPrice = $aGoodsInfo['goodsDiscount'];
}
if ($aGoodsInfo['goodsDiscountGroup'] == 'member' && Session::has('member.memNo') === false) {
$goodsDcPrice = 0;
 
변경 후Goods.php
* 상품의 상품할인가 반환
*
* @param array $aGoodsInfo 상품정보
* @return int|float 상품할인가반환
*/
public function getGoodsDcPrice($aGoodsInfo)
{
// 상품할인금액
$goodsDcPrice = gd_number_figure($tmp['discountByPrice'] * $discountPercent, $tmp['trunc']['unitPrecision'], $tmp['trunc']['unitRound']);
} else {
// 상품할인금액 (정액인 경우 해당 설정된 금액으로, 콤마가 저장된 기존 데이터는 콤마 제거, null 등 숫자가 아닌 값은 0 처리)
$goodsDcPrice = NumberUtils::numberFormatToFloat($goodsDiscountGroupMemberInfoData['goodsDiscount'][$discountKey]) ?: 0;
}
}
break;
$discountPercent = $aGoodsInfo['goodsDiscount'] / 100;
$goodsDcPrice = gd_number_figure($tmp['discountByPrice'] * $discountPercent, $tmp['trunc']['unitPrecision'], $tmp['trunc']['unitRound']);
} else {
// 상품할인금액 (정액인 경우 해당 설정된 금액으로, 콤마가 저장된 기존 데이터는 콤마 제거, null 등 숫자가 아닌 값은 0 처리)
$goodsDcPrice = NumberUtils::numberFormatToFloat($aGoodsInfo['goodsDiscount']) ?: 0;
}
if ($aGoodsInfo['goodsDiscountGroup'] == 'member' && Session::has('member.memNo') === false) {
$goodsDcPrice = 0;
 
유료 보안서버 제공 정책 변경에 따른 연장 기간 수정
Admin/policy/layer_ssl_setting.php+1-1
변경 전layer_ssl_setting.php
<th>보안서버 사용기간</th>
<td>
<?php if ($sslData['sslConfigType'] == 'godo') { ?>
<?= $sslData['sslConfigStartDate'] ?> - <?= $sslData['sslConfigEndDate'] ?>
<p class="notice-danger">보안 인증서가 만료되는 경우, 일정 시간 동안 페이지 접속이 불가할 수 있으니 만료 전 갱신하시기 바랍니다.</p>
<?php } else { ?>
자동연장
 
변경 후layer_ssl_setting.php
<th>보안서버 사용기간</th>
<td>
<?php if ($sslData['sslConfigType'] == 'godo') { ?>
<?= date('Y-m-d H:i:s', strtotime($sslData['sslConfigStartDate'])) ?> - <?= date('Y-m-d H:i:s', strtotime($sslData['sslConfigEndDate'])) ?>
<p class="notice-danger">보안 인증서가 만료되는 경우, 일정 시간 동안 페이지 접속이 불가할 수 있으니 만료 전 갱신하시기 바랍니다.</p>
<?php } else { ?>
자동연장
 
Admin/policy/ssl_setting.php+6-3
변경 전ssl_setting.php
<td class="width-md"><?= $val['status']['statusString']; ?></td>
<?php if (empty($val['ssl'])) { ?>
<td class="width-md"> -</td>
<<?php } elseif ($val['sslConfigType'] === '무료 SSL 보안인증서'){ ?>
<td class="width-md"> 자동연장</td>
<?php } else { ?>
<td class="width-md"><?= substr($val['ssl']['sslConfigEndDate'], 0, -3); ?></td>
<?php } ?>
<td class="width-md">
 
 
 
<button type="button" class="btn btn-white btn-sm js-setting"
data-domain="<?= $val['domain']; ?>" data-no="<?= $val['ssl']['sslConfigNo']; ?>"
data-type="godo">설정
<?php } elseif ($sslData['godo']['shop']['sslConfigType'] === '무료 SSL 보안인증서'){ ?>
<td class="width-md"> 자동연장</td>
<?php } else { ?>
<td class="width-md"><?= substr($sslData['godo']['shop']['ssl']['sslConfigEndDate'], 0, -3); ?></td>
<?php } ?>
<td class="width-md">
<?php if ($sslData['godo']['shop']['sslConfigType'] != '무료 SSL 보안인증서' && $sslData['godo']['shop']['status']['status'] == 'renewrequest') { ?>
 
변경 후ssl_setting.php
<td class="width-md"><?= $val['status']['statusString']; ?></td>
<?php if (empty($val['ssl'])) { ?>
<td class="width-md"> -</td>
<?php } elseif ($val['sslConfigType'] === '무료 SSL 보안인증서'){ ?>
<td class="width-md"> 자동연장</td>
<?php } else { ?>
<td class="width-md"><?= date('Y-m-d H:i:s', strtotime($val['ssl']['sslConfigEndDate'])); ?></td>
<?php } ?>
<td class="width-md">
<?php if ($val['status']['status'] == 'renewrequest' && $val['sslConfigType'] != '무료 SSL 보안인증서') { ?>
<button type="button" class="btn btn-gray btn-sm js-ssl-management" data-type="godo">연장</button>
<?php } ?>
<button type="button" class="btn btn-white btn-sm js-setting"
data-domain="<?= $val['domain']; ?>" data-no="<?= $val['ssl']['sslConfigNo']; ?>"
data-type="godo">설정
<?php } elseif ($sslData['godo']['shop']['sslConfigType'] === '무료 SSL 보안인증서'){ ?>
<td class="width-md"> 자동연장</td>
<?php } else { ?>
<td class="width-md"><?= date('Y-m-d H:i:s', strtotime($sslData['godo']['shop']['ssl']['sslConfigEndDate'])); ?></td>
<?php } ?>
<td class="width-md">
<?php if ($sslData['godo']['shop']['sslConfigType'] != '무료 SSL 보안인증서' && $sslData['godo']['shop']['status']['status'] == 'renewrequest') { ?>
 
Component/SiteLink/SecureSocketLayer.php+1-1
변경 전SecureSocketLayer.php
$eDateCheck = DateTimeUtils::intervalDay($nDate, $sslData['sslConfigEndDate']);
 
$isExpired = ($eDateCheck < 0); // 만료상태
$isRenewRange = ($eDateCheck >= 0 && $eDateCheck <= 33); // 연장신청대기(만료 33일 전 ~ 만료일까지)
$isValidPeriod = ($sDateCheck >= 0 && $eDateCheck >= 0); // 설치완료
if ($isExpired) {
$returnData['status'] = 'request';
 
변경 후SecureSocketLayer.php
$eDateCheck = DateTimeUtils::intervalDay($nDate, $sslData['sslConfigEndDate']);
 
$isExpired = ($eDateCheck < 0); // 만료상태
$isRenewRange = ($eDateCheck >= 0 && $eDateCheck <= 15); // 연장신청대기(만료 15일 전 ~ 만료일까지)
$isValidPeriod = ($sDateCheck >= 0 && $eDateCheck >= 0); // 설치완료
if ($isExpired) {
$returnData['status'] = 'request';
 
연결 인터셉터 처리 방식 개선
Controller/Front/SimpleController.php+2-2
변경 전SimpleController.php
final protected function setUp()
{
parent::setUp();
$interceptors = \App::getConfig('bundle.interceptor')->getFront();
foreach ($interceptors as $index => $interceptor) {
if (gd_count($interceptor[1]) > 0) {
unset($interceptors[$index]);
}
}
 
변경 후SimpleController.php
final protected function setUp()
{
parent::setUp();
$interceptors = $this->getScopedInterceptors('front');
foreach ($interceptors as $index => $interceptor) {
if (!empty($interceptor[1])) {
unset($interceptors[$index]);
}
}
 
Controller/Mobile/SimpleController.php+2-2
변경 전SimpleController.php
final protected function setUp()
{
parent::setUp();
$interceptors = \App::getConfig('bundle.interceptor')->getMobile();
foreach ($interceptors as $index => $interceptor) {
if (gd_count($interceptor[1]) > 0) {
unset($interceptors[$index]);
}
}
 
변경 후SimpleController.php
final protected function setUp()
{
parent::setUp();
$interceptors = $this->getScopedInterceptors('mobile');
foreach ($interceptors as $index => $interceptor) {
if (!empty($interceptor[1])) {
unset($interceptors[$index]);
}
}