변경 파일 목록
총 199개
게시판 스팸방지 히든 필드 추가
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/고도몰 CRM OR 행동조건 도입
layer_select_crm_groups_result.phpAdmin/crm/mobile_send/네이버쇼핑 상품평 평점 컬럼 추가
DbUrl.phpComponent/Worker/NaverDbUrl3.phpComponent/Worker/NaverDbUrl.phpComponent/Worker/웹FTP 파일 목록 파일명 보안 강화
popup_webftp.phpAdmin/share/Webftp.phpComponent/File/PopupWebftpController.phpController/Admin/Share/관리자 답변 게시글 보안 강화
ArticleAdmin.phpComponent/Board/BoardFront.phpComponent/Board/ArticlePsController.phpController/Admin/Board/zip 압축·파일 처리 보안 강화
Webftp.phpComponent/File/SmsSender.phpComponent/Sms/DbUrl.phpComponent/Worker/PopupWebftpController.phpController/Admin/Share/주문·SMS 처리 안정성 개선
OrderNew.phpComponent/Order/Order.phpComponent/Order/OrderGoodsLockSortUtil.phpUtil/Order/아이디찾기 보안 강화
Member.phpComponent/Member/상품 복사 시 이미지 폴더 구조 처리 개선
Storage.phpComponent/Storage/상품 상세페이지 이미지 업로드 안정성 개선
Validator.phpComponent/Validator/관리자 SEO 페이지 로드 안정성 개선
base_seo.phpAdmin/policy/Policy.phpComponent/Policy/BaseSeoController.phpController/Admin/Policy/RssController.phpController/Front/결혼여부 기본값 저장 안정성 개선
_member_view_other.phpAdmin/member/MemberTableField.phpComponent/Database/History.phpComponent/Member/MemberAdmin.phpComponent/Member/MyPage.phpComponent/Member/_join_view_other.htmldata/skin/front/moment/member/_join_view_other.htmldata/skin/front/mygreek/member/_join_view_other.htmldata/skin/front/story_g/member/_join_view_other.htmldata/skin/mobile/moment/member/_join_view_other.htmldata/skin/mobile/mygreek/member/_join_view_other.htmldata/skin/mobile/story_g/member/특정 회원등급 할인 가격 적용 개선
goods_batch_mileage.phpAdmin/goods/goods_benefit_register.phpAdmin/goods/goods_register_option_stock.phpAdmin/goods/goods_register.phpAdmin/goods/GoodsAdmin.phpComponent/Goods/GoodsBenefit.phpComponent/Goods/Goods.phpComponent/Goods/유료 보안서버 제공 정책 변경에 따른 연장 기간 수정
layer_ssl_setting.phpAdmin/policy/ssl_setting.phpAdmin/policy/SecureSocketLayer.phpComponent/SiteLink/변경 파일 코드
추가삭제
변경 전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 | |
변경 전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' : | |
변경 전_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"> | |
변경 전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"> | |
변경 전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"> | |
변경 전_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}"/> | |
변경 전_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"> | |
변경 전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"> | |
변경 전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}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"/><!--{ / }--> | |
변경 전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); | |
변경 전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) { | |
변경 전_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"> | |
변경 전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"> | |
변경 전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"> | |
변경 전_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}"/> | |
변경 전_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"> | |
변경 전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"> | |
변경 전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}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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"> | |
변경 전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}"/><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"/><!--{ / }--> | |
변경 전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); | |
변경 전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) { | |
변경 전_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() }--> | |
변경 전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() }--> | |
변경 전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() }--> | |
변경 전_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}"/> | |
변경 전_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() }--> | |
변경 전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"> | |
변경 전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}--> | |
변경 전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"> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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}"><!--{/}--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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}"><!--{/}--> | |
변경 전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); | |
변경 전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) { | |
변경 전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}"/> | |
변경 전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}"/> | |
변경 전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"> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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 }--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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) { | |
변경 전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}"/> | |
변경 전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}"/> | |
변경 전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"> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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 }--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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) { | |
변경 전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}"/> | |
변경 전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}"> | |
변경 전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"> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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 }--> | |
변경 전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> | |
변경 전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}"><!--{ / }--> | |
변경 전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> | |
변경 전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}"><!--{ / }--> | |
변경 전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> | |
변경 전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 }--> | |
변경 전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}"><!--{ / }--> | |
변경 전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() }--> | |
| {=__('댓글 권한이 없습니다.')} | |
| <!--{:}--> | |
변경 전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) { | |
변경 전layer_select_crm_groups_result.php
| <tbody> | |
| <?php if (!empty($crmGroups)): ?> | |
| <?php foreach ($crmGroups as $crmGroup): ?> | |
| <tr> | |
| <td> | |
| <div class="ncua-align-center"> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input name="crmGroup" type="radio" value="<?= $crmGroup['no'] ?>" data-crm-group-name="<?= $crmGroup['title'] ?>" data-member-count="<?= $crmGroup['memberCount'] ?>" /> | |
| </span> | |
| </label> | |
| </div> | |
| <td> | |
| <div class="crm-group-option"> | |
| <p><?= $crmGroup['title'] ?></p> | |
| <ul> | |
| <li id="crm-group-desc-<?= $crmGroup['no'] ?>" class="ncua-notice-info">그룹 추출 조건 없음</li> | |
| </ul> | |
| </div> | |
| </td> | |
| <td> | |
| <div class="ncua-align-center"><?= $crmGroup['memberCount'] ?></div> | |
| </td> | |
| </tr> | |
| <?php endforeach; ?> | |
| crmGroupsData.forEach(function(group) { | |
| const target = document.getElementById('crm-group-desc-' + group.no); | |
| if (target) { | |
| const description = CrmGroupCondition.getConditionDescription(group.extractCondition); | |
| if (description.length > 0) { | |
| target.innerHTML = description.join("<br />"); | |
| } | |
| } | |
| }); | |
| const firstRadio = document.querySelector('input[name="crmGroup"]'); | |
| if (firstRadio) { | |
| firstRadio.checked = true; | |
| } | |
| document.querySelector('button[name="addCrmGroupButton"]').disabled = !crmGroupsData?.length; | |
| }); | |
| function loadCrmGroupContentsByPage(page) { | |
변경 후layer_select_crm_groups_result.php
| <tbody> | |
| <?php if (!empty($crmGroups)): ?> | |
| <?php foreach ($crmGroups as $crmGroup): ?> | |
| <tr<?= $crmGroup['stopped'] ? ' class="is-disabled"' : '' ?>> | |
| <td> | |
| <div class="ncua-align-center"> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input name="crmGroup" type="radio" value="<?= $crmGroup['no'] ?>" data-crm-group-name="<?= $crmGroup['title'] ?>" data-member-count="<?= $crmGroup['memberCount'] ?>"<?= $crmGroup['stopped'] ? ' disabled' : '' ?> /> | |
| </span> | |
| </label> | |
| </div> | |
| <td> | |
| <div class="crm-group-option"> | |
| <p><?= $crmGroup['title'] ?></p> | |
| <ul id="crm-group-desc-<?= $crmGroup['no'] ?>"> | |
| <li class="ncua-notice-info">그룹 추출 조건 없음</li> | |
| </ul> | |
| </div> | |
| </td> | |
| <td> | |
| <div class="ncua-align-center"><?= $crmGroup['hasValidMemberCount'] ? $crmGroup['memberCount'] : '-' ?></div> | |
| </td> | |
| </tr> | |
| <?php endforeach; ?> | |
| crmGroupsData.forEach(function(group) { | |
| const target = document.getElementById('crm-group-desc-' + group.no); | |
| if (target) { | |
| const descriptionList = (group.conditions || []).reduce(function (textList, condition) { | |
| return textList.concat(CrmGroupCondition.getConditionDescription(condition)); | |
| }, []); | |
| if (descriptionList.length > 0) { | |
| target.innerHTML = ''; | |
| descriptionList.forEach(function (description) { | |
| const item = document.createElement('li'); | |
| item.className = 'ncua-notice-info'; | |
| item.textContent = description; | |
| target.appendChild(item); | |
| }); | |
| } | |
| } | |
| }); | |
| const firstSelectableRadio = document.querySelector('input[name="crmGroup"]:not(:disabled)'); | |
| if (firstSelectableRadio) { | |
| firstSelectableRadio.checked = true; | |
| } | |
| document.querySelector('button[name="addCrmGroupButton"]').disabled = !firstSelectableRadio; | |
| }); | |
| function loadCrmGroupContentsByPage(page) { | |
변경 전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; | |
| } | |
| } | |
변경 전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); // 배송 · 설치비용 | |
변경 전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 | |
| * | |
변경 전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"> | |
| 신청 내역 검색 | |
변경 전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) . "')"); | |
| } | |
| } | |
| } | |
변경 전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, '&') | |
| .replace(/</g, '<') | |
| .replace(/>/g, '>') | |
| .replace(/"/g, '"') | |
| .replace(/'/g, '''); | |
| } | |
| /** | |
| * 검색함수 | |
| */ | |
| $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({ | |
변경 전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); | |
| } | |
변경 전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); | |
변경 전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') { | |
변경 전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; | |
변경 전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); | |
변경 전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); | |
| } | |
변경 전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); | |
| } | |
변경 전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; | |
| } | |
| /** | |
변경 전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) { | |
변경 전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; | |
| } | |
변경 전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 | |
변경 전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') { | |
| $lockBind = []; | |
| $this->db->bind_param_push($lockBind, 'i', $val['sno']); | |
| $this->db->bind_param_push($lockBind, 's', $orderNo); | |
| $lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', $lockBind, false); | |
| $currentOrderStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus']; | |
| if (in_array($val['orderStatus'], ['r3', 'c', 'f'], true) | |
| || in_array($currentOrderStatus, ['r3', 'c', 'f'], true)) { | |
| $changeStatusCheck = false; | |
| if ($changeStatus === 'r3') { | |
변경 전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 잠금조회로 최신 커밋 상태 재조회 (덮어쓰기 방지) | |
| $lockBind = []; | |
| $this->db->bind_param_push($lockBind, 'i', $val['sno']); | |
| $this->db->bind_param_push($lockBind, 's', $orderNo); | |
| $lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', $lockBind, false); | |
| $orderGoodsStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus']; | |
| if ($changeStatus === 'r3') { | |
| $this->setCommonLog( | |
변경 전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; | |
| } | |
변경 전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 { | |
변경 전OrderNew.php
| use Component\Payment\Tosspay\TosspayConfig; | |
| use Component\Present\Order\PresentOrder; | |
| use Component\Present\Cart\PresentCart; | |
| /** | |
| * 주문 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']); | |
변경 후OrderNew.php
| use Component\Payment\Tosspay\TosspayConfig; | |
| use Component\Present\Order\PresentOrder; | |
| use Component\Present\Cart\PresentCart; | |
| 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']); | |
변경 전Order.php
| use Component\RegularDelivery\Notification\RegularDeliveryMailSender; | |
| use Component\RegularDelivery\Notification\RegularDeliverySmsSender; | |
| 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 Component\RegularDelivery\Notification\RegularDeliveryMailSender; | |
| use Component\RegularDelivery\Notification\RegularDeliverySmsSender; | |
| 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']); | |
변경 전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; | |
| } | |
| } | |
변경 전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) { | |
변경 전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; | |
변경 전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; | |
변경 전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> | |
변경 전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'; | |
변경 전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]); | |
| } | |
| // --- 관리자 디자인 템플릿 | |
변경 전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; | |
변경 전_member_view_other.php
| <tr> | |
| <th><div data-tooltip-seq="027">성별</div></th> | |
| <td><div class="ncua-flex-gap"> | |
| <!-- TODO(개발자 확인): '선택안함'(sexFl value="") 신규 추가. checked 하드코딩이라 저장값과 무관하게 항상 선택됨 → $checked['sexFl'] 기반 조건 처리 필요. BE에서 빈 값('') 저장/표시 처리 확인 필요 --> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="sexFl" value="" checked /> | |
| </span> | |
| <span class="ncua-radio-field__text">선택안함</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="sexFl" value="m" <?= $checked['sexFl']['m']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">남자</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="sexFl" value="w" <?= $checked['sexFl']['w']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">여자</span> | |
| </label> | |
| <tr> | |
| <th><div data-tooltip-seq="029">결혼여부</div></th> | |
| <td><div class="ncua-flex-gap"> | |
| <!-- TODO(개발자 확인): '선택안함'(marriFl value="n") 신규 추가. 미혼과 value="n"이 동일해 BE에서 구분 불가 + checked 하드코딩. 선택안함 전용 값/처리 방식 확인 필요 --> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="marriFl" value="n" data-target="input[name=marriDate]" checked /> | |
| </span> | |
| <span class="ncua-radio-field__text">선택안함</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="marriFl" value="n" data-target="input[name=marriDate]" <?= $checked['marriFl']['n']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">미혼</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="marriFl" value="y" data-target="input[name=marriDate]" <?= $checked['marriFl']['y']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">기혼</span> | |
| </label> | |
변경 후_member_view_other.php
| <tr> | |
| <th><div data-tooltip-seq="027">성별</div></th> | |
| <td><div class="ncua-flex-gap"> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="sexFl" value="" <?= $checked['sexFl'][''] ?? ''; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">선택안함</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="sexFl" value="m" <?= $checked['sexFl']['m'] ?? ''; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">남자</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="sexFl" value="w" <?= $checked['sexFl']['w'] ?? ''; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">여자</span> | |
| </label> | |
| <tr> | |
| <th><div data-tooltip-seq="029">결혼여부</div></th> | |
| <td><div class="ncua-flex-gap"> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="marriFl" value="" data-target="input[name=marriDate]" <?= $checked['marriFl'][''] ?? ''; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">선택안함</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="marriFl" value="n" data-target="input[name=marriDate]" <?= $checked['marriFl']['n'] ?? ''; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">미혼</span> | |
| </label> | |
| <label class="ncua-radio-field ncua-radio-field--xs has-text"> | |
| <span class="ncua-radio-input ncua-radio-input--xs ncua-radio-field__input"> | |
| <input type="radio" name="marriFl" value="y" data-target="input[name=marriDate]" <?= $checked['marriFl']['y'] ?? ''; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">기혼</span> | |
| </label> | |
변경 전MemberTableField.php
| [ | |
| 'val' => 'marriFl', | |
| 'typ' => 's', | |
| 'def' => 'n', | |
| ], | |
| // 결혼여부 | |
| [ | |
변경 후MemberTableField.php
| [ | |
| 'val' => 'marriFl', | |
| 'typ' => 's', | |
| 'def' => '', | |
| ], | |
| // 결혼여부 | |
| [ | |
변경 전History.php
| } | |
| if ('marriFl' == $key) { | |
| $displayArray = [ | |
| 'n' => __('미혼'), | |
| 'y' => __('기혼'), | |
| ]; | |
변경 후History.php
| } | |
| if ('marriFl' == $key) { | |
| $displayArray = [ | |
| '' => __('선택안함'), | |
| 'n' => __('미혼'), | |
| 'y' => __('기혼'), | |
| ]; | |
변경 전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'] = ''; | |
| } | |
변경 전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'] = ''; | |
| } | |
변경 전_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> | |
변경 전_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> | |
변경 전_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"> | |
변경 전_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"> | |
변경 전_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"> | |
변경 전_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"> | |
변경 전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); | |
| }); | |
변경 전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> | |
변경 전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); | |
| }); | |
변경 전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); | |
| }); | |
변경 전GoodsAdmin.php
| use Framework\File\FileHandler; | |
| use Framework\ObjectStorage\Service\ImageUploadService; | |
| use Framework\Utility\ArrayUtils; | |
| use Framework\Utility\ProducerUtils; | |
| use Framework\Utility\StringUtils; | |
| use Origin\Service\Marketing\Google\GoogleGoodsFeedService; | |
| $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\File\FileHandler; | |
| use Framework\ObjectStorage\Service\ImageUploadService; | |
| use Framework\Utility\ArrayUtils; | |
| use Framework\Utility\NumberUtils; | |
| use Framework\Utility\ProducerUtils; | |
| use Framework\Utility\StringUtils; | |
| use Origin\Service\Marketing\Google\GoogleGoodsFeedService; | |
| $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{ //상품 혜택 적용 | |
변경 전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) { | |
변경 전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; | |
변경 전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 { ?> | |
| 자동연장 | |
변경 전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') { ?> | |
변경 전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'; | |
변경 전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]); | |
| } | |
| } | |
변경 전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]); | |
| } | |
| } | |