변경 파일 목록
총 59개
Admin (12)
excel_member_up.phpmember/member_detail_search.phpmember/member_joinitem.phpmember/member_modify.phpmember/member_register.phpmember/_member_view_app_device.phpmember/_member_view_business.phpmember/_member_view_history.phpmember/_member_view_other.phpmember/_member_view.phpmember/base_agreement_with_private.phppolicy/member_crm_detail.phpshare/Component (13)
BuyerInformCode.phpAgreement/BuyerInform.phpAgreement/BuyerInformVo.phpAgreement/DBTableField.phpDatabase/MemberTableField.phpDatabase/ExcelMember.phpExcel/History.phpMember/MemberAdmin.phpMember/MemberDAO.phpMember/Member.phpMember/MemberVO.phpMember/MyPage.phpMember/MemberUtil.phpMember/Util/Controller (10)
MemberModifyController.phpAdmin/Member/MemberPsController.phpAdmin/Member/MemberRegisterController.phpAdmin/Member/BaseAgreementWithPrivateController.phpAdmin/Policy/BaseAgreementWithPrivatePsController.phpAdmin/Policy/MemberCrmDetailController.phpAdmin/Share/JoinAgreementController.phpFront/Member/LoginPsController.phpFront/Member/MyPageController.phpFront/Mypage/AgreementController.phpFront/Service/data (24)
join_agreement.htmlskin/front/moment/member/_join_view.htmlskin/front/moment/member/_join_view_other.htmlskin/front/moment/member/my_page.htmlskin/front/moment/mypage/join_agreement.htmlskin/front/mygreek/member/_join_view.htmlskin/front/mygreek/member/_join_view_other.htmlskin/front/mygreek/member/my_page.htmlskin/front/mygreek/mypage/join_agreement.htmlskin/front/story_g/member/_join_view.htmlskin/front/story_g/member/_join_view_other.htmlskin/front/story_g/member/my_page.htmlskin/front/story_g/mypage/join_agreement.htmlskin/mobile/moment/member/_join_view.htmlskin/mobile/moment/member/_join_view_other.htmlskin/mobile/moment/member/my_page.htmlskin/mobile/moment/mypage/join_agreement.htmlskin/mobile/mygreek/member/_join_view.htmlskin/mobile/mygreek/member/_join_view_other.htmlskin/mobile/mygreek/member/my_page.htmlskin/mobile/mygreek/mypage/join_agreement.htmlskin/mobile/story_g/member/_join_view.htmlskin/mobile/story_g/member/_join_view_other.htmlskin/mobile/story_g/member/my_page.htmlskin/mobile/story_g/mypage/변경 파일 코드
추가삭제
변경 전excel_member_up.php
| <div class="notice-info"> | |
| 엑셀업로드 전 회원가입 시 발송 가능한 항목(회원가입, 마일리지 지급, 회원가입 축하 쿠폰)의 발송설정을 확인해주시기 바랍니다. <a href="/crm/auto_send.php" target="_blank" class="btn-link">SMS설정></a> <a href="/crm/mail_config_auto.php" target="_blank" class="btn-link">자동 메일 설정></a> | |
| </div> | |
| </td> | |
| </tr> | |
| </table> | |
변경 후excel_member_up.php
| <div class="notice-info"> | |
| 엑셀업로드 전 회원가입 시 발송 가능한 항목(회원가입, 마일리지 지급, 회원가입 축하 쿠폰)의 발송설정을 확인해주시기 바랍니다. <a href="/crm/auto_send.php" target="_blank" class="btn-link">SMS설정></a> <a href="/crm/mail_config_auto.php" target="_blank" class="btn-link">자동 메일 설정></a> | |
| </div> | |
| <div class="notice-info"> | |
| 마케팅 목적 개인정보 수집 및 이용 항목 업로드 시 반드시 고객으로부터 받은 별도의 개인정보 수집·이용 동의서를 보유하고 계셔야 하며, NHN COMMERCE는 수탁사로서 업로드되는 데이터에 대한 책임을 지지 않습니다. | |
| </div> | |
| </td> | |
| </tr> | |
| </table> | |
변경 전member_detail_search.php
| </td> | |
| </tr> | |
| <tr> | |
| <th>SMS수신동의</th> | |
| <td> | |
| <label class="radio-inline"> | |
| <input type="radio" name="smsFl" | |
변경 후member_detail_search.php
| </td> | |
| </tr> | |
| <tr> | |
| <th>마케팅 목적 개인정보 수집 및 이용 동의</th> | |
| <td colspan="3"> | |
| <label class="radio-inline"> | |
| <input type="radio" name="privateMarketingConsentOptionFl" | |
| value="" <?= gd_isset($checked['privateMarketingConsentOptionFl']['']); ?>/> | |
| 전체 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="privateMarketingConsentOptionFl" | |
| value="y" <?= gd_isset($checked['privateMarketingConsentOptionFl']['y']); ?>/> | |
| 동의 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="privateMarketingConsentOptionFl" | |
| value="n" <?= gd_isset($checked['privateMarketingConsentOptionFl']['n']); ?>/> | |
| 미동의 | |
| </label> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>모바일 메시지 수신동의</th> | |
| <td> | |
| <label class="radio-inline"> | |
| <input type="radio" name="smsFl" | |
변경 전member_joinitem.php
| </tr> | |
| <tr> | |
| <th>이메일</th> | |
| <td> | |
| <?php if ($mall['mallSno'] == 1) { ?> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="email[use]" value="y"/> | |
| <input type="hidden" name="email[require]" value="y"/> | |
| <?php } ?> | |
| </td> | |
| <td> | |
| <label class="checkbox-inline" for="maillingFl"> | |
| <input type="checkbox" id="maillingFl" name="maillingFl[use]" value="y"> | |
| 정보/이벤트 메일 수신 동의 사용 | |
| </label> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>휴대폰번호</th> | |
| <td <?= $mall['mallSno'] == 1 ? '' : 'colspan=2' ?>> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="cellPhone[use]" value="y"/> | |
| 사용 | |
| 필수 | |
| </label> | |
| </td> | |
| <?php if ($mall['mallSno'] == 1) { ?> | |
| <td> | |
| <label class="checkbox-inline" for="smsFl"> | |
| <input type="checkbox" id="smsFl" name="smsFl[use]" value="y"> | |
| 정보/이벤트 SMS 수신 동의 사용 | |
| </label> | |
| </td> | |
| <?php } ?> | |
| </tr> | |
| <?php if ($mall['mallSno'] == 1) { ?> | |
| <tr> | |
| } | |
| }); | |
| $(':checkbox[name="maillingFl[use]"], :checkbox[name="smsFl[use]"]', '#frmSetup').on('change', function (e) { | |
| var $target = $(e.target); | |
| if ($target.prop('checked') === false) { | |
| BootstrapDialog.confirm({ | |
| title: "정보/이벤트 메일(SMS)수신 동의 사용 체크 해제", | |
| message: "정보통신망법에 따라 수신동의한 회원에게만 정보/이벤트 소식을 전송할 수 있습니다. 수신동의 사용을 해제하시겠습니까?", | |
| btnCancelLabel: "취소", | |
| btnOkLabel: "해제", | |
| callback: function (result) { | |
| if (result) { | |
| $target.prop('checked', false); | |
| } else { | |
| $target.prop('checked', true); | |
| } | |
| } | |
| }); | |
| } | |
| }); | |
| $('.expiration_detail').on('click', function () { | |
| var msg = "휴면회원 정책에서 휴면회원 ‘사용함’으로 설정할 경우, 일정 기간 동안 쇼핑몰을 이용하지 않는 회원은 휴면회원으로 전환되어 쇼핑몰의 이용이 제한되고, 쇼핑몰 운영자는 회원에게 정보/이벤트성 안내를 할 수 없습니다."+'<br>'+"- 회원가입 항목에서 개인 정보 유효기간 미사용 시 1년간 쇼핑몰을 이용하지 않는 회원들을 "+'<br>'+" 휴면회원으로 일괄 전환합니다."+'<br>'+"- 개인 정보 유효기간 사용 시 회원에게 ‘휴면회원 방지기간’ 정보를 수집할 수 있으며, 각 회원이 "+'<br>'+" “1년(기본값)/3년/5년/탈퇴 시” 중 선택한 기간 동안 쇼핑몰을 이용하지 않는 경우 해당 회원의"+'<br>'+" 정보를 휴면회원으로 전환합니다."+'<br><div><img src="../admin/gd_share/img/expirationFl_img.png" style="width:80%; height:100%; margin-top:20px; margin-left:50px;"></div>' + | |
| '<br>'+"휴면회원 정책에서 휴면회원 ‘사용 안함’으로 설정할 경우, 각 회원별로 개인정보 유효기간이 만료되더라도 휴면회원으로 전환되지 않으며 계속 쇼핑몰을 이용할 수 있습니다."+'<br>'; | |
변경 후member_joinitem.php
| </tr> | |
| <tr> | |
| <th>이메일</th> | |
| <td colspan="2"> | |
| <?php if ($mall['mallSno'] == 1) { ?> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="email[use]" value="y"/> | |
| <input type="hidden" name="email[require]" value="y"/> | |
| <?php } ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>휴대폰번호</th> | |
| <td colspan="2"> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="cellPhone[use]" value="y"/> | |
| 사용 | |
| 필수 | |
| </label> | |
| </td> | |
| </tr> | |
| <?php if ($mall['mallSno'] == 1) { ?> | |
| <tr> | |
| } | |
| }); | |
| $('.expiration_detail').on('click', function () { | |
| var msg = "휴면회원 정책에서 휴면회원 ‘사용함’으로 설정할 경우, 일정 기간 동안 쇼핑몰을 이용하지 않는 회원은 휴면회원으로 전환되어 쇼핑몰의 이용이 제한되고, 쇼핑몰 운영자는 회원에게 정보/이벤트성 안내를 할 수 없습니다."+'<br>'+"- 회원가입 항목에서 개인 정보 유효기간 미사용 시 1년간 쇼핑몰을 이용하지 않는 회원들을 "+'<br>'+" 휴면회원으로 일괄 전환합니다."+'<br>'+"- 개인 정보 유효기간 사용 시 회원에게 ‘휴면회원 방지기간’ 정보를 수집할 수 있으며, 각 회원이 "+'<br>'+" “1년(기본값)/3년/5년/탈퇴 시” 중 선택한 기간 동안 쇼핑몰을 이용하지 않는 경우 해당 회원의"+'<br>'+" 정보를 휴면회원으로 전환합니다."+'<br><div><img src="../admin/gd_share/img/expirationFl_img.png" style="width:80%; height:100%; margin-top:20px; margin-left:50px;"></div>' + | |
| '<br>'+"휴면회원 정책에서 휴면회원 ‘사용 안함’으로 설정할 경우, 각 회원별로 개인정보 유효기간이 만료되더라도 휴면회원으로 전환되지 않으며 계속 쇼핑몰을 이용할 수 있습니다."+'<br>'; | |
변경 전member_modify.php
| <form id="frm" action="../member/member_ps.php" method="post" enctype="multipart/form-data"> | |
| <div class="page-header js-affix"> | |
| <h3>회원 수정 </h3> | |
| <input type="button" value="저장" class="btn btn-red btn-register"> | |
| </form> | |
| <?php | |
| // 모바일앱 정보 | |
| if ($hasDeviceInfo) { | |
| include('_member_view_app_device.php'); | |
| } | |
| ?> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member.js"></script> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member2.js"></script> | |
| <script type="text/javascript"> | |
| member2.init($('#frm')); | |
| member2.set_my_page(true); | |
| var certificationMaxFileSize = <?= $certificationMaxFileSize ?>; | |
| var join_field = <?= json_encode($joinField) ?>; | |
| </script> | |
변경 후member_modify.php
| <link rel="stylesheet" href="<?= PATH_ADMIN_GD_SHARE ?>ncds/css/member/member-view.css"> | |
| <form id="frm" action="../member/member_ps.php" method="post" enctype="multipart/form-data" class="ncua-content"> | |
| <div class="page-header js-affix"> | |
| <h3>회원 수정 </h3> | |
| <input type="button" value="저장" class="btn btn-red btn-register"> | |
| </form> | |
| <?php | |
| // 모바일앱 정보 | |
| if (!empty($hasDeviceInfo)) { | |
| include('_member_view_app_device.php'); | |
| } | |
| ?> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member.js"></script> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member2.js"></script> | |
| <script defer src="<?=gd_set_browser_cache(PATH_ADMIN_GD_SHARE . 'ncds/script/common/charcount.js')?>"></script> | |
| <script type="text/javascript"> | |
| member2.init($('#frm')); | |
| member2.set_my_page(true); | |
| var certificationMaxFileSize = <?= $certificationMaxFileSize ?>; | |
| var join_field = <?= json_encode($joinField) ?>; | |
| </script> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| const memberPwManager = createCharCountManager({ | |
| targetClasses: ['js-member-pw'], | |
| }); | |
| memberPwManager.init(); | |
| const reMemberPwManager = createCharCountManager({ | |
| targetClasses: ['js-re-member-pw'], | |
| }); | |
| reMemberPwManager.init(); | |
| }); | |
| </script> | |
변경 전member_register.php
| <form id="frm" action="../member/member_ps.php" method="post" enctype="multipart/form-data"> | |
| <div class="page-header js-affix"> | |
| <h3>회원 등록 </h3> | |
| <div class="btn-group"> | |
| <input type="button" value="목록" class="btn btn-white btn-icon-list" onclick="goList('./member_list.php');"/> | |
| <input type="button" value="저장" class="btn btn-red btn-register"> | |
| </div> | |
| </div> | |
| </form> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member.js"></script> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member2.js"></script> | |
| <script type="text/javascript"> | |
| member2.init($('#frm')); | |
| var certificationMaxFileSize = <?= $certificationMaxFileSize ?>; | |
| var join_field = <?= json_encode($joinField) ?>; | |
| </script> | |
변경 후member_register.php
| <link rel="stylesheet" href="<?= PATH_ADMIN_GD_SHARE ?>ncds/css/member/member-view.css"> | |
| <form id="frm" class="ncua-content" action="../member/member_ps.php" method="post" enctype="multipart/form-data"> | |
| <div class="page-header js-affix"> | |
| <h3 class="ncua-help-manual">회원 등록</h3> | |
| <div class="btn-group"> | |
| <input type="button" value="목록" class="btn btn-white" onclick="goList('./member_list.php');"/> | |
| <input type="button" value="저장" class="btn btn-red btn-register"> | |
| </div> | |
| </div> | |
| </form> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member.js"></script> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member2.js"></script> | |
| <script defer src="<?=gd_set_browser_cache(PATH_ADMIN_GD_SHARE . 'ncds/script/common/charcount.js')?>"></script> | |
| <script type="text/javascript"> | |
| member2.init($('#frm')); | |
| var certificationMaxFileSize = <?= $certificationMaxFileSize ?>; | |
| var join_field = <?= json_encode($joinField) ?>; | |
| </script> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| const memberPwManager = createCharCountManager({ | |
| targetClasses: ['js-member-pw'], | |
| }); | |
| memberPwManager.init(); | |
| const reMemberPwManager = createCharCountManager({ | |
| targetClasses: ['js-re-member-pw'], | |
| }); | |
| reMemberPwManager.init(); | |
| }); | |
| </script> | |
| <script type="text/javascript"> | |
| const code = '260713001'; | |
| if (window.GodoCosGuide) { | |
| window.GodoCosGuide.init({ | |
| apiUrl: <?= json_encode($cosGuideApiUrl) ?>, | |
| guideCode: code, | |
| }); | |
| } | |
| </script> | |
변경 전_member_view_app_device.php
| <div class="table-title"> | |
| 모바일앱 정보 | |
| </div> | |
| <div class="form-inline"> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-sm"/> | |
| <col/> | |
| </colgroup> | |
| <tr> | |
| <th>혜택 정보</th> | |
| <td> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-md"/> | |
| <col class="width-md"/> | |
| <col class="width-md"/> | |
| <col/> | |
| </colgroup> | |
| <tr> | |
| <th>앱 설치 혜택</th> | |
| <td><?=$installBenefitReceived;?></td> | |
| <th>최초 로그인 일시</th> | |
| <td> | |
| <?=$firstLoginDateTime;?><br> | |
| <p class="notice-danger notice-info">앱을 접속한 최초 일시입니다.</p> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>앱 알림 혜택</th> | |
| <td><?=$pushBenefitReceived;?></td> | |
| <th>혜택 지급 일시</th> | |
| <td> | |
| <?=$pushBenefitReceivedDateTime?><br> | |
| <p class="notice-danger notice-info">앱에서 알림 혜택이 지급된 일시입니다.</p> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>앱 주문 혜택</th> | |
| <td><?=$firstOrderBenefitReceived;?></td> | |
| <th>최초 주문 일시</th> | |
| <td> | |
| <?=$firstOrderDateTime;?><br> | |
| <p class="notice-danger notice-info">앱에서 결제완료한 최초 일시입니다.</p> | |
| </td> | |
| </tr> | |
| </table> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>접속 정보</th> | |
| <td> | |
| <table class="table table-rows"> | |
| <colgroup> | |
| <col class="width-xs"/> | |
| <col class="width-md"/> | |
| <col class="width-sm"/> | |
| <col class="width-sm"/> | |
| <col class="width-md"/> | |
| <col/> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>운영체제</th> | |
| <th>모바일 기종</th> | |
| <th>최근 로그인 일시</th> | |
| <th>정보성 알림 수신 동의</th> | |
| <th>광고성 알림 수신 동의</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td class="center"><?=$deviceInfos['platform'];?></td> | |
| <td class="center"><?=$deviceInfos['deviceModel'];?></td> | |
| <td class="center"><?=$deviceInfos['latestLoginDateTime'];?></td> | |
| <td class="center"><?=$deviceInfos['isNotificationAgreed'];?></td> | |
| <td class="center"><?=$deviceInfos['isAdNotificationAgreed'];?></td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <p class="notice-danger notice-info">최근 90일내 접속한 디바이스가 표시됩니다.</p> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
변경 후_member_view_app_device.php
| <section class="ncua-block-container ncua-content ncua-member-mobile-device"> | |
| <header class="ncua-block-header"> | |
| <div class="ncua-block-header__row"> | |
| <span class="ncua-block-header__title">모바일앱 정보</span> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <div class="ncua-table ncua-table--vertical"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 120px;"/> | |
| <col/> | |
| </colgroup> | |
| <tr> | |
| <th><div>혜택 정보</div></th> | |
| <td class="ncua-member-mobile-benefit-info"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 120px;"/> | |
| <col /> | |
| <col style="width: 120px;"/> | |
| <col/> | |
| </colgroup> | |
| <tr> | |
| <th><div>앱 설치 혜택</div></th> | |
| <td><div><?=$installBenefitReceived;?></div></td> | |
| <th><div>최초 로그인 일시</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start"> | |
| <?=$firstLoginDateTime;?><br> | |
| <p class="notice-danger notice-info">앱을 접속한 최초 일시입니다.</p> | |
| </div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th><div>앱 알림 혜택</div></th> | |
| <td><div><?=$pushBenefitReceived;?></div></td> | |
| <th><div>혜택 지급 일시</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start"> | |
| <?=$pushBenefitReceivedDateTime?><br> | |
| <p class="notice-danger notice-info">앱에서 알림 혜택이 지급된 일시입니다.</p></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th><div>앱 주문 혜택</div></th> | |
| <td><div><?=$firstOrderBenefitReceived;?></div></td> | |
| <th><div>최초 주문 일시</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start"> | |
| <?=$firstOrderDateTime;?><br> | |
| <p class="notice-danger notice-info">앱에서 결제완료한 최초 일시입니다.</p></div> | |
| </td> | |
| </tr> | |
| </table> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th><div>접속 정보</div></th> | |
| <td class="ncua-member-access-info"> | |
| <div> | |
| <div class="ncua-table ncua-table--horizontal"> | |
| <table> | |
| <thead> | |
| <tr> | |
| <th><div class="ncua-align-center">운영체제</div></th> | |
| <th><div class="ncua-align-center">모바일 기종</div></th> | |
| <th><div class="ncua-align-center">최근 로그인 일시</div></th> | |
| <th><div class="ncua-align-center">정보성 알림 수신 동의</div></th> | |
| <th><div class="ncua-align-center">광고성 알림 수신 동의</div></th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td><div class="ncua-align-center"><?=$deviceInfos['platform'];?></div></td> | |
| <td><div class="ncua-align-center"><?=$deviceInfos['deviceModel'];?></div></td> | |
| <td><div class="ncua-align-center"><?=$deviceInfos['latestLoginDateTime'];?></div></td> | |
| <td><div class="ncua-align-center"><?=$deviceInfos['isNotificationAgreed'];?></div></td> | |
| <td><div class="ncua-align-center"><?=$deviceInfos['isAdNotificationAgreed'];?></div></td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
| <p class="ncua-notice-info">최근 90일내 접속한 디바이스가 표시됩니다.</p> | |
| </div> | |
| </section> | |
변경 전_member_view_business.php
| } ?>">(<?php echo $data['comZipcode']; ?>)</span> | |
| <input type="button" | |
| onclick="postcode_search('comZonecode', 'comAddress', 'comZipcode');" | |
| value="우편번호" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray"/> | |
| <!-- addr2 --> | |
| <div class="ncua-input ncua-input--xs is-disabled ncua-member-addr2"> | |
| <div class="ncua-input__content"> | |
| <div class="table-title div-business gd-help-manual"> | |
| 사업자정보 | |
| </div> | |
| <div class="input_wrap form-inline div-business"> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-sm"/> | |
| <col class="<?=(!empty($widthClass)) ? $widthClass : 'width-3xl'?>"/> | |
| <col class="width-sm"/> | |
| <col class="<?=(!empty($widthClass)) ? $widthClass : ''?>"/> | |
| </colgroup> | |
| <tr> | |
| <th>상호</th> | |
| <td> | |
| <span title="회사명를 입력해주세요!"> | |
| <input type="text" name="company" class="form-control" value="<?= $data['company']; ?>" maxlength="50" data-pattern="gdMemberNmGlobal"/> | |
| </span> | |
| <span id="companyMsg" class="input_error_msg"></span> | |
| </td> | |
| <th>사업자번호</th> | |
| <td> | |
| <span title="사업자번호를 입력해주세요!"> | |
| <input type="text" name="busiNo[]" size="3" maxlength="3" class="form-control js-number" | |
| value="<?= $data['busiNo'][0]; ?>"/> | |
| - | |
| <input type="text" name="busiNo[]" size="2" maxlength="2" class="form-control js-number" | |
| value="<?= $data['busiNo'][1]; ?>"/> | |
| - | |
| <input type="text" name="busiNo[]" size="5" maxlength="5" class="form-control js-number" | |
| value="<?= $data['busiNo'][2]; ?>"/> | |
| <input type="hidden" id="busiNo" name="fullBusiNo" class="error" value="<?= gd_implode('', $data['busiNo']); ?>" data-overlap-businofl="<?= $joinField['busiNo']['overlapBusiNoFl']; ?>" data-charlen="<?= $joinField['busiNo']['charlen']; ?>" data-oldbusino="<?= gd_implode('', $data['busiNo']); ?>"/> | |
| <?php if ($joinField['busiNo']['overlapBusiNoFl'] == 'y') { ?> | |
| <button type="button" id="overlap_busiNo" class="btn btn-gray btn-sm">중복확인</button> | |
| <?php } ?> | |
| <button type="button" id="find_busiNo" class="btn btn-gray btn-sm">사업자번호 조회</button> | |
| </span> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>대표자명</th> | |
| <td class="input_area" colspan="3"> | |
| <span title="대표자를 입력해주세요!"> | |
| <input type="text" name="ceo" class="form-control" value="<?= $data['ceo']; ?>" data-pattern="gdEngKor" maxlength="20"/> | |
| </span> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>업태</th> | |
| <td> | |
| <span title="업태를 입력해주세요!"> | |
| <input type="text" name="service" class="form-control" value="<?= $data['service']; ?>" data-pattern="gdEngKor" maxlength="30"/> | |
| </span> | |
| </td> | |
| <th>종목</th> | |
| <td> | |
| <span title="종목을 입력해주세요!"> | |
| <input type="text" name="item" class="form-control" value="<?= $data['item']; ?>" data-pattern="gdEngKor" maxlength="30"/> | |
| </span> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>사업장 주소</th> | |
| <td class="input_area" colspan="3"> | |
| <div class="form-inline mgb5"> | |
| <span title="우편번호를 입력해주세요!"> | |
| <input type="text" size="7" maxlength="5" name="comZonecode" class="form-control" | |
| value="<?= $data['comZonecode'] ?>"/> | |
| <input type="hidden" name="comZipcode" value="<?= $data['comZipcode'] ?>"/> | |
| <span id="comZipcodeText" class="number <?php if (strlen($data['comZipcode']) != 7) { | |
| echo 'display-none'; | |
| } ?>">(<?php echo $data['comZipcode']; ?>) | |
| </span> | |
| </span> | |
| <input type="button" | |
| onclick="postcode_search('comZonecode', 'comAddress', 'comZipcode');" | |
| value="우편번호찾기" class="btn btn-sm btn-gray"/> | |
| </div> | |
| <div> | |
| <span title="주소를 입력해주세요!"> | |
| <input type="text" name="comAddress" class="form-control width-2xl" | |
| value="<?= $data['comAddress']; ?>"/> | |
| </span> | |
| <span title="상세주소를 입력해주세요!"> | |
| <input type="text" name="comAddressSub" | |
| class="form-control width-2xl" | |
| value="<?= $data['comAddressSub']; ?>"/> | |
| </span> | |
| </div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>사업자등록증</th> | |
| <td class="input_area" colspan="3"> | |
| <?php if (!empty($certification)): ?> | |
| <a href="#" class="js-certification-download" data-url="../member/company_certification.php?mode=download&sno=<?= $certification['sno'] ?>"> | |
| <?= $certification['imageFileNm'] ?> | |
| </a> | |
| <br> | |
| <?php endif; ?> | |
| <div class="form-inline"> | |
| <input type="file" id="companyCertification" name="companyCertification" class="form-control js-cert-file" accept="image/*, application/pdf" data-max-size="<?= $certificationMaxFileSize ?>"/> | |
| <?php if ($mode === 'register'): // 등록 시에만 첨부 취소 버튼 노출 (수정 시 미노출) ?> | |
| <button type="button" class="btn btn-white btn-sm js-cert-file-clear" style="display:none;">- 삭제</button> | |
| <?php endif; ?> | |
| </div> | |
| <div class="notice-info mgt10"> | |
| 파일 업로드 최대 사이즈는 <?= $certificationMaxFileSize ?>MB 입니다.<br> | |
| </div> | |
| <?php if (!empty($certification)): ?> | |
| <span> | |
| <input type="checkbox" name="certificationDeleteSno" class="js-certification-checkbox" value="<?= $certification['sno'] ?>" /> | |
| 업로드된 파일 삭제 .. <?= $certification['imageFileNm'] ?> | |
| <br> | |
| </span> | |
| <?php endif; ?> | |
| </td> | |
| </tr> | |
| <?php | |
| for ($i = 0; $i < $certificationAdditionalFileCount ; $i++) { | |
| $additional = $additionalCertification["comAddiCert$i"] ?? null; | |
| if($additional && $additional['use'] === 'y') { ?> | |
| <tr> | |
| <th><?= $additional['name'] ?></th> | |
| <td class="input_area" colspan="3"> | |
| <?php if (!empty($additional['file'])): ?> | |
| <a href="#" class="js-certification-download" data-url="../member/company_certification.php?mode=download&sno=<?= $additional['file']['sno'] ?>"> | |
| <?= $additional['file']['imageFileNm'] ?> | |
| </a> | |
| <br> | |
| <?php endif; ?> | |
| <div class="form-inline"> | |
| <input type="file" id="comAddiCert[<?= $i ?>][file]" name="comAddiCert[<?= $i ?>][file]" class="form-control js-cert-file" accept="image/*, application/pdf" data-max-size="<?= $additional['certificationFileSize'] ?>"/> | |
| <?php if ($mode === 'register'): // 등록 시에만 첨부 취소 버튼 노출 (수정 시 미노출) ?> | |
| <button type="button" class="btn btn-white btn-sm js-cert-file-clear" style="display:none;">- 삭제</button> | |
| <?php endif; ?> | |
| </div> | |
| <div class="notice-info mgt10"> | |
| 파일 업로드 최대 사이즈는 <?= $additional['certificationFileSize'] ?>MB 입니다.<br> | |
| </div> | |
| <?php if (!empty($additional['file'])): ?> | |
| <span> | |
| <input type="checkbox" name="comAddiCert[<?= $i ?>][DeleteSno]" class="js-certification-checkbox" value="<?= $additional['file']['sno'] ?>" /> | |
| 업로드된 파일 삭제 .. <?= $additional['file']['imageFileNm'] ?> | |
| <br> | |
| </span> | |
| <?php endif; ?> | |
| </td> | |
| </tr> | |
| <?php | |
| } | |
| } ?> | |
| </table> | |
| </div> | |
| <iframe id="downloadFrame" style="display:none;"></iframe> | |
| <script> | |
| $(document).on('click', '.js-certification-download', function(e) { | |
| e.preventDefault(); | |
| var url = $(this).data('url'); | |
| $('#downloadFrame').attr('src', url); | |
| }); | |
| $(document).on('change', '.js-certification-checkbox', function(e) { | |
| var checkbox = this; | |
| if (checkbox.checked) { | |
| // 추가서류(comAddiCert[N][DeleteSno])와 사업자등록증(certificationDeleteSno) 문구 구분 | |
| var message = checkbox.name.indexOf('comAddiCert') === 0 | |
| ? '등록된 첨부파일을 삭제하시겠습니까? 회원정보 최종 저장 시 삭제되며, 복구가 불가능 합니다.' | |
| : '등록된 사업자등록증을 삭제하시겠습니까? 회원정보 최종 저장 시 삭제되며, 복구가 불가합니다.'; | |
| dialog_confirm(message, function(result) { | |
| if (!result) { | |
| checkbox.checked = false; | |
| } | |
| }, '경고'); | |
| } | |
| }); | |
| // 선택 파일 비우기: bootstrap-filestyle 위젯이 적용된 경우 표시 텍스트박스까지 함께 비운다 | |
| function clearCertFile($input) { | |
| if ($input.data('filestyle')) { | |
| $input.filestyle('clear'); | |
| } else { | |
| $input.val(''); | |
| } | |
| } | |
| // 찾아보기로 파일 선택 시 확장자·용량 검사 후 '- 삭제' 버튼 노출, 클릭 시 선택 취소(첨부 제거) | |
| $(document).on('change', '.js-cert-file', function () { | |
| const file = this.files[0]; | |
| if (file) { | |
| const allowedExt = ['pdf', 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']; | |
| const ext = file.name.split('.').pop().toLowerCase(); | |
| if (!allowedExt.includes(ext)) { | |
| clearCertFile($(this)); | |
| dialog_alert('등록이 불가한 파일 형식입니다. 이미지(jpg, jpeg, png, gif, bmp, webp, svg) 및 pdf 파일만 업로드 가능합니다.'); | |
| } else { | |
| const fileMaxSize = parseFloat($(this).data('max-size')) || 2; // MB | |
| const fileSizeMB = file.size / (1024 * 1024); | |
| if (fileSizeMB > fileMaxSize) { | |
| clearCertFile($(this)); | |
| dialog_alert('파일은 최대 ' + fileMaxSize.toString() + 'MB 이하로만 등록 가능합니다.'); | |
| } | |
| } | |
| } | |
| $(this).closest('.form-inline').find('.js-cert-file-clear').toggle(this.files.length > 0); | |
| }); | |
| $(document).on('click', '.js-cert-file-clear', function () { | |
| clearCertFile($(this).closest('.form-inline').find('.js-cert-file')); | |
| $(this).hide(); | |
| }); | |
| </script> | |
변경 후_member_view_business.php
| } ?>">(<?php echo $data['comZipcode']; ?>)</span> | |
| <input type="button" | |
| onclick="postcode_search('comZonecode', 'comAddress', 'comZipcode');" | |
| value="주소찾기" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray"/> | |
| <!-- addr2 --> | |
| <div class="ncua-input ncua-input--xs is-disabled ncua-member-addr2"> | |
| <div class="ncua-input__content"> | |
| <section class="ncua-block-container div-business ncua-member-business"> | |
| <header class="ncua-block-header"> | |
| <div class="ncua-block-header__row"> | |
| <div class="ncua-block-header__title-area"> | |
| <span class="ncua-block-header__title">사업자정보</span> | |
| </div> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <div class="ncua-table ncua-table--vertical"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 240px;"/> | |
| <col /> | |
| </colgroup> | |
| <!-- 상호 --> | |
| <tr> | |
| <th><div>상호</div></th> | |
| <td><div class="ncua-gap-4"> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="company" value="<?= $data['company']; ?>" maxlength="50" data-pattern="gdMemberNmGlobal" title="회사명를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| <span id="companyMsg" class="input_error_msg"></span> | |
| </div></td> | |
| </tr> | |
| <!-- 사업자번호 --> | |
| <tr> | |
| <th><div>사업자번호</div></th> | |
| <td><div class="ncua-flex ncua-align-items-center ncua-gap-4"> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-80"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="busiNo[]" maxlength="3" class="js-number" value="<?= $data['busiNo'][0]; ?>"/> | |
| </div> | |
| </div> | |
| </div> | |
| - | |
| <div class="ncua-input ncua-input--xs ncua-input-width-80"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="busiNo[]" maxlength="2" class="js-number" value="<?= $data['busiNo'][1]; ?>"/> | |
| </div> | |
| </div> | |
| </div> | |
| - | |
| <div class="ncua-input ncua-input--xs ncua-input-width-100"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="busiNo[]" maxlength="5" class="js-number" value="<?= $data['busiNo'][2]; ?>"/> | |
| </div> | |
| </div> | |
| </div> | |
| <input type="hidden" id="busiNo" name="fullBusiNo" class="error" value="<?= gd_implode('', $data['busiNo']); ?>" data-overlap-businofl="<?= $joinField['busiNo']['overlapBusiNoFl']; ?>" data-charlen="<?= $joinField['busiNo']['charlen']; ?>" data-oldbusino="<?= gd_implode('', $data['busiNo']); ?>"/> | |
| <?php if ($joinField['busiNo']['overlapBusiNoFl'] == 'y') { ?> | |
| <button type="button" id="overlap_busiNo" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray">중복확인</button> | |
| <?php } ?> | |
| <button type="button" id="find_busiNo" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray">사업자번호 조회</button> | |
| </div></td> | |
| </tr> | |
| <!-- 대표자명 --> | |
| <tr> | |
| <th><div>대표자명</div></th> | |
| <td><div> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="ceo" value="<?= $data['ceo']; ?>" data-pattern="gdEngKor" maxlength="20" title="대표자를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| </div></td> | |
| </tr> | |
| <!-- 업태 --> | |
| <tr> | |
| <th><div>업태</div></th> | |
| <td><div> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="service" value="<?= $data['service']; ?>" data-pattern="gdEngKor" maxlength="30" title="업태를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| </div></td> | |
| </tr> | |
| <!-- 종목 --> | |
| <tr> | |
| <th><div>종목</div></th> | |
| <td><div> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="item" value="<?= $data['item']; ?>" data-pattern="gdEngKor" maxlength="30" title="종목을 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| </div></td> | |
| </tr> | |
| <!-- 사업장 주소 --> | |
| <tr> | |
| <th><div>사업장 주소</div></th> | |
| <td><div> | |
| <div class="ncua-member-addr"> | |
| <!-- addr1 --> | |
| <div class="ncua-input ncua-input--xs is-disabled ncua-member-addr1"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" maxlength="5" name="comZonecode" value="<?= $data['comZonecode'] ?>" title="우편번호를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| <input type="hidden" name="comZipcode" value="<?= $data['comZipcode'] ?>"/> | |
| <span id="comZipcodeText" class="number <?php if (strlen($data['comZipcode']) != 7) { | |
| echo 'display-none'; | |
| } ?>">(<?php echo $data['comZipcode']; ?>)</span> | |
| <input type="button" | |
| onclick="postcode_search('comZonecode', 'comAddress', 'comZipcode');" | |
| value="우편번호" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray"/> | |
| <!-- addr2 --> | |
| <div class="ncua-input ncua-input--xs is-disabled ncua-member-addr2"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="comAddress" value="<?= $data['comAddress']; ?>" title="주소를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- addr3 --> | |
| <div class="ncua-input ncua-input--xs ncua-member-addr2"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="comAddressSub" value="<?= $data['comAddressSub']; ?>" title="상세주소를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div></td> | |
| </tr> | |
| <!-- 사업자등록증 --> | |
| <tr> | |
| <th><div>사업자등록증</div></th> | |
| <td><div> | |
| <?php if (!empty($certification)): ?> | |
| <a href="#" class="js-certification-download" data-url="../member/company_certification.php?mode=download&sno=<?= $certification['sno'] ?>"> | |
| <?= $certification['imageFileNm'] ?> | |
| </a> | |
| <?php endif; ?> | |
| <div class="member-cert-upload"> | |
| <div id="companyCertificationFileInput"></div> | |
| <input type="file" id="companyCertification" name="companyCertification" accept="image/*, application/pdf" class="no-filestyle" style="display:none"/> | |
| <div id="companyCertificationTags" class="member-cert-files"></div> | |
| </div> | |
| <?php if (!empty($certification)): ?> | |
| <label class="ncua-checkbox-field ncua-checkbox-field--xs has-text"> | |
| <span class="ncua-checkbox-input ncua-checkbox-input--xs ncua-checkbox-field__input"> | |
| <input type="checkbox" name="certificationDeleteSno" class="js-certification-checkbox" value="<?= $certification['sno'] ?>" /> | |
| </span> | |
| <span><span class="ncua-checkbox-field__text">Delete Uploaded File .. <?= $certification['imageFileNm'] ?></span></span> | |
| </label> | |
| <?php endif; ?> | |
| </div></td> | |
| </tr> | |
| <?php | |
| // 추가서류: 사업자등록증과 동일하게 ncua.FileInput 위젯 사용 (행마다 별도 인스턴스) | |
| $addiCertInits = []; | |
| for ($i = 0; $i < $certificationAdditionalFileCount ; $i++) { | |
| $additional = $additionalCertification["comAddiCert$i"] ?? null; | |
| if($additional && $additional['use'] === 'y') { | |
| $addiCertInits[] = ['i' => $i, 'maxSize' => (float)($additional['certificationFileSize'] ?? 2)]; | |
| ?> | |
| <tr> | |
| <th><div><?= $additional['name'] ?></div></th> | |
| <td><div> | |
| <?php if (!empty($additional['file'])): ?> | |
| <a href="#" class="js-certification-download" data-url="../member/company_certification.php?mode=download&sno=<?= $additional['file']['sno'] ?>"> | |
| <?= $additional['file']['imageFileNm'] ?> | |
| </a> | |
| <?php endif; ?> | |
| <div class="member-cert-upload"> | |
| <div id="comAddiCertFileInput_<?= $i ?>"></div> | |
| <input type="file" id="comAddiCertCarrier_<?= $i ?>" name="comAddiCert[<?= $i ?>][file]" accept="image/*, application/pdf" class="no-filestyle" style="display:none"/> | |
| <div id="comAddiCertTags_<?= $i ?>" class="member-cert-files"></div> | |
| </div> | |
| <?php if (!empty($additional['file'])): ?> | |
| <label class="ncua-checkbox-field ncua-checkbox-field--xs has-text"> | |
| <span class="ncua-checkbox-input ncua-checkbox-input--xs ncua-checkbox-field__input"> | |
| <input type="checkbox" name="comAddiCert[<?= $i ?>][DeleteSno]" class="js-certification-checkbox" value="<?= $additional['file']['sno'] ?>" /> | |
| </span> | |
| <span><span class="ncua-checkbox-field__text">업로드된 파일 삭제 .. <?= $additional['file']['imageFileNm'] ?></span></span> | |
| </label> | |
| <?php endif; ?> | |
| </div></td> | |
| </tr> | |
| <?php | |
| } | |
| } ?> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
| <iframe id="downloadFrame" style="display:none;"></iframe> | |
| <script> | |
| $(document).on('click', '.js-certification-download', function(e) { | |
| e.preventDefault(); | |
| var url = $(this).data('url'); | |
| $('#downloadFrame').attr('src', url); | |
| }); | |
| $(document).on('change', '.js-certification-checkbox', function(e) { | |
| var checkbox = this; | |
| if (checkbox.checked) { | |
| // 추가서류(comAddiCert[N][DeleteSno])와 사업자등록증(certificationDeleteSno) 문구 구분 | |
| var message = checkbox.name.indexOf('comAddiCert') === 0 | |
| ? '등록된 첨부파일을 삭제하시겠습니까? 회원정보 최종 저장 시 삭제되며, 복구가 불가능 합니다.' | |
| : '등록된 사업자등록증을 삭제하시겠습니까? 회원정보 최종 저장 시 삭제되며, 복구가 불가합니다.'; | |
| dialog_confirm(message, function(result) { | |
| if (!result) { | |
| checkbox.checked = false; | |
| } | |
| }, '경고'); | |
| } | |
| }); | |
| </script> | |
| <script> | |
| // 사업자등록증/추가서류 공통: ncua.FileInput 위젯 초기화 (파일을 폼 제출용 carrier input에 주입) | |
| function initCertFileInput(opts) { | |
| const tagContainer = document.getElementById(opts.tagsId); | |
| const carrier = document.getElementById(opts.carrierId); | |
| if (!tagContainer || !carrier) { | |
| return; | |
| } | |
| let currentTag = null; | |
| // 선택 파일을 폼 제출용 file input에 주입 (multipart 전송) | |
| const setCarrierFile = function (file) { | |
| const dt = new DataTransfer(); | |
| if (file) { | |
| dt.items.add(file); | |
| } | |
| carrier.files = dt.files; | |
| }; | |
| new ncua.FileInput({ | |
| container: opts.containerId, | |
| buttonLabel: '파일 찾기', | |
| multiple: false, | |
| size: 'xs', | |
| accept: '.pdf,.jpg,.jpeg,.png,.gif,.bmp,.webp,.svg', | |
| maxFileSize: opts.maxSizeMB * 1024 * 1024, | |
| hintItems: ['파일 업로드 최대 사이즈는 ' + opts.maxSizeMB + 'MB 입니다.'], | |
| // 파일 선택 시: (1) carrier input에 주입해 제출 (2) 회색 영역에 파일명 태그 + 썸네일 표시 (단일 파일) | |
| onChange: function (newFiles) { | |
| tagContainer.innerHTML = ''; | |
| currentTag = null; | |
| const file = (newFiles || [])[0]; | |
| setCarrierFile(file); | |
| if (!file) { | |
| return; | |
| } | |
| // 파일명 태그 + 삭제 버튼 | |
| currentTag = new ncua.Tag({ | |
| text: file.name, | |
| size: 'sm', | |
| close: true, | |
| onButtonClick: function () { | |
| tagContainer.innerHTML = ''; | |
| currentTag = null; | |
| setCarrierFile(null); | |
| }, | |
| }); | |
| tagContainer.appendChild(currentTag.getElement()); | |
| // 이미지 파일이면 썸네일 미리보기 | |
| if (file.type && file.type.indexOf('image/') === 0) { | |
| const reader = new FileReader(); | |
| reader.onload = function (ev) { | |
| const img = document.createElement('img'); | |
| img.className = 'member-cert-files__thumb'; | |
| img.src = ev.target.result; | |
| img.alt = file.name; | |
| tagContainer.appendChild(img); | |
| }; | |
| reader.readAsDataURL(file); | |
| } | |
| }, | |
| onFail: function () { | |
| dialog_alert('이미지(jpg, jpeg, png, gif, bmp, webp, svg) 및 pdf 파일만, 최대 ' + opts.maxSizeMB + 'MB 이하로 등록 가능합니다.'); | |
| }, | |
| }); | |
| } | |
| document.addEventListener('DOMContentLoaded', function () { | |
| const certMaxSizeMB = (typeof certificationMaxFileSize !== 'undefined' ? certificationMaxFileSize : 2); | |
| // 사업자등록증 | |
| initCertFileInput({ | |
| containerId: 'companyCertificationFileInput', | |
| carrierId: 'companyCertification', | |
| tagsId: 'companyCertificationTags', | |
| maxSizeMB: certMaxSizeMB, | |
| }); | |
| // 추가서류 (행마다 별도 인스턴스) | |
| var addiCertInits = <?= json_encode($addiCertInits) ?>; | |
| addiCertInits.forEach(function (cfg) { | |
| initCertFileInput({ | |
| containerId: 'comAddiCertFileInput_' + cfg.i, | |
| carrierId: 'comAddiCertCarrier_' + cfg.i, | |
| tagsId: 'comAddiCertTags_' + cfg.i, | |
| maxSizeMB: cfg.maxSize, | |
| }); | |
| }); | |
| }); | |
| </script> | |
변경 전_member_view_history.php
| <form id="frmHistory" method="get"> | |
| <input type="hidden" name="pageNum"/> | |
| <div class="table-title"> | |
| 회원정보 수정이력 | |
| </div> | |
| <div class="table-header"> | |
| <div class="pull-right"> | |
| <div class="form-inline"> | |
| <?= gd_select_box_by_page_view_count(Request::get()->get('pageNum', 10), null, null, ''); ?> | |
| </div> | |
| </div> | |
| </div> | |
| <table class="table table-rows"> | |
| <colgroup> | |
| <col class="width-xs"/> | |
| <col class="width-md"/> | |
| <col class="width-sm"/> | |
| <col class="width-sm"/> | |
| <col class="width-md"/> | |
| <col/> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>번호</th> | |
| <th>변경일자</th> | |
| <th>처리자</th> | |
| <th>IP주소</th> | |
| <th>변경항목</th> | |
| <th>변경내용</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| </tbody> | |
| </table> | |
| <div class="center" id="div-pagination"></div> | |
| </form> | |
| <script type="text/template" id="history-row-template2"> | |
| <% _.each(data, function(item){ %> | |
| <% if(item.updateColumn !== '최종구매일') { %> | |
| <tr class="center"> | |
| <td class="font-num"><%- item.idx %></td> | |
| <td class="font-date"><%- item.regDt %></td> | |
| <td><%- item.processor %><%- item.deleteText %></td> | |
| <td><%- item.processorIp %></td> | |
| <td><%- item.updateColumn %></td> | |
| <% if(item.updateColumn === '비밀번호') { %> | |
| <td><%- item.afterValue %></td> | |
| <% } else { %> | |
| <td><%- item.beforeValue %> > <%- item.afterValue %><% if (typeof(item.displayOtherValue) === 'string') { %><%- item.displayOtherValue %><% } %></br> | |
| <% if(item.otherValue != 'null' && typeof(item.otherValue) === 'string' && item.processor == 'member') { %><%- item.otherValue %><% } %> | |
| <% if(item.memberLifeEventValue != 'null' && typeof(item.memberLifeEventValue) === 'string' && item.updateColumn == '개인정보유효기간' && item.beforeValue !== '999' && item.afterValue === '999') { %><%- item.memberLifeEventValue %><% } %> | |
| </td> | |
| <% } %> | |
| </tr> | |
| <% } %> | |
| <%});%> | |
| </script> | |
| <script id="history-pagination-template2" type="text/template"> | |
| <nav> | |
| <ul class="pagination pagination-sm"> | |
| <% for(var i = page.start; i < page.end; i++) { %> <% if(i === (page.now *1)){ %> | |
| <li class="active"> | |
| <span><%- i %></span> | |
| </li> | |
변경 후_member_view_history.php
| <section class="ncua-content ncua-block-container ncua-member-view-history"> | |
| <header class="ncua-block-header"> | |
| <div class="ncua-block-header__row"> | |
| <span class="ncua-block-header__title">회원정보 수정이력</span> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <div class="ncua-search-result"> | |
| <form id="frmHistory" method="get"> | |
| <input type="hidden" name="pageNum"/> | |
| <div class="ncua-search-result__content"> | |
| <div class="ncua-search-result__actions"> | |
| <div class="ncua-search-result__actions-select"> | |
| <span class="ncua-select ncua-select--xs"> | |
| <span class="ncua-select__content"> | |
| <?= gd_select_box_by_page_view_count(Request::get()->get('pageNum', 10), null, null, 'ncua-select__tag'); ?> | |
| </span> | |
| </span> | |
| </div> | |
| </div> | |
| <div class="ncua-table ncua-table--horizontal"> | |
| <table> | |
| <colgroup> | |
| <col width="80px"/> | |
| <col width="200px"/> | |
| <col width="100px"/> | |
| <col width="100px"/> | |
| <col width="278px"/> | |
| <col width="*"/> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th><div>번호</div></th> | |
| <th><div>변경일자</div></th> | |
| <th><div>처리자</div></th> | |
| <th><div>IP주소</div></th> | |
| <th><div>변경항목</div></th> | |
| <th><div>변경내용</div></th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <div class="ncua-pagination" id="div-pagination"></div> | |
| </form> | |
| </div> | |
| </div> | |
| </section> | |
| <script type="text/template" id="history-row-template2"> | |
| <% var rows = _.filter(data || [], function(item){ return item.updateColumn !== '최종구매일'; }); %> | |
| <% if(rows.length === 0) { %> | |
| <tr> | |
| <td colspan="6" height="50" class="no-data"><div>등록된 게시물이 없습니다.</div></td> | |
| </tr> | |
| <% } %> | |
| <% _.each(rows, function(item){ %> | |
| <tr> | |
| <td><div><%- item.idx %></div></td> | |
| <td><div><%- item.regDt %></div></td> | |
| <td><div><%- item.processor %><%- item.deleteText %></div></td> | |
| <td><div><%- item.processorIp %></div></td> | |
| <td><div><%- item.updateColumn %></div></td> | |
| <% if(item.updateColumn === '비밀번호') { %> | |
| <td><div><%- item.afterValue %></div></td> | |
| <% } else { %> | |
| <td><div><%- item.beforeValue %> > <%- item.afterValue %><% if (typeof(item.displayOtherValue) === 'string') { %><%- item.displayOtherValue %><% } %><br/> | |
| <% if(item.otherValue != 'null' && typeof(item.otherValue) === 'string' && item.processor == 'member') { %><%- item.otherValue %><% } %> | |
| <% if(item.memberLifeEventValue != 'null' && typeof(item.memberLifeEventValue) === 'string' && item.updateColumn == '개인정보유효기간' && item.beforeValue !== '999' && item.afterValue === '999') { %><%- item.memberLifeEventValue %><% } %> | |
| </div></td> | |
| <% } %> | |
| </tr> | |
| <%});%> | |
| </script> | |
| <script id="history-pagination-template2" type="text/template"> | |
| <nav> | |
| <ul class="pagination pagination-sm"> | |
| <% for(var i = page.start; i <= page.end; i++) { %> <% if(i === (page.now *1)){ %> | |
| <li class="active"> | |
| <span><%- i %></span> | |
| </li> | |
변경 전_member_view_other.php
| <div class="table-title gd-help-manual">부가정보</div> | |
| <div class="input_wrap form-inline"> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-sm"/> | |
| <col class="<?= (!empty($widthClass)) ? $widthClass : 'width-3xl' ?>"/> | |
| <col class="width-sm"/> | |
| <col class="<?= (!empty($widthClass)) ? $widthClass : '' ?>"/> | |
| </colgroup> | |
| <tr> | |
| <th>팩스번호</th> | |
| <td> | |
| <span title="팩스번호를 입력해주세요!"> | |
| <input type="text" name="fax" value="<?= $data['fax'] ?>" maxlength="12" class="form-control js-number-only width-md"/> | |
| </span> | |
| </td> | |
| <th>직업</th> | |
| <td class="input_area" colspan="3"> | |
| <?= gd_select_box('job', 'job', $joinField['job']['data'], null, $data['job'], '선택'); ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>성별</th> | |
| <td> | |
| <label class="radio-inline"> | |
| <input type="radio" name="sexFl" value="m" <?= $checked['sexFl']['m']; ?>> | |
| 남자 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="sexFl" value="w" <?= $checked['sexFl']['w']; ?>> | |
| 여자 | |
| </label> | |
| </td> | |
| <th>생일</th> | |
| <td> | |
| <?= gd_select_box( | |
| 'calendarFl', 'calendarFl', [ | |
| 's' => '양력', | |
| 'l' => '음력', | |
| ], null, $data['calendarFl'], '선택' | |
| ); ?> | |
| <span title="생일을 입력해주세요!"> | |
| <input type="text" class="js-datepicker" name="birthDt" | |
| value="<?= $data['birthDt']; ?>"/> | |
| </span> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>결혼여부</th> | |
| <td> | |
| <label class="radio-inline"> | |
| <input type="radio" name="marriFl" value="n" | |
| data-target="input[name=marriDate]" <?= $checked['marriFl']['n']; ?>> | |
| 미혼 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="marriFl" value="y" | |
| data-target="input[name=marriDate]" <?= $checked['marriFl']['y']; ?>> | |
| 기혼 | |
| </label> | |
| </td> | |
| <th>결혼기념일</th> | |
| <td> | |
| <span title="결혼기념일을 입력해주세요!"> | |
| <input type="text" class="js-datepicker" name="marriDate" | |
| value="<?= $data['marriDate']; ?>"/> | |
| </span> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>추천인아이디</th> | |
| <td> | |
| <span id="recomm" title="추천인 아이디를 입력해주세요!"> | |
| <?php if (empty(gd_isset($data['recommId'], ''))) { ?> | |
| <input type="text" name="recommId" id="recommId" class="form-control error" | |
| value="<?= gd_isset($data['recommId'], ''); ?>"/> | |
| <input type="hidden" name="chkRecommendId" value=""/> | |
| <input type="button" id="btnRecommendCheck" value="확인" class="btn btn-gray btn-sm"/> | |
| <?php } else { | |
| echo gd_isset($data['recommId'], ''); | |
| echo '<input type="hidden" name="recommId" value="' . gd_isset($data['recommId']) . '"/>'; | |
| ?> | |
| <?php } ?> | |
| </span> | |
| <span id="recommIdMsg" class="input_error_msg"></span> | |
| </td> | |
| <th>추천받은횟수</th> | |
| <td><?= gd_isset($data['recommendCnt'], '0'); ?>회</td> | |
| </tr> | |
| <tr> | |
| <th>관심분야</th> | |
| <td class="input_area" colspan="3"> | |
| <?= gd_check_box('interest[]', $joinField['interest']['data'], $data['interest'], $checkBoxRow) ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>개인정보유효기간</th> | |
| <td class="input_area" colspan="3"> | |
| <label class="radio-inline"> | |
| <input type="radio" name="expirationFl" value="1" <?= $checked['expirationFl']['1']; ?>> | |
| 1년 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="expirationFl" value="3" <?= $checked['expirationFl']['3']; ?>> | |
| 3년 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="expirationFl" value="5" <?= $checked['expirationFl']['5']; ?>> | |
| 5년 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="expirationFl" value="999" <?= $checked['expirationFl']['999']; ?>> | |
| 탈퇴 시 <?= $data['lifeMemberConversionDt']; ?> | |
| </label> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>남기는 말씀</th> | |
| <td class="input_area" colspan="3"> | |
| <span title="메모를 작성해 주세요!"> | |
| <textarea name="memo" rows="5" cols="" | |
| class="form-control width90p js-maxlength"><?= $data['memo']; ?></textarea> | |
| </span> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
| <?php if (gd_count($joinField['ex']) > 0) { ?> | |
| <div class="table-title gd-help-manual"> | |
| 추가정보 | |
| </div> | |
| <div class="input_wrap form-inline"> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-sm"/> | |
| <col class="<?= (!empty($widthClass)) ? $widthClass : 'width-3xl' ?>"/> | |
| <col class="width-sm"/> | |
| <col class="<?= (!empty($widthClass)) ? $widthClass : '' ?>"/> | |
| </colgroup> | |
| <?= $htmlExtra; ?> | |
| </table> | |
| </div> | |
| <?php } ?> | |
| <div class="table-title gd-help-manual"> | |
| 개인정보 수집·이용 선택동의 내역 | |
| </div> | |
| <div class="form-inline"> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-sm"/> | |
| <col/> | |
| </colgroup> | |
| <tr> | |
| <th>개인정보<br/>수집·이용</th> | |
| <td> | |
| <?php | |
| if (isset($data['privateApprovalOptionFl']) && is_array($data['privateApprovalOptionFl']) && isset($privateApprovalOption)) { | |
| foreach ($privateApprovalOption as $index2 => $item2) { | |
| if($data['privateApprovalOptionFl'][$item2['sno']] == 'y'){ | |
| echo '<div>- ' . $item2['informNm'] . ' : 동의함</div>'; | |
| } elseif ($data['privateApprovalOptionFl'][$item2['sno']] == 'n') { | |
| echo '<div>- ' . $item2['informNm'] . ' : 동의안함</div>'; | |
| } | |
| } | |
| } else { | |
| echo '사용안함'; | |
| } | |
| ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>개인정보 취급위탁</th> | |
| <td> | |
| <?php | |
| if (isset($data['privateConsignFl']) && is_array($data['privateConsignFl']) && isset($privateConsign)) { | |
| foreach ($privateConsign as $index2 => $item2) { | |
| if($data['privateConsignFl'][$item2['sno']] == 'y'){ | |
| echo '<div>- ' . $item2['informNm'] . ' : 동의함</div>'; | |
| } elseif ($data['privateConsignFl'][$item2['sno']] == 'n') { | |
| echo '<div>- ' . $item2['informNm'] . ' : 동의안함</div>'; | |
| } | |
| } | |
| } else { | |
| echo '사용안함'; | |
| } | |
| ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>개인정보<br/>제3자 제공</th> | |
| <td> | |
| <?php | |
| if (isset($data['privateOfferFl']) && is_array($data['privateOfferFl']) && isset($privateOffer)) { | |
| foreach ($privateOffer as $index2 => $item2) { | |
| if($data['privateOfferFl'][$item2['sno']] == 'y'){ | |
| echo '<div>- ' . $item2['informNm'] . ' : 동의함</div>'; | |
| } elseif ($data['privateOfferFl'][$item2['sno']] == 'n') { | |
| echo '<div>- ' . $item2['informNm'] . ' : 동의안함</div>'; | |
| } | |
| } | |
| } else { | |
| echo '사용안함'; | |
| } | |
| ?> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
변경 후_member_view_other.php
| <section class="ncua-block-container"> | |
| <header class="ncua-block-header"> | |
| <div class="ncua-block-header__row"> | |
| <div class="ncua-block-header__title-area"> | |
| <span class="ncua-block-header__title">부가정보</span> | |
| </div> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <div class="ncua-table ncua-table--vertical"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 240px;"/> | |
| <col /> | |
| </colgroup> | |
| <!-- 팩스 번호 --> | |
| <tr> | |
| <th><div data-tooltip-seq="025">팩스번호</div></th> | |
| <td><div> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="fax" value="<?= $data['fax'] ?>" maxlength="12" class="js-number-only" title="팩스번호를 입력해주세요!" placeholder="'-' 없이 입력하세요."/> | |
| </div> | |
| </div> | |
| </div> | |
| </div></td> | |
| </tr> | |
| <!-- 직업 --> | |
| <tr> | |
| <th><div data-tooltip-seq="026">직업</div></th> | |
| <td><div> | |
| <span class="ncua-select ncua-select--xs"> | |
| <span class="ncua-select__content"> | |
| <?= gd_select_box('job', 'job', $joinField['job']['data'], null, $data['job'], '선택', null, 'ncua-select__tag'); ?> | |
| </span> | |
| </span> | |
| </div></td> | |
| </tr> | |
| <!-- 성별 --> | |
| <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> | |
| </div></td> | |
| </tr> | |
| <!-- 생일 --> | |
| <tr> | |
| <th><div data-tooltip-seq="028">생일</div></th> | |
| <td><div class="ncua-flex ncua-align-items-center ncua-gap-8"> | |
| <span class="ncua-select ncua-select--xs"> | |
| <span class="ncua-select__content"> | |
| <?= gd_select_box('calendarFl', 'calendarFl', ['s' => '양력', 'l' => '음력'], null, $data['calendarFl'], '선택', null, 'ncua-select__tag'); ?> | |
| </span> | |
| </span> | |
| <div id="datepicker-birthday-container"></div> | |
| </div></td> | |
| </tr> | |
| <!-- 결혼여부 --> | |
| <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> | |
| </div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="030">결혼기념일</div></th> | |
| <td><div> | |
| <div id="datepicker-marriage-container"></div> | |
| </div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="031">추천인아이디</div></th> | |
| <td><div class="ncua-gap-4"> | |
| <span id="recomm"> | |
| <?php if (empty(gd_isset($data['recommId'], ''))) { ?> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="recommId" id="recommId" class="error" value="<?= gd_isset($data['recommId'], ''); ?>" title="추천인 아이디를 입력해주세요!" placeholder="추천인 아이디를 입력하세요."/> | |
| </div> | |
| </div> | |
| </div> | |
| <input type="hidden" name="chkRecommendId" value=""/> | |
| <button type="button" id="btnRecommendCheck" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray">확인</button> | |
| <?php } else { | |
| echo gd_isset($data['recommId'], ''); | |
| echo '<input type="hidden" name="recommId" value="' . gd_isset($data['recommId']) . '"/>'; | |
| } ?> | |
| </span> | |
| <span id="recommIdMsg" class="input_error_msg"></span> | |
| </div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="032">추천받은횟수</div></th> | |
| <td><div><?= gd_isset($data['recommendCnt'], '0'); ?>회</div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="033">관심분야</div></th> | |
| <td><div class="ncua-flex-gap"> | |
| <?= gd_check_box_ncua('interest[]', $joinField['interest']['data'] ?? [], $data['interest'], $checkBoxRow ?? 0) ?> | |
| </div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="034">개인정보유효기간</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="expirationFl" value="1" <?= $checked['expirationFl']['1']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">1년</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="expirationFl" value="3" <?= $checked['expirationFl']['3']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">3년</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="expirationFl" value="5" <?= $checked['expirationFl']['5']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">5년</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="expirationFl" value="999" <?= $checked['expirationFl']['999']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">탈퇴 시 <?= $data['lifeMemberConversionDt']; ?></span> | |
| </label> | |
| </div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="035">남기는 말씀</div></th> | |
| <td><div> | |
| <div class="ncua-input ncua-input--textarea ncua-input--textarea--xs"> | |
| <textarea class="ncua-input__textarea" name="memo" rows="5" title="메모를 작성해 주세요!" placeholder="내용을 입력하세요."><?= $data['memo']; ?></textarea> | |
| </div> | |
| </div></td> | |
| </tr> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
| <?php if (gd_count($joinField['ex']) > 0) { ?> | |
| <section class="ncua-block-container"> | |
| <header class="ncua-block-header"> | |
| <div class="ncua-block-header__row"> | |
| <div class="ncua-block-header__title-area"> | |
| <span class="ncua-block-header__title">추가정보</span> | |
| </div> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <!-- tr/th/td 행 전체는 makeExtraField(BE) 생성물. 사용 중인 추가정보 항목 1개당 tr 1행(th + td) 출력 --> | |
| <div class="ncua-table ncua-table--vertical"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 240px;"/> | |
| <col /> | |
| </colgroup> | |
| <?= $htmlExtra; ?> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
| <?php } ?> | |
| <section class="ncua-block-container"> | |
| <header class="ncua-block-header"> | |
| <div class="ncua-block-header__row"> | |
| <div class="ncua-block-header__title-area"> | |
| <span class="ncua-block-header__title">개인정보 수집·이용 선택동의 내역</span> | |
| </div> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <div class="ncua-table ncua-table--vertical"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 240px;"/> | |
| <col /> | |
| </colgroup> | |
| <?php foreach (($privateAgreementRows ?? []) as $row): ?> | |
| <tr> | |
| <th> | |
| <div<?= !empty($row['tooltipSeq']) ? ' data-tooltip-seq="' . $row['tooltipSeq'] . '"' : '' ?>><?= $row['title'] ?></div> | |
| </th> | |
| <td> | |
| <?php foreach ($row['lines'] as $line): ?> | |
| <div><?= $line ?></div> | |
| <?php endforeach; ?> | |
| </td> | |
| </tr> | |
| <?php endforeach; ?> | |
| <tr> | |
| <th><div data-tooltip-seq="040">광고성 수신 동의</div></th> | |
| <td> | |
| <?php foreach (($advertisingReceiveLines ?? []) as $line): ?> | |
| <div><?= $line ?></div> | |
| <?php endforeach; ?> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
| <script type="text/javascript"> | |
| document.addEventListener('DOMContentLoaded', function () { | |
| const birthDatePicker = new ncua.DatePicker(document.querySelector('#datepicker-birthday-container'), { | |
| size: 'xs', | |
| datePickerOptions: [{ | |
| element: 'start-date', | |
| attrName: 'birthDt', | |
| options: { | |
| mode: 'single', | |
| static: true, | |
| dateFormat: 'Y-m-d', | |
| clickOpens: true, | |
| allowInvalidPreload: true, | |
| allowInput: true, | |
| locale: 'ko', | |
| }, | |
| }], | |
| }); | |
| <?php if (!empty($data['birthDt'])) { ?> | |
| birthDatePicker.setDate(["<?= $data['birthDt']; ?>"]); | |
| <?php } ?> | |
| const marriageContainer = document.querySelector('#datepicker-marriage-container'); | |
| const marriageDatePicker = new ncua.DatePicker(marriageContainer, { | |
| size: 'xs', | |
| datePickerOptions: [{ | |
| element: 'start-date', | |
| attrName: 'marriDate', | |
| options: { | |
| mode: 'single', | |
| static: true, | |
| dateFormat: 'Y-m-d', | |
| clickOpens: true, | |
| allowInvalidPreload: true, | |
| allowInput: true, | |
| locale: 'ko', | |
| }, | |
| }], | |
| }); | |
| <?php if (!empty($data['marriDate'])) { ?> | |
| marriageDatePicker.setDate(["<?= $data['marriDate']; ?>"]); | |
| <?php } ?> | |
| // 결혼여부(marriFl)에 따라 결혼기념일 datepicker 활성/비활성 (기혼=y일 때만 활성) | |
| const syncMarriageDisabled = function () { | |
| const married = document.querySelector('input[name="marriFl"]:checked'); | |
| const isEnabled = !!(married && married.value === 'y'); | |
| const ncuaDatePicker = marriageContainer.querySelector('.ncua-date-picker'); | |
| document.querySelectorAll('[name="marriDate"]').forEach(function (el) { | |
| el.disabled = !isEnabled; | |
| }); | |
| if (ncuaDatePicker) { | |
| ncuaDatePicker.classList.toggle('ncua-date-picker--disabled', !isEnabled); | |
| } | |
| }; | |
| syncMarriageDisabled(); | |
| document.querySelectorAll('input[name="marriFl"]').forEach(function (el) { | |
| el.addEventListener('change', syncMarriageDisabled); | |
| }); | |
| }); | |
| </script> | |
변경 전_member_view.php
| <div class="table-title gd-help-manual"> | |
| 기본정보 | |
| </div> | |
| <div class="form-inline"> | |
| <table class="table table-cols"> | |
| <colgroup> | |
| <col class="width-sm"/> | |
| <col class="<?= (!empty($widthClass)) ? $widthClass : 'width-3xl' ?>"/> | |
| <col class="width-sm"/> | |
| <col class="<?= (!empty($widthClass)) ? $widthClass : '' ?>"/> | |
| </colgroup> | |
| <tr> | |
| <th>회원구분</th> | |
| <td <?= $data['mallSno'] > 0 ? '' : 'colspan="3"' ?>> | |
| <label class="radio-inline"> | |
| <input type="radio" name="memberFl" value="personal" | |
| data-target=".div-business" <?= $checked['memberFl']['personal']; ?>/> | |
| 개인회원 | |
| </label> | |
| <?php if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { ?> | |
| <label class="radio-inline"> | |
| <input type="radio" name="memberFl" value="business" | |
| data-target=".div-business" <?= $checked['memberFl']['business']; ?>/> | |
| 사업자회원 | |
| </label> | |
| <?php } ?> | |
| </td> | |
| <?php if ($data['mallSno'] > 0) { ?> | |
| <th>상점구분</th> | |
| <td> | |
| <span class="flag flag-16 flag-<?= gd_isset($gGlobal['mallList'][$data['mallSno']]['domainFl'], 'kr'); ?>"></span><?= gd_isset($gGlobal['mallList'][$data['mallSno']]['mallName'], '기준몰'); ?> | |
| </td> | |
| <?php } ?> | |
| </tr> | |
| <tr> | |
| <th>등급</th> | |
| <td> | |
| <?= gd_select_box_by_group_list($data['groupSno'], '등급선택'); ?> | |
| <span id="groupSnoMsg" class="input_error_msg"></span> | |
| <?php if ($mode != 'register') { ?> | |
| <div>수정일: | |
| <span class="font-num"><?= $data['groupModDt']; ?></span> | |
| </div> | |
| <?php } ?> | |
| </td> | |
| <th>승인</th> | |
| <td> | |
| <div class="radio"> | |
| <label class="radio-inline"> | |
| <input type="radio" name="appFl" value="y" <?= $checked['appFl']['y']; ?>/> | |
| 승인 | |
| </label> | |
| <label class="radio-inline"> | |
| <input type="radio" name="appFl" value="n" <?= $checked['appFl']['n']; ?>/> | |
| 미승인 | |
| </label> | |
| </div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th class="require">아이디</th> | |
| <td> | |
| <?php if ($mode == 'register') { ?> | |
| <span title="이용하실 아이디를 입력해주세요!"> | |
| <input type="text" name="memId" id="memId" value="" class="form-control error" data-pattern="gdMemberId"/> | |
| <button type="button" id="overlap_memId" class="btn btn-gray btn-sm">중복확인</button> | |
| </span> | |
| <?php } else { ?> | |
| <input type="hidden" name="memId" id="memId" class="" value="<?= $data['memId'] ?>"/> | |
| <strong><?= $data['memId'] ?></strong> | |
| <?= gd_get_third_party_icon_web_path($data['snsTypeFl']); ?> | |
| <?php if($data['simpleJoinFl'] == 'order') { ?><span class="text-blue">(주문 간단 가입)</span><?php } ?> | |
| <?php if($data['simpleJoinFl'] == 'push') { ?><span class="text-blue">(가입 유도 푸시)</span><?php } ?> | |
| <?php } ?> | |
| </td> | |
| <th>닉네임</th> | |
| <td> | |
| <span title="별명을 입력해주세요!"> | |
| <input type="text" name="nickNm" id="nickNm" value="<?= $data['nickNm'] ?>" | |
| class="form-control width-sm error"> | |
| </span> | |
| <button type="button" id="overlap_nickNm" class="btn btn-gray btn-sm">중복확인</button> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th class="require">이름</th> | |
| <td colspan="<?= $hidePasswordBlock ? 3 : 1 ?>"> | |
| <span title="이름을 입력해주세요!"> | |
| <input type="text" name="memNm" id="memNm" value="<?= $data['memNm'] ?>" | |
| class="form-control width-sm" data-pattern="<?= (($data['mallSno'] > $gGlobal['defaultMallSno'])) ? 'gdEngKor' : 'gdMemberNmGlobal' ?>" maxlength="20"> | |
| </span> | |
| <?php if ($joinField['pronounceName']['use'] == 'y') { ?> | |
| <input type="text" name="pronounceName" id="pronounceName" value="<?= $data['pronounceName'] ?>" | |
| class="form-control width-sm" maxlength="20" placeholder="발음 표시" data-pattern="<?= (($data['mallSno'] > 1)) ? 'gdEngKor' : 'gdMemberNmGlobal' ?>"> | |
| <?php } ?> | |
| </td> | |
| <?php if (!$hidePasswordBlock) : ?> | |
| <th class="require">비밀번호</th> | |
| <td> | |
| <span title="비밀번호를 입력해주세요!"> | |
| <input type="password" name="memPw" value="" class="form-control width-sm js-maxlength" | |
| placeholder="비밀번호입력" maxlength="16"> | |
| | |
| <input type="password" name="memPwRe" value="" class="form-control width-sm js-maxlength" | |
| placeholder="비밀번호확인" maxlength="16" style="margin-left: 40px"> | |
| </span> | |
| <?php | |
| if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { | |
| echo '<p class="notice-danger notice-info">*영문대문자/영문소문자/숫자/특수문자 중 2개 이상 포함, 10~16자리 이하로 설정할 수 있습니다.</p>'; | |
| } else { | |
| if ($joinField['passwordCombineFl'] == 'engNum') { | |
| echo '<p class="notice-danger notice-info">*영문대문자/영문소문자/숫자 중 2개 이상 포함,'; | |
| } elseif ($joinField['passwordCombineFl'] == 'engNumEtc') { | |
| echo '<p class="notice-danger notice-info">*영문대문자/영문소문자/숫자/특수문자 중 3개 이상 포함,'; | |
| } else { | |
| echo '<p class="notice-danger notice-info">*영문대문자/영문소문자 or 숫자,'; | |
| } | |
| echo ' ' . $joinField['memPw']['minlen'] . '~' . $joinField['memPw']['maxlen'] . '자리 이하로 설정할 수 있습니다.</p>'; | |
| } ?> | |
| </td> | |
| <?php endif; ?> | |
| </tr> | |
| <?php if ($mode != 'register') { ?> | |
| <tr> | |
| <th>주문금액</th> | |
| <td colspan="3"><?= gd_currency_display($data['saleAmt']); ?></td> | |
| </tr> | |
| <tr> | |
| <th>마일리지</th> | |
| <td><?= gd_money_format($data['mileage']) . gd_display_mileage_unit() ?></td> | |
| <th>예치금</th> | |
| <td><?= gd_money_format($data['deposit']) . gd_display_deposit('unit') ?></td> | |
| </tr> | |
| <tr> | |
| <th>회원가입일</th> | |
| <td><?= $data['entryDt'] ?></td> | |
| <th>가입경로</th> | |
| <td><?= $data['entryPath'] ?></td> | |
| </tr> | |
| <tr> | |
| <th>최종로그인일</th> | |
| <td><?= $data['lastLoginDt'] ?></td> | |
| <th>방문횟수</th> | |
| <td><?= $data['loginCnt'] ?></td> | |
| </tr> | |
| <tr> | |
| <th>휴면해제일</th> | |
| <td colspan="3"><?= $data['sleepWakeDt']; ?></td> | |
| </tr> | |
| <?php } ?> | |
| <tr> | |
| <th>이메일</th> | |
| <td> | |
| <div class="form-inline mgb5"> | |
| <input type="hidden" name="chkEmail" value=""/> | |
| <span title="이메일을 입력해주세요!"> | |
| <input type="text" id="emailAddress" name="email[]" value="<?= $data['email'][0] ?>" | |
| class="form-control width-sm"> | |
| @ | |
| </span> | |
| <span title="이메일을 입력해주세요!"> | |
| <input type="text" id="emailDomain" name="email[]" value="<?= $data['email'][1] ?>" | |
| class="form-control width-sm error"> | |
| </span> | |
| <?= gd_select_box_by_mail_domain('email_site', 'email_site', null, $data['email'][1], '직접입력'); ?> | |
| <button type="button" id="overlap_email" class="btn btn-gray btn-sm">중복확인</button> | |
| </div> | |
| <div class="form-inline"> | |
| <label class="checkbox-inline"> | |
| <input type="checkbox" name="maillingFl" value="y" data-default="" <?= $checked['maillingFl']['y']; ?>/> | |
| 정보/이벤트 MAIL 수신에 동의합니다. | |
| </label> | |
| </div> | |
| <p class="notice-danger notice-info">*수신동의설정 안내메일의 자동발송여부에 따라 회원정보의 수신동의설정 변경 시 해당 회원에게 안내메일이 자동 발송됩니다.</p> | |
| </td> | |
| <th>이메일<br/>수신동의/거부일</th> | |
| <td> | |
| <?php | |
| $mailLastReceiveAgreementDt = gd_isset($data['lastReceiveAgreementDt']['mail'], $data['entryDt']); | |
| $mailAgreementView = '동의 : ' . $mailLastReceiveAgreementDt; | |
| if (gd_isset($data['lastNotificationDt']['mail'], '-') != '-') { | |
| $mailAgreementView .= '<br/>(수신동의여부 확인메일 발송<br/> : ' . $data['lastNotificationDt']['mail'] . ')'; | |
| } | |
| ?> | |
| <?= $data['maillingFl'] == 'y' ? $mailAgreementView : '거부 : ' . gd_date_format('Y-m-d', $mailLastReceiveAgreementDt); ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>휴대폰번호</th> | |
| <td> | |
| <div class="form-inline mgb5"> | |
| <?php | |
| $cellPhoneCallPrefixAttributes = [ | |
| 'id' => 'cellPhoneCountryCode', | |
| 'name' => 'cellPhoneCountryCode', | |
| ]; | |
| if ($mode != 'register' && $data['mallSno'] != $gGlobal['defaultMallSno']) { | |
| echo gd_select_box_by_call_prefix($cellPhoneCallPrefixAttributes, $data['cellPhoneCountryCode']); | |
| } | |
| ?> | |
| <span title="휴대폰번호를 입력해주세요!"> | |
| <input type="text" name="cellPhone" value="<?= $data['cellPhone'] ?>" maxlength="12" class="form-control js-number-only width-md"/> | |
| </span> | |
| </div> | |
| <?php if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { ?> | |
| <div class="form-inline"> | |
| <span id="cellPhoneMsg" class="input_error_msg"></span> | |
| <label class="checkbox-inline"> | |
| <input type="checkbox" name="smsFl" value="y" <?= $checked['smsFl']['y']; ?>> | |
| 정보/이벤트 SMS 수신에 동의합니다. | |
| </label> | |
| </div> | |
| <p class="notice-danger notice-info">*수신동의설정 안내메일의 자동발송여부에 따라 회원정보의 수신동의설정 변경 시 해당 회원에게 SMS가 자동 발송됩니다.</p> | |
| <?php } ?> | |
| </td> | |
| <th>SMS<br/>수신동의/거부일</th> | |
| <td> | |
| <?php | |
| $smsLastReceiveAgreementDt = gd_isset($data['lastReceiveAgreementDt']['sms'], $data['entryDt']); | |
| $smsAgreementView = '동의 : ' . $smsLastReceiveAgreementDt; | |
| if (gd_isset($data['lastNotificationDt']['sms'], '-') != '-') { | |
| $smsAgreementView .= '<br/>(수신동의여부 확인SMS 발송<br/> : ' . $data['lastNotificationDt']['sms'] . ')'; | |
| } | |
| ?> | |
| <?= $data['smsFl'] == 'y' ? $smsAgreementView : '거부 : ' . gd_date_format('Y-m-d', $smsLastReceiveAgreementDt); ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>주소</th> | |
| <td colspan="3"> | |
| <?php if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { ?> | |
| <div class="form-inline mgb5"> | |
| <span title="우편번호를 입력해주세요!"> | |
| <input type="text" size="6" maxlength="5" name="zonecode" class="form-control js-number" | |
| data-number="5" | |
| value="<?= $data['zonecode'] ?>"/> | |
| <input type="hidden" name="zipcode" value="<?= $data['zipcode'] ?>"/> | |
| <span id="zipcodeText" class="number <?php if (strlen($data['zipcode']) != 7) { | |
| echo 'display-none'; | |
| } ?>">(<?php echo $data['zipcode']; ?>) | |
| </span> | |
| </span> | |
| <input type="button" | |
| onclick="postcode_search('zonecode', 'address', 'zipcode');" | |
| value="우편번호찾기" class="btn btn-gray btn-sm"/> | |
| </div> | |
| <div class="form-inline"> | |
| <span title="주소를 입력해주세요!"> | |
| <input type="text" name="address" id="address" | |
| class="form-control width-2xl" | |
| value="<?= $data['address']; ?>"/> | |
| </span> | |
| <span title="상세주소를 입력해주세요!"> | |
| <input type="text" name="addressSub" id="addressSub" | |
| class="form-control width-2xl" | |
| value="<?= $data['addressSub']; ?>"/> | |
| </span> | |
| </div> | |
| <?php } ?> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>전화번호</th> | |
| <td colspan="3"> | |
| <div class="form-inline"> | |
| <?php | |
| $phoneCallPrefixAttributes = [ | |
| 'id' => 'phoneCountryCode', | |
| 'name' => 'phoneCountryCode', | |
| ]; | |
| if ($mode != 'register' && $data['mallSno'] != $gGlobal['defaultMallSno']) { | |
| gd_select_box_by_call_prefix($phoneCallPrefixAttributes, $data['phoneCountryCode']); | |
| } | |
| ?> | |
| <span title="전화번호를 입력해주세요!"> | |
| <input type="text" name="phone" value="<?= $data['phone'] ?>" maxlength="12" class="form-control js-number-only width-md"/> | |
| </span> | |
| </div> | |
| </td> | |
| </tr> | |
| </table> | |
| </div> | |
변경 후_member_view.php
| <section class="ncua-block-container"> | |
| <header class="ncua-block-header ncua-block-header--is-required"> | |
| <div class="ncua-block-header__row"> | |
| <div class="ncua-block-header__title-area"> | |
| <span class="ncua-block-header__title">기본정보</span> | |
| </div> | |
| <div class="ncua-block-header__action-area"> | |
| <span class="ncua-block-header__required-notice"><span class="ncua-block-header__required-notice--red">* 는 필수 입력</span><span class="ncua-block-header__required-notice--gray"> 항목입니다.</span></span> | |
| </div> | |
| </div> | |
| </header> | |
| <div class="ncua-block-container__body"> | |
| <div class="ncua-table ncua-table--vertical"> | |
| <table> | |
| <colgroup> | |
| <col style="width: 240px;"/> | |
| <col /> | |
| </colgroup> | |
| <!-- 회원구분 --> | |
| <tr> | |
| <th><div data-tooltip-seq="001">회원구분</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="memberFl" value="personal" | |
| data-target=".div-business" <?= $checked['memberFl']['personal']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">개인회원</span> | |
| </label> | |
| <?php if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { ?> | |
| <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="memberFl" value="business" | |
| data-target=".div-business" <?= $checked['memberFl']['business']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">사업자회원</span> | |
| </label> | |
| <?php } ?> | |
| </div></td> | |
| </tr> | |
| <!-- 상점구분 --> | |
| <?php if ($data['mallSno'] > 0) { ?> | |
| <tr> | |
| <th><div>상점구분</div></th> | |
| <td><div class="ncua-gap-8"> | |
| <span class="flag flag-16 flag-<?= gd_isset($gGlobal['mallList'][$data['mallSno']]['domainFl'], 'kr'); ?>"></span><?= gd_isset($gGlobal['mallList'][$data['mallSno']]['mallName'], '기준몰'); ?> | |
| </div></td> | |
| </tr> | |
| <?php } ?> | |
| <!-- 등급 --> | |
| <tr> | |
| <th><div data-tooltip-seq="002">등급</div></th> | |
| <td><div class="ncua-gap-8"> | |
| <span class="ncua-select ncua-select--xs"> | |
| <span class="ncua-select__content"> | |
| <?= gd_select_box('groupSno', 'groupSno', \Component\Member\Group\Util::getGroupName(), null, $data['groupSno'], '등급선택', null, 'ncua-select__tag'); ?> | |
| </span> | |
| </span> | |
| <span id="groupSnoMsg" class="input_error_msg"></span> | |
| <?php if ($mode != 'register') { ?> | |
| <div>수정일: | |
| <span class="font-num"><?= $data['groupModDt']; ?></span> | |
| </div> | |
| <?php } ?> | |
| </div></td> | |
| </tr> | |
| <!-- 승인 --> | |
| <tr> | |
| <th><div data-tooltip-seq="003">승인</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="appFl" value="y" <?= $checked['appFl']['y']; ?>/> | |
| </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="appFl" value="n" <?= $checked['appFl']['n']; ?>/> | |
| </span> | |
| <span class="ncua-radio-field__text">미승인</span> | |
| </label> | |
| </div> | |
| </td> | |
| </tr> | |
| <!-- 아이디 --> | |
| <tr> | |
| <th class="ncua-required"><div data-tooltip-seq="004">아이디</div></th> | |
| <td><div class="ncua-gap-4"> | |
| <?php if ($mode == 'register') { ?> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="memId" id="memId" value="" class="error" data-pattern="gdMemberId" placeholder="영문, 숫자, 특수문자(-),(_),(.),(@), 4~50자"/> | |
| </div> | |
| </div> | |
| </div> | |
| <button type="button" id="overlap_memId" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray">중복확인</button> | |
| <?php } else { ?> | |
| <input type="hidden" name="memId" id="memId" class="" value="<?= $data['memId'] ?>"/> | |
| <strong><?= $data['memId'] ?></strong> | |
| <?= gd_get_third_party_icon_web_path($data['snsTypeFl']); ?> | |
| <?php if($data['simpleJoinFl'] == 'order') { ?><span class="text-blue">(주문 간단 가입)</span><?php } ?> | |
| <?php if($data['simpleJoinFl'] == 'push') { ?><span class="text-blue">(가입 유도 푸시)</span><?php } ?> | |
| <?php } ?> | |
| </div></td> | |
| </tr> | |
| <!-- 닉네임 --> | |
| <tr> | |
| <th><div data-tooltip-seq="005">닉네임</div></th> | |
| <td><div class="ncua-gap-4"> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="nickNm" id="nickNm" value="<?= $data['nickNm'] ?>" class="error" placeholder="닉네임을 입력하세요"> | |
| </div> | |
| </div> | |
| </div> | |
| <button type="button" id="overlap_nickNm" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray">중복확인</button> | |
| </div></td> | |
| </tr> | |
| <!-- 이름 --> | |
| <tr> | |
| <th class="ncua-required"><div data-tooltip-seq="006">이름</div></th> | |
| <td><div> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="memNm" id="memNm" value="<?= $data['memNm'] ?>" data-pattern="<?= (($data['mallSno'] > $gGlobal['defaultMallSno'])) ? 'gdEngKor' : 'gdMemberNmGlobal' ?>" maxlength="20" title="이름을 입력해주세요!" placeholder="이름을 입력하세요."> | |
| </div> | |
| </div> | |
| </div> | |
| <?php if ($joinField['pronounceName']['use'] == 'y') { ?> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-320"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="pronounceName" id="pronounceName" value="<?= $data['pronounceName'] ?>" maxlength="20" placeholder="발음 표시" data-pattern="<?= (($data['mallSno'] > 1)) ? 'gdEngKor' : 'gdMemberNmGlobal' ?>"> | |
| </div> | |
| </div> | |
| </div> | |
| <?php } ?> | |
| </div></td> | |
| </tr> | |
| <!-- 비밀번호 --> | |
| <?php if (!$hidePasswordBlock) : ?> | |
| <tr> | |
| <th class="ncua-required"><div data-tooltip-seq="007">비밀번호</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start ncua-gap-8"> | |
| <div class="ncua-input ncua-input--xs"> | |
| <div class="ncua-input__content-wrap"> | |
| <div class="ncua-input__content ncua-input-width-380"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="password" name="memPw" maxlength="<?php echo $joinField['memPw']['maxlen']; ?>" value="" class="js-member-pw" placeholder="<?= $passwordPlaceholder ?? '' ?>" data-charcount-key="memberPwText"> | |
| </div> </div> | |
| <div class="ncua-input__field-text-count" data-charcount-text="memberPwText"> | |
| <output class="ncua-input__field-text-count-current">0</output> | |
| <span>/<?php echo $joinField['memPw']['maxlen']; ?></span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!-- 비밀번호 확인 --> | |
| <tr> | |
| <th class="ncua-required"><div data-tooltip-seq="008">비밀번호 확인</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start ncua-gap-8"> | |
| <div class="ncua-input ncua-input--xs"> | |
| <div class="ncua-input__content-wrap"> | |
| <div class="ncua-input__content ncua-input-width-380"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="password" name="memPwRe" value="" class="js-re-member-pw" maxlength="<?php echo $joinField['memPw']['maxlen']; ?>" placeholder="<?= $passwordPlaceholder ?? '' ?>" data-charcount-key="reMemberPwText"> | |
| </div> | |
| </div> | |
| <div class="ncua-input__field-text-count" data-charcount-text="reMemberPwText"> | |
| <output class="ncua-input__field-text-count-current">0</output> | |
| <span>/<?php echo $joinField['memPw']['maxlen']; ?></span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <?php endif; ?> | |
| <!-- 주문금액, 마일리지, 예치금, 회원가입일 --> | |
| <?php if ($mode != 'register') { ?> | |
| <tr> | |
| <th><div data-tooltip-seq="017">주문금액</div></th> | |
| <td><div><?= gd_currency_display($data['saleAmt']); ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="018">마일리지</div></th> | |
| <td><div><?= gd_money_format($data['mileage']) . gd_display_mileage_unit() ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="019">예치금</div></th> | |
| <td><div><?= gd_money_format($data['deposit']) . gd_display_deposit('unit') ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="020">회원가입일</div></th> | |
| <td><div><?= $data['entryDt'] ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="021">가입경로</div></th> | |
| <td><div><?= $data['entryPath'] ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="022">최종로그인일</div></th> | |
| <td><div><?= $data['lastLoginDt'] ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="023">방문횟수</div></th> | |
| <td><div><?= $data['loginCnt'] ?></div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="024">휴면해제일</div></th> | |
| <td><div><?= $data['sleepWakeDt']; ?></div></td> | |
| </tr> | |
| <?php } ?> | |
| <!-- 마케팅 목적 개인정보 수집 및 이용 동의 --> | |
| <?php if ($privateMarketingMemberUse): ?> | |
| <tr> | |
| <th><div data-tooltip-seq="009">마케팅 목적 개인정보 수집 및 이용 동의</div></th> | |
| <td><div> | |
| <label class="ncua-checkbox-field ncua-checkbox-field--xs has-text"> | |
| <span class="ncua-checkbox-input ncua-checkbox-input--xs ncua-checkbox-field__input"> | |
| <input type="checkbox" name="privateMarketingConsentOptionFl" value="y" <?= ($mode === 'register') ? 'disabled' : '' ?> <?= $checked['privateMarketingConsentOptionFl']['y']; ?>/> | |
| </span> | |
| <span class="ncua-checkbox-field__text">마케팅 목적 개인정보 수집 및 이용 동의</span> | |
| </label> | |
| </div></td> | |
| </tr> | |
| <tr> | |
| <th><div data-tooltip-seq="010">마케팅 목적 개인정보 수집 및 이용 동의/거부일</div></th> | |
| <td><div> | |
| <?= ($data['privateMarketingConsentOptionFl'] === 'y' ? '동의 : ' : '거부 : ') . ($data['privateMktAgreementDt'] ?? '-') ?> | |
| </div></td> | |
| </tr> | |
| <?php endif; ?> | |
| <!-- 이메일 --> | |
| <tr> | |
| <th><div data-tooltip-seq="011">이메일</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start ncua-gap-4"> | |
| <div class="ncua-flex ncua-gap-4"> | |
| <div class="ncua-flex ncua-align-items-center ncua-gap-8"> | |
| <input type="hidden" name="chkEmail" value=""/> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-150"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" id="emailAddress" name="email[]" value="<?= $data['email'][0] ?>" title="이메일을 입력해주세요!"> | |
| </div> | |
| </div> | |
| </div> | |
| @ | |
| <div class="ncua-input ncua-input--xs ncua-input-width-150"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" id="emailDomain" name="email[]" value="<?= $data['email'][1] ?>" class="error" title="이메일을 입력해주세요!"> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <span class="ncua-select ncua-select--xs"> | |
| <span class="ncua-select__content"> | |
| <?= gd_select_box_by_mail_domain('email_site', 'email_site', null, $data['email'][1], '직접입력', null, 'ncua-select__tag'); ?> | |
| </span> | |
| </span> | |
| <button type="button" id="overlap_email" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray">중복확인</button> | |
| </div> | |
| <div> | |
| <label class="ncua-checkbox-field ncua-checkbox-field--xs has-text"> | |
| <span class="ncua-checkbox-input ncua-checkbox-input--xs ncua-checkbox-field__input"> | |
| <input type="checkbox" name="maillingFl" <?= ($mode === 'register') ? 'disabled' : '' ?> value="y" data-default="" <?= $checked['maillingFl']['y']; ?>/> | |
| </span> | |
| <span class="ncua-checkbox-field__text">마케팅 이메일 수신 동의</span> | |
| </label> | |
| </div> | |
| <p class="ncua-caution-text">수신동의설정 안내메일의 자동발송여부에 따라 회원정보의 수신동의설정 변경 시 해당 회원에게 안내메일이 자동 발송됩니다.</p> | |
| </div> | |
| </td> | |
| </tr> | |
| <!-- 이메일 수신동의/거부일 --> | |
| <tr> | |
| <th><div data-tooltip-seq="012">이메일 수신동의/거부일</div></th> | |
| <td><div class="ncua-flex-column ncua-align-items-start"> | |
| <?php | |
| $mailLastReceiveAgreementDt = gd_isset($data['lastReceiveAgreementDt']['mail'], $data['entryDt']); | |
| $mailAgreementView = '동의 : ' . $mailLastReceiveAgreementDt; | |
| if (gd_isset($data['lastNotificationDt']['mail'], '-') != '-') { | |
| $mailAgreementView .= '<br/>(수신동의여부 확인메일 발송<br/> : ' . $data['lastNotificationDt']['mail'] . ')'; | |
| } | |
| ?> | |
| <?= $data['maillingFl'] == 'y' ? $mailAgreementView : '거부 : ' . $mailLastReceiveAgreementDt; ?> | |
| </div></td> | |
| </tr> | |
| <!-- 휴대폰번호 --> | |
| <tr> | |
| <th><div data-tooltip-seq="013">휴대폰번호</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start ncua-gap-4"> | |
| <div class="ncua-flex ncua-gap-4"> | |
| <?php if ($mode != 'register' && $data['mallSno'] != $gGlobal['defaultMallSno']): ?> | |
| <span class="ncua-select ncua-select--xs"> | |
| <span class="ncua-select__content"> | |
| <select class="ncua-select__tag" id="cellPhoneCountryCode" name="cellPhoneCountryCode"> | |
| <option value="">국가선택</option> | |
| <?php foreach ($callPrefixList as $code => $label): ?> | |
| <option value="<?= gd_htmlspecialchars($code) ?>"<?= $data['cellPhoneCountryCode'] === $code ? ' selected' : '' ?>><?= $label ?></option> | |
| <?php endforeach; ?> | |
| </select> | |
| </span> | |
| </span> | |
| <?php endif; ?> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-150"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="cellPhone" value="<?= $data['cellPhone'] ?>" maxlength="12" class="js-number-only" title="휴대폰번호를 입력해주세요!" placeholder="'-' 없이 입력하세요."/> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <?php if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { ?> | |
| <div class="form-inline"> | |
| <span id="cellPhoneMsg" class="input_error_msg"></span> | |
| <label class="ncua-checkbox-field ncua-checkbox-field--xs has-text"> | |
| <span class="ncua-checkbox-input ncua-checkbox-input--xs ncua-checkbox-field__input"> | |
| <input type="checkbox" <?= ($mode === 'register') ? 'disabled' : '' ?> name="smsFl" value="y" <?= $checked['smsFl']['y']; ?>> | |
| </span> | |
| <span class="ncua-checkbox-field__text">마케팅 모바일 메시지 수신 동의</span> | |
| </label> | |
| </div> | |
| <p class="ncua-caution-text">수신동의설정 안내메일의 자동발송여부에 따라 회원정보의 수신동의설정 변경 시 해당 회원에게 SMS가 자동 발송됩니다.</p> | |
| <?php } ?> | |
| </div> | |
| </td> | |
| </tr> | |
| <!-- 휴대폰번호 수신/거부 --> | |
| <tr> | |
| <th><div data-tooltip-seq="014">휴대폰번호 수신동의/거부일</div></th> | |
| <td><div> | |
| <?php | |
| $smsLastReceiveAgreementDt = gd_isset($data['lastReceiveAgreementDt']['sms'], $data['entryDt']); | |
| $smsAgreementView = '동의 : ' . $smsLastReceiveAgreementDt; | |
| if (gd_isset($data['lastNotificationDt']['sms'], '-') != '-') { | |
| $smsAgreementView .= '<br/>(수신동의여부 확인SMS 발송<br/> : ' . $data['lastNotificationDt']['sms'] . ')'; | |
| } | |
| ?> | |
| <?= $data['smsFl'] == 'y' ? $smsAgreementView : '거부 : ' . $smsLastReceiveAgreementDt; ?> | |
| </div></td> | |
| </tr> | |
| <!-- 주소 --> | |
| <tr> | |
| <th><div data-tooltip-seq="015">주소</div></th> | |
| <td> | |
| <div class="ncua-flex-column ncua-align-items-start"> | |
| <?php if ($data['mallSno'] == $gGlobal['defaultMallSno'] || $mode == 'register') { ?> | |
| <!-- addr 1 --> | |
| <div class="ncua-member-addr"> | |
| <div class="ncua-input ncua-input--xs is-disabled ncua-member-addr1"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input readonly type="text" size="6" maxlength="5" name="zonecode" class="js-number" data-number="5" value="<?= $data['zonecode'] ?>" title="우편번호를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| <input type="hidden" name="zipcode" value="<?= $data['zipcode'] ?>"/> | |
| <span id="zipcodeText" class="number <?php if (strlen($data['zipcode']) != 7) { | |
| echo 'display-none'; | |
| } ?>">(<?php echo $data['zipcode']; ?>) | |
| </span> | |
| <input type="button" | |
| onclick="postcode_search('zonecode', 'address', 'zipcode');" | |
| value="주소찾기" class="ncua-btn ncua-btn--xs ncua-btn--secondary-gray"/> | |
| <!-- addr 2 --> | |
| <div class="ncua-input ncua-input--xs is-disabled ncua-member-addr2"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input readonly type="text" name="address" id="address" value="<?= $data['address']; ?>" title="주소를 입력해주세요!"/> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="ncua-input ncua-input--xs ncua-member-addr3"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="addressSub" id="addressSub" value="<?= $data['addressSub']; ?>" placeholder="상세주소를 입력하세요."/> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- <div class="ncua-flex ncua-flex-column ncua-gap-4"> | |
| </div> --> | |
| <?php } ?> | |
| </div> | |
| </td> | |
| </tr> | |
| <!-- 전화번호 --> | |
| <tr> | |
| <th><div data-tooltip-seq="016">전화번호</div></th> | |
| <td><div> | |
| <div class="form-inline"> | |
| <?php | |
| $phoneCallPrefixAttributes = [ | |
| 'id' => 'phoneCountryCode', | |
| 'name' => 'phoneCountryCode', | |
| ]; | |
| if ($mode != 'register' && $data['mallSno'] != $gGlobal['defaultMallSno']) { | |
| gd_select_box_by_call_prefix($phoneCallPrefixAttributes, $data['phoneCountryCode']); | |
| } | |
| ?> | |
| <div class="ncua-input ncua-input--xs ncua-input-width-150"> | |
| <div class="ncua-input__content"> | |
| <div class="ncua-input__field ncua-input__field--xs"> | |
| <input type="text" name="phone" value="<?= $data['phone'] ?>" maxlength="12" class="js-number-only" placeholder="'-' 없이 입력하세요."/> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div></td> | |
| </tr> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
변경 전base_agreement_with_private.php
| <?= $privateApprovalTableOption ?> | |
| <?= $privateConsignTable ?> | |
| <?= $privateOfferTable ?> | |
| <div class="table-title gd-help-manual mgt10"> | |
| 비회원 대상 동의항목 설정 | |
| </div> | |
| $(document).ready(function () { | |
| var $formSetup = $('#formSetup'); | |
| $.validator.addMethod("year", function (value) { | |
| var valid = moment(value, 'YYYY', true).isValid(); | |
| var checked = $('#agreementModeFlY').prop('checked'); | |
변경 후base_agreement_with_private.php
| <?= $privateApprovalTableOption ?> | |
| <?= $privateConsignTable ?> | |
| <?= $privateOfferTable ?> | |
| <?php if (!empty($privateMarketingMember)): ?> | |
| <table class="table table-cols"> | |
| <caption> | |
| [선택] 마케팅 목적 개인정보 수집 및 이용 동의 | |
| </caption> | |
| <colgroup> | |
| <col class="width-md"/> | |
| <col/> | |
| </colgroup> | |
| <tbody> | |
| <tr> | |
| <th>사용여부</th> | |
| <td> | |
| <label class="radio-inline" for="privateMarketingMemberFlY"> | |
| <input id="privateMarketingMemberFlY" type="radio" name="privateMarketingMemberFl" value="y" <?= $privateMarketingMember['modeFl'] == 'y' ? 'checked=checked' : ''; ?> /> | |
| 사용 | |
| </label> | |
| <label class="radio-inline" for="privateMarketingMemberFlN"> | |
| <input id="privateMarketingMemberFlN" type="radio" name="privateMarketingMemberFl" value="n" <?= $privateMarketingMember['modeFl'] != 'y' ? 'checked=checked' : ''; ?> /> | |
| 사용하지 않음 | |
| </label> | |
| <p class="notice notice-info js-marketing-use-notice">광고성 메시지를 보내려면 아래에 있는 [선택] 광고성 수신 동의 약관도 반드시 함께 사용해야 합니다.</p> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>안내 팝업 노출 여부</th> | |
| <td> | |
| <label class="radio-inline" for="privateMarketingMemberNoticePopupFlY"> | |
| <input id="privateMarketingMemberNoticePopupFlY" type="radio" name="privateMarketingMemberNoticePopupFl" value="y" <?= $privateMarketingMember['noticePopupFl'] == 'y' ? 'checked=checked' : ''; ?> /> | |
| 사용 | |
| </label> | |
| <label class="radio-inline" for="privateMarketingMemberNoticePopupFlN"> | |
| <input id="privateMarketingMemberNoticePopupFlN" type="radio" name="privateMarketingMemberNoticePopupFl" value="n" <?= $privateMarketingMember['noticePopupFl'] != 'y' ? 'checked=checked' : ''; ?> /> | |
| 사용하지 않음 | |
| </label> | |
| <p class="notice notice-info">안내 팝업 노출 여부를 ‘사용’으로 설정 시, 마케팅 목적의 개인정보 수집 및 이용 동의 이력이 없는 회원이 로그인 시 최초 1회에 한하여 팝업 안내가 출력됩니다.</p> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>내용입력</th> | |
| <td> | |
| <input type="text" class="form-control" id="privateMarketingMemberWriteTitle" name="privateMarketingMemberWriteTitle" value="<?= gd_htmlspecialchars($privateMarketingMember['informNm']) ?>"> | |
| <textarea id="privateMarketingMemberWriteWrite" name="privateMarketingMemberWriteWrite" rows="12" class="form-control mgt5"><?= gd_htmlspecialchars($privateMarketingMember['content']) ?></textarea> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <?php endif; ?> | |
| <?php if (!empty($advertisingReceive)): ?> | |
| <table class="table table-cols"> | |
| <caption> | |
| [선택] 광고성 수신 동의 | |
| </caption> | |
| <colgroup> | |
| <col class="width-md"/> | |
| <col/> | |
| </colgroup> | |
| <tbody> | |
| <tr> | |
| <th>사용여부</th> | |
| <td> | |
| <label class="checkbox-inline" for="advertisingReceiveMailFl"> | |
| <input id="advertisingReceiveMailFl" type="checkbox" name="advertisingReceiveMailFl" value="y" <?= $advertisingReceiveMailUse == 'y' ? 'checked="checked"' : '' ?> <?= $joinItemEmailUse == 'y' ? '' : 'disabled="disabled"' ?> /> | |
| 이메일 수신 동의 | |
| </label> | |
| <label class="checkbox-inline" for="advertisingReceiveSmsFl"> | |
| <input id="advertisingReceiveSmsFl" type="checkbox" name="advertisingReceiveSmsFl" value="y" <?= $advertisingReceiveSmsUse == 'y' ? 'checked="checked"' : '' ?> <?= $joinItemCellPhoneUse == 'y' ? '' : 'disabled="disabled"' ?> /> | |
| 모바일 메시지 수신 동의 | |
| </label> | |
| <?php if ($joinItemEmailUse != 'y' || $joinItemCellPhoneUse != 'y'): ?> | |
| <p class="notice notice-info">광고성 수신 동의는 회원가입 항목에서 이메일/휴대폰번호를 사용 중일 때만 설정 가능합니다.</p> | |
| <?php endif; ?> | |
| <p class="mgt5"> | |
| 이메일 : <?php if ($joinItemEmailUse == 'y'): ?>사용 | |
| <?php else: ?>사용 안 함 <a href="../member/member_joinitem.php" class="btn-link-underline" target="_blank">설정 바로가기></a><?php endif; ?><br/> | |
| 휴대폰번호 : <?php if ($joinItemCellPhoneUse == 'y'): ?>사용<?php else: ?>사용 안 함 <a href="../member/member_joinitem.php" class="btn-link-underline" target="_blank">설정 바로가기></a><?php endif; ?> | |
| </p> | |
| </td> | |
| </tr> | |
| <tr> | |
| <th>내용입력</th> | |
| <td> | |
| <input type="text" class="form-control" id="advertisingReceiveWriteTitle" name="advertisingReceiveWriteTitle" value="<?= gd_htmlspecialchars($advertisingReceive['informNm']) ?>"> | |
| <textarea id="advertisingReceiveWriteWrite" name="advertisingReceiveWriteWrite" rows="12" class="form-control mgt5"><?= gd_htmlspecialchars($advertisingReceive['content']) ?></textarea> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <?php endif; ?> | |
| <div class="table-title gd-help-manual mgt10"> | |
| 비회원 대상 동의항목 설정 | |
| </div> | |
| $(document).ready(function () { | |
| var $formSetup = $('#formSetup'); | |
| // 안내 팝업 노출 여부 비활성화 + 광고성 수신 동의 관련 안내 문구 숨김 | |
| const toggleMarketingNoticePopup = function () { | |
| const isUse = $('input[name=privateMarketingMemberFl]:checked').val() === 'y'; | |
| $('input[name=privateMarketingMemberNoticePopupFl]').prop('disabled', !isUse); | |
| $('.js-marketing-use-notice').toggle(isUse); | |
| }; | |
| $formSetup.on('change', 'input[name=privateMarketingMemberFl]', toggleMarketingNoticePopup); | |
| toggleMarketingNoticePopup(); | |
| $.validator.addMethod("year", function (value) { | |
| var valid = moment(value, 'YYYY', true).isValid(); | |
| var checked = $('#agreementModeFlY').prop('checked'); | |
변경 전member_crm_detail.php
| $checkBoxRow = 6; | |
| } | |
| ?> | |
| <form id="frm" action="../member/member_ps.php" method="post"> | |
| <input type="hidden" name="mode" id="mode" value="<?= $mode ?>"/> | |
| <input type="hidden" name="memNo" id="memNo" value="<?= $data['memNo'] ?>"/> | |
| <?php include gd_admin_skin_path("member/_member_view.php"); ?> | |
| <?php include "/../member/_member_view_history.php"; ?> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member.js"></script> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member2.js"></script> | |
| <script type="text/javascript"> | |
| $('#emailDomain').removeClass('error'); | |
| $('#nickNm').removeClass('error'); | |
| var certificationMaxFileSize = <?= $certificationMaxFileSize ?>; | |
| var join_field = <?= json_encode($joinField) ?>; | |
| </script> | |
변경 후member_crm_detail.php
| $checkBoxRow = 6; | |
| } | |
| ?> | |
| <link rel="stylesheet" href="<?= PATH_ADMIN_GD_SHARE ?>ncds/css/member/member-view.css"> | |
| <form id="frm" class="ncua-content" action="../member/member_ps.php" method="post"> | |
| <input type="hidden" name="mode" id="mode" value="<?= $mode ?>"/> | |
| <input type="hidden" name="memNo" id="memNo" value="<?= $data['memNo'] ?>"/> | |
| <?php include gd_admin_skin_path("member/_member_view.php"); ?> | |
| <?php include "/../member/_member_view_history.php"; ?> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member.js"></script> | |
| <script type="text/javascript" src="<?= PATH_ADMIN_GD_SHARE ?>script/member2.js"></script> | |
| <script defer src="<?=gd_set_browser_cache(PATH_ADMIN_GD_SHARE . 'ncds/script/common/charcount.js')?>"></script> | |
| <script type="text/javascript"> | |
| $('#emailDomain').removeClass('error'); | |
| $('#nickNm').removeClass('error'); | |
| var certificationMaxFileSize = <?= $certificationMaxFileSize ?>; | |
| var join_field = <?= json_encode($joinField) ?>; | |
| </script> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| const memberPwManager = createCharCountManager({ | |
| targetClasses: ['js-member-pw'], | |
| }); | |
| memberPwManager.init(); | |
| const reMemberPwManager = createCharCountManager({ | |
| targetClasses: ['js-re-member-pw'], | |
| }); | |
| reMemberPwManager.init(); | |
| }); | |
| </script> | |
변경 전BuyerInformCode.php
| const PRIVATE_MEMBER_AUTO_APPROVAL_CONSENT = '991013'; | |
| /** 마케팅 활용을 위한 개인정보 수집 · 이용 동의 (비회원 주문 시) */ | |
| const PRIVATE_MARKETING = '001011'; | |
| /** 이용안내 */ | |
| const BASE_GUIDE = '006001'; | |
| /** 탈퇴안내 */ | |
| case self::PRIVATE_MARKETING: | |
| $this->initPrivateMarketing(); | |
| break; | |
| } | |
| } | |
| $this->_groupCd = '001'; | |
| } | |
| /** | |
| * 멤버 변수를 배열로 반환하는 함수 | |
| * | |
변경 후BuyerInformCode.php
| const PRIVATE_MEMBER_AUTO_APPROVAL_CONSENT = '991013'; | |
| /** 마케팅 활용을 위한 개인정보 수집 · 이용 동의 (비회원 주문 시) */ | |
| const PRIVATE_MARKETING = '001011'; | |
| /** 마케팅 목적 개인정보 수집 및 이용 동의 */ | |
| const PRIVATE_MARKETING_MEMBER = '001015'; | |
| /** 광고성 수신 동의 */ | |
| const ADVERTISING_RECEIVE = '001016'; | |
| /** 이용안내 */ | |
| const BASE_GUIDE = '006001'; | |
| /** 탈퇴안내 */ | |
| case self::PRIVATE_MARKETING: | |
| $this->initPrivateMarketing(); | |
| break; | |
| case self::PRIVATE_MARKETING_MEMBER: | |
| $this->initPrivateMarketingMember(); | |
| break; | |
| case self::ADVERTISING_RECEIVE: | |
| $this->initAdvertisingReceive(); | |
| break; | |
| } | |
| } | |
| $this->_groupCd = '001'; | |
| } | |
| /** | |
| * 멤버 변수에 마케팅 목적 개인정보 수집 및 이용 동의 관련 데이터베이스 조회 데이터 설정 | |
| * | |
| * @return void | |
| */ | |
| public function initPrivateMarketingMember() | |
| { | |
| $this->_informCd = self::PRIVATE_MARKETING_MEMBER; | |
| $this->_informNm = __('마케팅 목적 개인정보 수집 및 이용 동의'); | |
| $this->_groupCd = '001'; | |
| } | |
| /** | |
| * 멤버 변수에 광고성 수신 동의 관련 데이터베이스 조회 데이터 설정 | |
| * | |
| * @return void | |
| */ | |
| public function initAdvertisingReceive(): void | |
| { | |
| $this->_informCd = self::ADVERTISING_RECEIVE; | |
| $this->_informNm = __('광고성 수신 동의'); | |
| $this->_groupCd = '001'; | |
| } | |
| /** | |
| * 멤버 변수를 배열로 반환하는 함수 | |
| * | |
변경 전BuyerInform.php
| return $inform; | |
| } | |
| /** | |
| * 사용자 정의 이용약관 데이터 반환 함수 | |
| * | |
| if (empty($vo->getInformNm())) { | |
| $excludeField .= ',informNm'; | |
| } | |
| // 테이블명 반환 | |
| $tableName = $this->mall->getTableName(DB_BUYER_INFORM, $this->saveMallSno); | |
| $this->db->set_insert_db($tableName, $arrBind['param'], $arrBind['bind'], 'y'); | |
| } | |
| /** | |
| * 기본정책 약관, 개인정보관련 동의사항, 이용, 탈퇴 안내 저장 함수 | |
| * | |
| $vo->setModeFl(gd_isset($postValue['privateMarketingFl'], 'n')); | |
| } | |
| $strSQL = "SELECT sno, displayShopFl FROM " . $tableName . " WHERE informCd='" . $code . "'"; | |
| if ($mallSno > DEFAULT_MALL_NUMBER) { | |
| $strSQL .= " AND mallSno='" . $mallSno . "'"; | |
변경 후BuyerInform.php
| return $inform; | |
| } | |
| /** | |
| * 광고성 수신 동의 정보 반환 - 단일 배열 (상점명 치환코드 {rc_mallNm} 적용) | |
| * | |
| * @param int $mallSno | |
| * | |
| * @return array | |
| * @throws Exception | |
| */ | |
| public function getAdvertisingReceiveContentWithReplaceCode(int $mallSno = DEFAULT_MALL_NUMBER): array | |
| { | |
| /** @var \Bundle\Component\Design\ReplaceCode $replaceCode */ | |
| $replaceCode = App::load('\\Component\\Design\\ReplaceCode'); | |
| $replaceCode->initWithUnsetDiff( | |
| [ | |
| '{rc_mallNm}', | |
| ] | |
| ); | |
| $mallInfo = array_map(function ($value) { | |
| return $value['val']; | |
| }, $replaceCode->getDefinedCode()); | |
| $inform = $this->getInformData(BuyerInformCode::ADVERTISING_RECEIVE, $mallSno); | |
| if (!empty($inform['content'])) { | |
| $inform['content'] = str_replace(array_keys($mallInfo), array_values($mallInfo), $inform['content']); | |
| } | |
| return $inform; | |
| } | |
| /** | |
| * 사용자 정의 이용약관 데이터 반환 함수 | |
| * | |
| if (empty($vo->getInformNm())) { | |
| $excludeField .= ',informNm'; | |
| } | |
| // [선택] 마케팅 목적 개인정보 수집 및 이용 동의 / 광고성 수신 동의는 본문을 공백으로 저장하면 기존 내용 유지 | |
| if (in_array($vo->getInformCd(), [BuyerInformCode::PRIVATE_MARKETING_MEMBER, BuyerInformCode::ADVERTISING_RECEIVE], true) && empty($vo->getContent())) { | |
| $excludeField .= ',content'; | |
| } | |
| // 테이블명 반환 | |
| $tableName = $this->mall->getTableName(DB_BUYER_INFORM, $this->saveMallSno); | |
| $this->db->set_insert_db($tableName, $arrBind['param'], $arrBind['bind'], 'y'); | |
| } | |
| /** | |
| * 광고성 수신 동의 채널(이메일/모바일) 저장값 확정. | |
| * 가입항목(joinitem) 미사용 채널은 체크박스가 disabled 로 출력되어 POST 에 실리지 않으므로 이전 es_config 값을 보존한다. | |
| * es_config(member.advertisingReceive) 저장과 es_buyerInform modeFl 파생이 동일 결과를 쓰도록 단일화한다. | |
| * | |
| * @param array $post 저장 요청 POST 배열 (advertisingReceiveMailFl / advertisingReceiveSmsFl 포함 가능) | |
| * @param int $mallSno | |
| * | |
| * @return array ['email' => ['use' => 'y'|'n'], 'mobile' => ['use' => 'y'|'n']] | |
| */ | |
| public function resolveAdvertisingReceiveChannels(array $post, int $mallSno = DEFAULT_MALL_NUMBER): array | |
| { | |
| $joinItem = gd_policy('member.joinitem', $mallSno); | |
| $prevAdvertisingReceive = gd_policy('member.advertisingReceive', $mallSno); | |
| return [ | |
| 'email' => ['use' => ($joinItem['email']['use'] ?? 'n') === 'y' | |
| ? gd_isset($post['advertisingReceiveMailFl'], 'n') | |
| : ($prevAdvertisingReceive['email']['use'] ?? 'n')], | |
| 'mobile' => ['use' => ($joinItem['cellPhone']['use'] ?? 'n') === 'y' | |
| ? gd_isset($post['advertisingReceiveSmsFl'], 'n') | |
| : ($prevAdvertisingReceive['mobile']['use'] ?? 'n')], | |
| ]; | |
| } | |
| /** | |
| * 광고성 수신 동의 채널(이메일/모바일)의 프론트 노출 여부. | |
| * 노출 조건 = 가입항목(joinitem) 사용 AND 광고성 수신 동의(es_config) 사용. (가입항목 선검사 강제 → 호출부 누락 방지) | |
| * | |
| * @param int $mallSno | |
| * | |
| * @return array ['mail' => 'y'|'n', 'sms' => 'y'|'n'] | |
| */ | |
| public function getAdvertisingReceiveChannelUse(int $mallSno = DEFAULT_MALL_NUMBER): array | |
| { | |
| $joinItem = gd_policy('member.joinitem', $mallSno); | |
| $advertisingReceive = gd_policy('member.advertisingReceive', $mallSno); | |
| return [ | |
| 'mail' => (($joinItem['email']['use'] ?? 'n') === 'y' && ($advertisingReceive['email']['use'] ?? 'n') === 'y') ? 'y' : 'n', | |
| 'sms' => (($joinItem['cellPhone']['use'] ?? 'n') === 'y' && ($advertisingReceive['mobile']['use'] ?? 'n') === 'y') ? 'y' : 'n', | |
| ]; | |
| } | |
| /** | |
| * 광고성 수신 동의 사용 여부. 채널(이메일/모바일) 중 하나라도 노출 가능하면 사용(true), 둘 다 미사용이면 false. | |
| * es_buyerInform modeFl 대신 이 값을 프론트 노출/사용 판정 기준으로 쓴다. | |
| * | |
| * @param int $mallSno | |
| * | |
| * @return bool | |
| */ | |
| public function isUseAdvertisingReceive(int $mallSno = DEFAULT_MALL_NUMBER): bool | |
| { | |
| $channelUse = $this->getAdvertisingReceiveChannelUse($mallSno); | |
| return $channelUse['mail'] === 'y' || $channelUse['sms'] === 'y'; | |
| } | |
| /** | |
| * 기본정책 약관, 개인정보관련 동의사항, 이용, 탈퇴 안내 저장 함수 | |
| * | |
| $vo->setModeFl(gd_isset($postValue['privateMarketingFl'], 'n')); | |
| } | |
| if ($code == BuyerInformCode::PRIVATE_MARKETING_MEMBER) { | |
| $vo->setInformNm(strip_tags($postValue['privateMarketingMemberWriteTitle'])); | |
| $vo->setModeFl(gd_isset($postValue['privateMarketingMemberFl'], 'n')); | |
| $vo->setNoticePopupFl(gd_isset($postValue['privateMarketingMemberNoticePopupFl'], 'n')); | |
| } | |
| if ($code == BuyerInformCode::ADVERTISING_RECEIVE) { | |
| $advertisingReceiveChannels = $this->resolveAdvertisingReceiveChannels($postValue, (int)$mallSno); | |
| $vo->setInformNm(strip_tags($postValue['advertisingReceiveWriteTitle'])); | |
| $vo->setModeFl(($advertisingReceiveChannels['email']['use'] === 'y' || $advertisingReceiveChannels['mobile']['use'] === 'y') ? 'y' : 'n'); | |
| } | |
| $strSQL = "SELECT sno, displayShopFl FROM " . $tableName . " WHERE informCd='" . $code . "'"; | |
| if ($mallSno > DEFAULT_MALL_NUMBER) { | |
| $strSQL .= " AND mallSno='" . $mallSno . "'"; | |
변경 전BuyerInformVo.php
| private $regDt; | |
| private $modDt; | |
| private $displayShopFl; | |
| function __construct($code = null) | |
| { | |
| $this->displayShopFl = $displayShopFl; | |
| } | |
| /** | |
| * object return array | |
| * | |
변경 후BuyerInformVo.php
| private $regDt; | |
| private $modDt; | |
| private $displayShopFl; | |
| private string $noticePopupFl = 'n'; | |
| function __construct($code = null) | |
| { | |
| $this->displayShopFl = $displayShopFl; | |
| } | |
| /** | |
| * @return string | |
| */ | |
| public function getNoticePopupFl(): string | |
| { | |
| return $this->noticePopupFl; | |
| } | |
| /** | |
| * @param string $noticePopupFl | |
| */ | |
| public function setNoticePopupFl(string $noticePopupFl) | |
| { | |
| $this->noticePopupFl = $noticePopupFl; | |
| } | |
| /** | |
| * object return array | |
| * | |
변경 전DBTableField.php
| ['val' => 'scmDisplayFl', 'typ' => 's', 'def' => 'n'], // 모드 사용여부 | |
| ['val' => 'content', 'typ' => 's', 'def' => null], // 내용 | |
| ['val' => 'displayShopFl', 'typ' => 's', 'def' => 'n'], // 약관 노출 여부 | |
| ]; | |
| // @formatter:on | |
변경 후DBTableField.php
| ['val' => 'scmDisplayFl', 'typ' => 's', 'def' => 'n'], // 모드 사용여부 | |
| ['val' => 'content', 'typ' => 's', 'def' => null], // 내용 | |
| ['val' => 'displayShopFl', 'typ' => 's', 'def' => 'n'], // 약관 노출 여부 | |
| ['val' => 'noticePopupFl', 'typ' => 's', 'def' => 'n'], // 마케팅 목적 개인정보 수집 동의 안내 팝업 노출 여부 | |
| ]; | |
| // @formatter:on | |
변경 전MemberTableField.php
| 'def' => null, | |
| ], | |
| // 개인정보동의 취급업무 위탁 | |
| [ | |
| 'val' => 'foreigner', | |
| 'typ' => 's', | |
변경 후MemberTableField.php
| 'def' => null, | |
| ], | |
| // 개인정보동의 취급업무 위탁 | |
| [ | |
| 'val' => 'privateMarketingConsentOptionFl', | |
| 'typ' => 's', | |
| 'def' => '', // 미응답(빈값) 상태 유지 - DB DEFAULT '' 와 동일 | |
| ], | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 | |
| [ | |
| 'val' => 'privateMarketingConsentNoticePopupDt', | |
| 'typ' => 's', | |
| 'def' => null, | |
| ], | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 안내 팝업 노출 일시 (NULL:미노출) | |
| [ | |
| 'val' => 'foreigner', | |
| 'typ' => 's', | |
변경 전ExcelMember.php
| 'dbName' => 'member', | |
| 'dbKey' => 'smsFl', | |
| 'excelKey' => 'sms_fl', | |
| 'text' => __('SMS수신동의'), | |
| 'sample' => 'y', | |
| 'comment' => sprintf('y:%s<br />n:%s', __('받음'), __('거부')), | |
| 'desc' => sprintf('y:%s, n:%s, %s', __('받음'), __('거부'), __('기본은 y(받음)입니다.')), | |
| 'comment' => sprintf('n:%s<br />y:%s', __('동의안함'), __('동의함')), | |
| 'desc' => sprintf('n:%s, y:%s, %s', __('동의안함'), __('동의함'), __('기본은 n(동의안함)입니다.')), | |
| ], | |
| [ | |
| 'dbName' => 'member', | |
| 'dbKey' => 'foreigner', | |
변경 후ExcelMember.php
| 'dbName' => 'member', | |
| 'dbKey' => 'smsFl', | |
| 'excelKey' => 'sms_fl', | |
| 'text' => __('모바일메시지수신동의'), | |
| 'sample' => 'y', | |
| 'comment' => sprintf('y:%s<br />n:%s', __('받음'), __('거부')), | |
| 'desc' => sprintf('y:%s, n:%s, %s', __('받음'), __('거부'), __('기본은 y(받음)입니다.')), | |
| 'comment' => sprintf('n:%s<br />y:%s', __('동의안함'), __('동의함')), | |
| 'desc' => sprintf('n:%s, y:%s, %s', __('동의안함'), __('동의함'), __('기본은 n(동의안함)입니다.')), | |
| ], | |
| [ | |
| 'dbName' => 'member', | |
| 'dbKey' => 'privateMarketingConsentOptionFl', | |
| 'excelKey' => 'private_marketing_consent_option_fl', | |
| 'text' => __('마케팅 목적 개인정보 수집 및 이용'), | |
| 'sample' => 'n', | |
| 'comment' => sprintf('n:%s<br />y:%s', __('동의안함'), __('동의함')), | |
| 'desc' => sprintf('n:%s, y:%s, %s', __('동의안함'), __('동의함'), __('기본은 n(동의안함)입니다.')), | |
| ], | |
| [ | |
| 'dbName' => 'member', | |
| 'dbKey' => 'foreigner', | |
변경 전History.php
| //__('마일리지') | |
| 'deposit' => '예치금', | |
| //__('예치금') | |
| 'maillingFl' => '메일수신동의', | |
| //__('메일수신동의') | |
| 'smsFl' => 'SMS수신동의', | |
| //__('SMS수신동의') | |
| 'marriFl' => '결혼여부', | |
| //__('결혼여부') | |
| 'marriDate' => '결혼기념일', | |
| //__('개인정보 수집 및 이용 필수') | |
| 'privateApprovalOptionFl' => '개인정보 수집 및 이용 선택', | |
| //__('개인정보 수집 및 이용 선택') | |
| 'privateOfferFl' => '개인정보동의 제3자 제공', | |
| //__('개인정보동의 제3자 제공') | |
| 'privateConsignFl' => '개인정보동의 취급업무 위탁', | |
| $different = []; | |
| $this->getDifferent($different); | |
| if (gd_array_key_exists('smsFl', $different)) { | |
| $this->filters[] = 'smsFl'; | |
| } | |
| if (gd_array_key_exists('maillingFl', $different)) { | |
| $this->filters[] = 'maillingFl'; | |
| } | |
| if (gd_array_key_exists('privateApprovalOptionFl', $different)) { | |
| $this->filters[] = 'privateApprovalOptionFl'; | |
| } | |
| if (gd_array_key_exists('privateOfferFl', $different)) { | |
| $this->filters[] = 'privateOfferFl'; | |
| } | |
| if (gd_array_key_exists('privateConsignFl', $different)) { | |
| $this->filters[] = 'privateConsignFl'; | |
| } | |
| if (key_exists('companyCertification', $different)) { | |
| } | |
| $beforeValue = $displayArray[$beforeValue]; | |
| $value = $displayArray[$value]; | |
| if (gd_array_key_exists('groupModDt', $this->after) && ($this->before['groupModDt'] != $this->after['groupModDt'])) { | |
| $different['groupModDt'] = [ | |
| $this->before['groupModDt'], | |
| $this->after['groupModDt'], | |
| $beforeValue = $displayArray[$beforeValue]; | |
| $value = $displayArray[$value]; | |
| } | |
| unset($displayArray); | |
| $different[$key] = [ | |
| $beforeValue, | |
| StringUtils::strIsSet($item['otherValue'], '{}'); | |
| $otherValue = json_decode($item['otherValue'], true); | |
| StringUtils::strIsSet($otherValue['smsFl']['sms080']['regDt'], ''); | |
| if (!empty($otherValue['smsFl']['sms080']['regDt']) && $item['updateColumn'] == 'SMS수신동의') { | |
| $item['displayOtherValue'] = sprintf(' (080 수신거부 : %s)', $otherValue['smsFl']['sms080']['regDt']); | |
| } | |
| if (!empty($otherValue['reflectApplyMemberInfo']['orderNo']) && empty($otherValue['simpleJoin'])) { | |
| */ | |
| public function selectLastReceiveAgreementByMember($memberNo) | |
| { | |
| // __('SMS수신동의') | |
| // __('메일수신동의') | |
| $this->db->strField = 'mh.memNo, mh.updateColumn, mh.afterValue, MAX(mh.regDt) AS lastUpdateDt'; | |
| $this->db->strWhere = 'mh.memNo=? AND mh.updateColumn IN (\'SMS수신동의\', \'메일수신동의\')'; | |
| $this->db->strGroup = 'mh.updateColumn'; | |
| $this->db->bind_param_push($bind, 'i', $memberNo); | |
| $query = $this->db->query_complete(); | |
| */ | |
| public function getLastReceiveAgreementByMember($memberNo) | |
| { | |
| // __('SMS수신동의') | |
| // __('메일수신동의') | |
| $history = $this->selectLastReceiveAgreementByMember($memberNo); | |
| $result = []; | |
| foreach ($history as $item) { | |
| if ($item['updateColumn'] == 'SMS수신동의') { | |
| $result['lastReceiveAgreementDt']['sms'] = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| } elseif ($item['updateColumn'] == '메일수신동의') { | |
| $result['lastReceiveAgreementDt']['mail'] = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| } | |
| } | |
| return $result; | |
| $resultArray =[]; | |
| $this->db->strField = 'mh.memNo, mh.updateColumn, MAX(mh.regDt) AS lastUpdateDt'; | |
| $this->db->strWhere = 'mh.memNo in ('.gd_implode(',', $memberNos).') AND mh.updateColumn IN (\'SMS수신동의\', \'메일수신동의\')'; | |
| $this->db->strGroup = 'mh.memNo, mh.updateColumn'; | |
| $query = $this->db->query_complete(); | |
| $strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER_HISTORY . ' AS mh' . gd_implode(' ', $query); | |
| if (is_array($memberNos)) { | |
| $history = $this->selectLastReceiveAgreementByMembers($memberNos); | |
| foreach ($history as $item) { | |
| if ($item['updateColumn'] == 'SMS수신동의') { | |
| $result[$item['memNo']]['lastReceiveAgreementDt']['sms'] = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| } elseif ($item['updateColumn'] == '메일수신동의') { | |
| $result[$item['memNo']]['lastReceiveAgreementDt']['mail'] = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| } | |
| } | |
| } | |
변경 후History.php
| //__('마일리지') | |
| 'deposit' => '예치금', | |
| //__('예치금') | |
| 'maillingFl' => '이메일 수신 동의', | |
| //__('이메일 수신 동의') | |
| 'smsFl' => '모바일 메시지 수신 동의', | |
| //__('모바일 메시지 수신 동의') | |
| 'marriFl' => '결혼여부', | |
| //__('결혼여부') | |
| 'marriDate' => '결혼기념일', | |
| //__('개인정보 수집 및 이용 필수') | |
| 'privateApprovalOptionFl' => '개인정보 수집 및 이용 선택', | |
| //__('개인정보 수집 및 이용 선택') | |
| 'privateMarketingConsentOptionFl' => '마케팅 목적 개인정보 수집 및 이용 동의', | |
| //__('마케팅 목적 개인정보 수집 및 이용 동의') | |
| 'privateOfferFl' => '개인정보동의 제3자 제공', | |
| //__('개인정보동의 제3자 제공') | |
| 'privateConsignFl' => '개인정보동의 취급업무 위탁', | |
| $different = []; | |
| $this->getDifferent($different); | |
| if (array_key_exists('smsFl', $different)) { | |
| $this->filters[] = 'smsFl'; | |
| } | |
| if (array_key_exists('maillingFl', $different)) { | |
| $this->filters[] = 'maillingFl'; | |
| } | |
| if (array_key_exists('privateApprovalFl', $different)) { | |
| $this->filters[] = 'privateApprovalFl'; | |
| } | |
| if (array_key_exists('privateApprovalOptionFl', $different)) { | |
| $this->filters[] = 'privateApprovalOptionFl'; | |
| } | |
| if (array_key_exists('privateMarketingConsentOptionFl', $different)) { | |
| $this->filters[] = 'privateMarketingConsentOptionFl'; | |
| } | |
| if (array_key_exists('privateOfferFl', $different)) { | |
| $this->filters[] = 'privateOfferFl'; | |
| } | |
| if (array_key_exists('privateConsignFl', $different)) { | |
| $this->filters[] = 'privateConsignFl'; | |
| } | |
| if (key_exists('companyCertification', $different)) { | |
| } | |
| $beforeValue = $displayArray[$beforeValue]; | |
| $value = $displayArray[$value]; | |
| if (array_key_exists('groupModDt', $this->after) && ($this->before['groupModDt'] != $this->after['groupModDt'])) { | |
| $different['groupModDt'] = [ | |
| $this->before['groupModDt'], | |
| $this->after['groupModDt'], | |
| $beforeValue = $displayArray[$beforeValue]; | |
| $value = $displayArray[$value]; | |
| } | |
| // 마케팅 목적 개인정보 수집 및 이용 동의: 미응답(빈값)은 미동의(n)로 표시 (비교는 원본이라 최초 응답도 이력에 남음) | |
| if ('privateMarketingConsentOptionFl' == $key && '' === $beforeValue) { | |
| $beforeValue = 'n'; | |
| } | |
| unset($displayArray); | |
| $different[$key] = [ | |
| $beforeValue, | |
| StringUtils::strIsSet($item['otherValue'], '{}'); | |
| $otherValue = json_decode($item['otherValue'], true); | |
| StringUtils::strIsSet($otherValue['smsFl']['sms080']['regDt'], ''); | |
| // 'SMS수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| if (!empty($otherValue['smsFl']['sms080']['regDt']) && in_array($item['updateColumn'], ['모바일 메시지 수신 동의', 'SMS수신동의'], true)) { | |
| $item['displayOtherValue'] = sprintf(' (080 수신거부 : %s)', $otherValue['smsFl']['sms080']['regDt']); | |
| } | |
| if (!empty($otherValue['reflectApplyMemberInfo']['orderNo']) && empty($otherValue['simpleJoin'])) { | |
| */ | |
| public function selectLastReceiveAgreementByMember($memberNo) | |
| { | |
| // __('모바일 메시지 수신 동의') | |
| // __('이메일 수신 동의') | |
| // __('마케팅 목적 개인정보 수집 및 이용 동의') | |
| $this->db->strField = 'mh.memNo, mh.updateColumn, mh.afterValue, MAX(mh.regDt) AS lastUpdateDt'; | |
| // 'SMS수신동의'/'메일수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| $this->db->strWhere = 'mh.memNo=? AND mh.updateColumn IN (\'모바일 메시지 수신 동의\', \'SMS수신동의\', \'이메일 수신 동의\', \'메일수신동의\', \'마케팅 목적 개인정보 수집 및 이용 동의\')'; | |
| $this->db->strGroup = 'mh.updateColumn'; | |
| $this->db->bind_param_push($bind, 'i', $memberNo); | |
| $query = $this->db->query_complete(); | |
| */ | |
| public function getLastReceiveAgreementByMember($memberNo) | |
| { | |
| // __('모바일 메시지 수신 동의') | |
| // __('이메일 수신 동의') | |
| $history = $this->selectLastReceiveAgreementByMember($memberNo); | |
| $result = []; | |
| foreach ($history as $item) { | |
| $dt = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| // 'SMS수신동의'/'메일수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| if (in_array($item['updateColumn'], ['모바일 메시지 수신 동의', 'SMS수신동의'], true)) { | |
| $key = 'sms'; | |
| } elseif (in_array($item['updateColumn'], ['이메일 수신 동의', '메일수신동의'], true)) { | |
| $key = 'mail'; | |
| } elseif ($item['updateColumn'] == '마케팅 목적 개인정보 수집 및 이용 동의') { | |
| $key = 'privateMkt'; | |
| } else { | |
| continue; | |
| } | |
| // 옛/새 라벨이 각각 그룹으로 나뉘어 올 수 있어 더 늦은 일자만 유지 | |
| if (empty($result['lastReceiveAgreementDt'][$key]) || $result['lastReceiveAgreementDt'][$key] < $dt) { | |
| $result['lastReceiveAgreementDt'][$key] = $dt; | |
| } | |
| } | |
| return $result; | |
| } | |
| /** | |
| * 회원의 개인정보 동의 항목별 마지막 변경 일시 조회 (updateColumn 한글 라벨 그룹, MAX regDt) | |
| * | |
| * @param $memberNo | |
| * | |
| * @return array | |
| */ | |
| public function selectLastPrivateAgreementByMember($memberNo): array | |
| { | |
| // __('개인정보 수집 및 이용 필수') | |
| // __('개인정보 수집 및 이용 선택') | |
| // __('개인정보동의 제3자 제공') | |
| // __('개인정보동의 취급업무 위탁') | |
| // __('마케팅 목적 개인정보 수집 및 이용 동의') | |
| $this->db->strField = 'mh.updateColumn, MAX(mh.regDt) AS lastUpdateDt'; | |
| $this->db->strWhere = 'mh.memNo=? AND mh.updateColumn IN (\'개인정보 수집 및 이용 필수\', \'개인정보 수집 및 이용 선택\', \'개인정보동의 제3자 제공\', \'개인정보동의 취급업무 위탁\', \'마케팅 목적 개인정보 수집 및 이용 동의\')'; | |
| $this->db->strGroup = 'mh.updateColumn'; | |
| $this->db->bind_param_push($bind, 'i', $memberNo); | |
| $query = $this->db->query_complete(); | |
| $strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER_HISTORY . ' AS mh' . implode(' ', $query); | |
| $result = $this->db->query_fetch($strSQL, $bind); | |
| return $result; | |
| } | |
| /** | |
| * 회원의 개인정보 동의 항목별 마지막 변경 일시 (컬럼명 => 'Y-m-d H:i:s') | |
| * 이력이 없는 항목은 키 자체가 없으므로 호출부에서 entryDt 등으로 폴백한다. | |
| * | |
| * @param int $memberNo | |
| * | |
| * @return array privateApprovalFl / privateApprovalOptionFl / privateOfferFl / privateConsignFl / privateMarketingConsentOptionFl 중 이력 있는 항목만 | |
| */ | |
| public function getLastPrivateAgreementDateByMember(int $memberNo): array | |
| { | |
| $labelToColumn = [ | |
| '개인정보 수집 및 이용 필수' => 'privateApprovalFl', | |
| '개인정보 수집 및 이용 선택' => 'privateApprovalOptionFl', | |
| '개인정보동의 제3자 제공' => 'privateOfferFl', | |
| '개인정보동의 취급업무 위탁' => 'privateConsignFl', | |
| '마케팅 목적 개인정보 수집 및 이용 동의' => 'privateMarketingConsentOptionFl', | |
| ]; | |
| $history = $this->selectLastPrivateAgreementByMember($memberNo); | |
| $result = []; | |
| foreach ($history as $item) { | |
| $column = $labelToColumn[$item['updateColumn']] ?? null; | |
| if ($column === null) { | |
| continue; | |
| } | |
| $result[$column] = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| } | |
| return $result; | |
| $resultArray =[]; | |
| $this->db->strField = 'mh.memNo, mh.updateColumn, MAX(mh.regDt) AS lastUpdateDt'; | |
| // 'SMS수신동의'/'메일수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| $this->db->strWhere = 'mh.memNo in ('.gd_implode(',', $memberNos).') AND mh.updateColumn IN (\'모바일 메시지 수신 동의\', \'SMS수신동의\', \'이메일 수신 동의\', \'메일수신동의\')'; | |
| $this->db->strGroup = 'mh.memNo, mh.updateColumn'; | |
| $query = $this->db->query_complete(); | |
| $strSQL = 'SELECT ' . array_shift($query) . ' FROM ' . DB_MEMBER_HISTORY . ' AS mh' . gd_implode(' ', $query); | |
| if (is_array($memberNos)) { | |
| $history = $this->selectLastReceiveAgreementByMembers($memberNos); | |
| foreach ($history as $item) { | |
| $dt = DateTimeUtils::dateFormat('Y-m-d H:i:s', $item['lastUpdateDt']); | |
| // 'SMS수신동의'/'메일수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| if (in_array($item['updateColumn'], ['모바일 메시지 수신 동의', 'SMS수신동의'], true)) { | |
| $key = 'sms'; | |
| } elseif (in_array($item['updateColumn'], ['이메일 수신 동의', '메일수신동의'], true)) { | |
| $key = 'mail'; | |
| } else { | |
| continue; | |
| } | |
| // 옛/새 라벨이 각각 그룹으로 나뉘어 올 수 있어 더 늦은 일자만 유지 | |
| if (empty($result[$item['memNo']]['lastReceiveAgreementDt'][$key]) || $result[$item['memNo']]['lastReceiveAgreementDt'][$key] < $dt) { | |
| $result[$item['memNo']]['lastReceiveAgreementDt'][$key] = $dt; | |
| } | |
| } | |
| } | |
변경 전MemberAdmin.php
| } | |
| $this->db->strJoin = ' LEFT JOIN ' . DB_MEMBER_SNS . ' AS ms ON m.memNo = ms.memNo'; | |
| $this->db->strJoin .= ' LEFT JOIN ' . DB_MEMBER_GROUP . ' AS mg ON m.groupSno = mg.sno'; | |
| $this->db->strJoin .= ' LEFT JOIN ' . DB_MEMBER_HISTORY . ' AS mh ON (m.memNo=mh.memNo AND mh.updateColumn=\'SMS수신동의\')'; | |
| $this->db->strJoin .= ' LEFT JOIN ' . DB_MEMBER_HISTORY . ' AS mh2 ON (m.memNo=mh2.memNo AND mh2.updateColumn=\'메일수신동의\')'; | |
| $this->db->strGroup = 'm.memNo'; | |
| $arrQuery = $this->db->query_complete(true, true); | |
| $strSQL = 'SELECT ' . array_shift($arrQuery) . ' FROM ' . DB_MEMBER . ' AS m ' . gd_implode(' ', $arrQuery); | |
| } | |
| } | |
| $arrData = $this->validateMemberByAdminModification($arrData); | |
| foreach ($preservedFileKeys as $fileKey => $fileVal) { | |
| \App::getInstance('session')->set(SESSION_GLOBAL_MALL, ['isAdminModify' => true]); | |
| } | |
| \Component\Member\MemberValidation::addValidateMember($v, $require); | |
| $v->add('memNo', 'number', true); | |
| if (!$this->isExcelUpload) { | |
| if (gd_isset($params['memPw'], '') !== '') { | |
변경 후MemberAdmin.php
| } | |
| $this->db->strJoin = ' LEFT JOIN ' . DB_MEMBER_SNS . ' AS ms ON m.memNo = ms.memNo'; | |
| $this->db->strJoin .= ' LEFT JOIN ' . DB_MEMBER_GROUP . ' AS mg ON m.groupSno = mg.sno'; | |
| $this->db->strJoin .= ' LEFT JOIN ' . DB_MEMBER_HISTORY . ' AS mh ON (m.memNo=mh.memNo AND mh.updateColumn=\'모바일 메시지 수신 동의\')'; | |
| $this->db->strJoin .= ' LEFT JOIN ' . DB_MEMBER_HISTORY . ' AS mh2 ON (m.memNo=mh2.memNo AND mh2.updateColumn=\'이메일 수신 동의\')'; | |
| $this->db->strGroup = 'm.memNo'; | |
| $arrQuery = $this->db->query_complete(true, true); | |
| $strSQL = 'SELECT ' . array_shift($arrQuery) . ' FROM ' . DB_MEMBER . ' AS m ' . gd_implode(' ', $arrQuery); | |
| } | |
| } | |
| // 마케팅 목적 개인정보 수집 및 이용 동의는 약관 사용 시에만 포함 | |
| $privateMarketingMemberData = (new \Component\Agreement\BuyerInform())->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_MARKETING_MEMBER); | |
| if (($privateMarketingMemberData[0]['modeFl'] ?? 'n') === 'y') { | |
| StringUtils::strIsSet($arrData['privateMarketingConsentOptionFl'], 'n'); | |
| } | |
| $arrData = $this->validateMemberByAdminModification($arrData); | |
| foreach ($preservedFileKeys as $fileKey => $fileVal) { | |
| \App::getInstance('session')->set(SESSION_GLOBAL_MALL, ['isAdminModify' => true]); | |
| } | |
| \Component\Member\MemberValidation::addValidateMember($v, $require); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 (validator 미등록 시 act garbageDelete 로 제거되어 미저장) | |
| $v->add('privateMarketingConsentOptionFl', 'yn', false, '{' . __('마케팅 목적 개인정보 수집 및 이용 동의') . '}'); | |
| $v->add('memNo', 'number', true); | |
| if (!$this->isExcelUpload) { | |
| if (gd_isset($params['memPw'], '') !== '') { | |
변경 전MemberDAO.php
| $this->db->strField = 'm.memNo, m.memId, m.memNm, m.groupSno, m.mileage, m.deposit, m.smsFl, m.maillingFl, m.cellPhone, m.email'; | |
| $this->db->strField .= ', ' . $strFieldBySmsAgreementDt . ', ' . $strFieldByMailAgreementDt; | |
| $this->db->strJoin = ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn=\'SMS수신동의\' GROUP BY memNo) AS mh_sms ON m.memNo = mh_sms.memNo'; | |
| $this->db->strJoin .= ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn=\'메일수신동의\' GROUP BY memNo) AS mh_mail ON m.memNo = mh_mail.memNo'; | |
| $this->db->strJoin .= ' LEFT JOIN (SELECT DISTINCT memNo FROM ' . DB_MEMBER_NOTIFICATION_LOG . ' WHERE ReasonCode=\'' . MailMimeAuto::AGREEMENT2YPERIOD . '\' AND regDt >= \'' . $standardDt . ' 00:00:00\' AND regDt <= \'' . $nowDt . ' 23:59:59\') AS mnl ON m.memNo = mnl.memNo'; | |
| $this->db->strWhere = ''; | |
| $this->db->bindParameter('sexFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('maillingFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('smsFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('calendarFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('marriFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('connectSns', $params, $arrBind, $arrWhere, 'tableMemberSns', 'ms', 'snsTypeFl'); | |
| $query = MemberModel::from('es_member as m') | |
| ->leftJoin('es_memberHistory as mh', function ($join) { | |
| $join->on('mh.memNo', '=', 'm.memNo') | |
| ->where('mh.updateColumn', 'SMS수신동의'); | |
| }) | |
| ->leftJoin('es_memberHistory as mh2', function ($join) { | |
| $join->on('mh2.memNo', '=', 'm.memNo') | |
| ->where('mh2.updateColumn', '메일수신동의'); | |
| }) | |
| ->leftJoin('es_memberGroup as mg', 'm.groupSno', '=', 'mg.sno'); | |
변경 후MemberDAO.php
| $this->db->strField = 'm.memNo, m.memId, m.memNm, m.groupSno, m.mileage, m.deposit, m.smsFl, m.maillingFl, m.cellPhone, m.email'; | |
| $this->db->strField .= ', ' . $strFieldBySmsAgreementDt . ', ' . $strFieldByMailAgreementDt; | |
| // 'SMS수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| $this->db->strJoin = ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn IN (\'모바일 메시지 수신 동의\', \'SMS수신동의\') GROUP BY memNo) AS mh_sms ON m.memNo = mh_sms.memNo'; | |
| // '메일수신동의' 는 구 라벨 - 마이그레이션 미완 데이터 대비 | |
| $this->db->strJoin .= ' LEFT JOIN (SELECT memNo, COUNT(*) AS cnt, MAX(regDt) AS maxRegDt FROM ' . DB_MEMBER_HISTORY . ' WHERE updateColumn IN (\'이메일 수신 동의\', \'메일수신동의\') GROUP BY memNo) AS mh_mail ON m.memNo = mh_mail.memNo'; | |
| $this->db->strJoin .= ' LEFT JOIN (SELECT DISTINCT memNo FROM ' . DB_MEMBER_NOTIFICATION_LOG . ' WHERE ReasonCode=\'' . MailMimeAuto::AGREEMENT2YPERIOD . '\' AND regDt >= \'' . $standardDt . ' 00:00:00\' AND regDt <= \'' . $nowDt . ' 23:59:59\') AS mnl ON m.memNo = mnl.memNo'; | |
| $this->db->strWhere = ''; | |
| $this->db->bindParameter('sexFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('maillingFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('smsFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 검색값 화이트리스트 정규화 | |
| if (!in_array($params['privateMarketingConsentOptionFl'] ?? '', ['', 'y', 'n'], true)) { | |
| $params['privateMarketingConsentOptionFl'] = ''; | |
| } | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 (미동의는 동의여부 저장 안 한 디폴트('') 포함이라 != 'y') | |
| if (!empty($params['privateMarketingConsentOptionFl'])) { | |
| $arrWhere[] = $params['privateMarketingConsentOptionFl'] === 'y' | |
| ? "m.privateMarketingConsentOptionFl = 'y'" | |
| : "m.privateMarketingConsentOptionFl != 'y'"; | |
| } | |
| $this->db->bindParameter('calendarFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('marriFl', $params, $arrBind, $arrWhere, 'tableMember', 'm'); | |
| $this->db->bindParameter('connectSns', $params, $arrBind, $arrWhere, 'tableMemberSns', 'ms', 'snsTypeFl'); | |
| $query = MemberModel::from('es_member as m') | |
| ->leftJoin('es_memberHistory as mh', function ($join) { | |
| // '모바일 메시지 수신 동의'(신규) / 'SMS수신동의'(구 라벨) dual-match - 마이그레이션 미완 데이터 대비 | |
| $join->on('mh.memNo', '=', 'm.memNo') | |
| ->whereIn('mh.updateColumn', ['모바일 메시지 수신 동의', 'SMS수신동의']); | |
| }) | |
| ->leftJoin('es_memberHistory as mh2', function ($join) { | |
| // '이메일 수신 동의'(신규) / '메일수신동의'(구 라벨) dual-match - 마이그레이션 미완 데이터 대비 | |
| $join->on('mh2.memNo', '=', 'm.memNo') | |
| ->whereIn('mh2.updateColumn', ['이메일 수신 동의', '메일수신동의']); | |
| }) | |
| ->leftJoin('es_memberGroup as mg', 'm.groupSno', '=', 'mg.sno'); | |
변경 전Member.php
| } | |
| } | |
| /** | |
| * 로그인 비밀번호를 재검증 하는 함수 | |
| * | |
| $v->add('privateApprovalOptionFl', '', false, '{' . __('개인정보 수집.이용 동의 선택사항') . '}'); // 개인정보동의 이용자 동의사항 | |
| $v->add('privateOfferFl', '', false, '{' . __('개인정보동의 제3자 제공') . '}'); // 개인정보동의 제3자 제공 | |
| $v->add('privateConsignFl', '', false, '{' . __('개인정보동의 취급업무 위탁') . '}'); // 개인정보동의 취급업무 위탁 | |
| $v->add('foreigner', '', false, '{' . __('내외국인구분') . '}'); // 내외국인구분 | |
| $v->add('dupeinfo', '', false, '{' . __('본인확인 중복가입확인정보') . '}'); // 본인확인 중복가입확인정보 | |
| $v->add('pakey', '', false, '{' . __('본인확인 번호') . '}'); // 본인확인 번호 | |
| $vo->setPrivateApprovalOptionFl(json_encode($joinSession->get('privateApprovalOptionFl'), JSON_UNESCAPED_SLASHES)); | |
| $vo->setPrivateOfferFl(json_encode($joinSession->get('privateOfferFl'), JSON_UNESCAPED_SLASHES)); | |
| $vo->setPrivateConsignFl(json_encode($joinSession->get('privateConsignFl'), JSON_UNESCAPED_SLASHES)); | |
| $vo->setForeigner($joinSession->get('foreigner')); | |
| $vo->setDupeinfo($joinSession->get('dupeinfo')); | |
| $vo->setPakey($joinSession->get('pakey')); | |
| 'sexFl', | |
| 'marriFl', | |
| 'expirationFl', | |
| ], $memberData | |
| ); | |
변경 후Member.php
| } | |
| } | |
| /** | |
| * 마케팅 목적 개인정보 수집 및 이용 동의 안내(alert) 노출 여부 판정 + 노출 이력 기록 | |
| * 조건 통과 시 노출 이력(privateMarketingConsentNoticePopupDt)에 노출시각을 기록해 계정당 1회만 노출 | |
| * | |
| * @return bool 안내 노출 대상이면 true (동시에 노출 이력 기록) | |
| * @throws Exception | |
| */ | |
| public function markPrivateMarketingConsentNoticeShown(): bool | |
| { | |
| if (!MemberUtil::isLogin()) { | |
| return false; | |
| } | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 약관(001015) 사용중(modeFl='y') + 안내 팝업 노출 사용(noticePopupFl='y') | |
| /** @var \Bundle\Component\Agreement\BuyerInform $buyerInform */ | |
| $buyerInform = \App::load('\\Component\\Agreement\\BuyerInform'); | |
| $inform = $buyerInform->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_MARKETING_MEMBER, 'modeFl, noticePopupFl'); | |
| if (($inform[0]['modeFl'] ?? 'n') !== 'y' || ($inform[0]['noticePopupFl'] ?? 'n') !== 'y') { | |
| return false; | |
| } | |
| $member = MemberUtil::getMemberBySession('memNo, privateMarketingConsentOptionFl, privateMarketingConsentNoticePopupDt'); | |
| $noticeDt = $member['privateMarketingConsentNoticePopupDt'] ?? ''; | |
| $alreadyNoticed = !empty($noticeDt) && $noticeDt !== '0000-00-00 00:00:00'; | |
| // 동의('y'), 안내 노출 이력이 있으면 미노출 | |
| if (($member['privateMarketingConsentOptionFl'] ?? '') === 'y' || $alreadyNoticed) { | |
| return false; | |
| } | |
| // 노출 이력 기록 (계정당 평생 1회 — 노출했다는 사실만 저장, 동의/거부와 무관) | |
| try { | |
| $this->update($member['memNo'], 'memNo', ['privateMarketingConsentNoticePopupDt'], [DateTimeUtils::dateFormat('Y-m-d H:i:s', 'now')]); | |
| } catch (\Exception $e) { | |
| \Logger::channel('userLogin')->warning('마케팅 목적 개인정보 수집 및 이용 동의 안내 노출 이력 기록 실패', ['memNo' => $member['memNo'], 'exception' => $e]); | |
| return false; | |
| } | |
| return true; | |
| } | |
| /** | |
| * 로그인 비밀번호를 재검증 하는 함수 | |
| * | |
| $v->add('privateApprovalOptionFl', '', false, '{' . __('개인정보 수집.이용 동의 선택사항') . '}'); // 개인정보동의 이용자 동의사항 | |
| $v->add('privateOfferFl', '', false, '{' . __('개인정보동의 제3자 제공') . '}'); // 개인정보동의 제3자 제공 | |
| $v->add('privateConsignFl', '', false, '{' . __('개인정보동의 취급업무 위탁') . '}'); // 개인정보동의 취급업무 위탁 | |
| $v->add('privateMarketingConsentOptionFl', 'yn', false, '{' . __('마케팅 목적 개인정보 수집 및 이용 동의') . '}'); // 마케팅 목적 개인정보 수집 및 이용 동의 | |
| $v->add('maillingFl', 'yn', false, '{' . __('이메일 수신 동의') . '}'); // 광고성 수신 동의 - 이메일 | |
| $v->add('smsFl', 'yn', false, '{' . __('모바일 메시지 수신 동의') . '}'); // 광고성 수신 동의 - 모바일 | |
| $v->add('foreigner', '', false, '{' . __('내외국인구분') . '}'); // 내외국인구분 | |
| $v->add('dupeinfo', '', false, '{' . __('본인확인 중복가입확인정보') . '}'); // 본인확인 중복가입확인정보 | |
| $v->add('pakey', '', false, '{' . __('본인확인 번호') . '}'); // 본인확인 번호 | |
| $vo->setPrivateApprovalOptionFl(json_encode($joinSession->get('privateApprovalOptionFl'), JSON_UNESCAPED_SLASHES)); | |
| $vo->setPrivateOfferFl(json_encode($joinSession->get('privateOfferFl'), JSON_UNESCAPED_SLASHES)); | |
| $vo->setPrivateConsignFl(json_encode($joinSession->get('privateConsignFl'), JSON_UNESCAPED_SLASHES)); | |
| // 마수동 약관 사용중(modeFl='y')일 때만 동의('y')/미동의('n') 확정. 미사용 시 ''(미응답) = 로그인 안내 팝업 대상. | |
| $privateMarketingConsentOptionFl = $joinSession->get('privateMarketingConsentOptionFl'); | |
| $buyerInform = \App::load('\\Component\\Agreement\\BuyerInform'); | |
| $privateMarketingMember = $buyerInform->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_MARKETING_MEMBER, 'modeFl'); | |
| if (($privateMarketingMember[0]['modeFl'] ?? 'n') === 'y') { | |
| $privateMarketingConsentOptionFl = ($privateMarketingConsentOptionFl === 'y') ? 'y' : 'n'; | |
| // 약관 사용 중 가입 = 이미 선택함 → 로그인 안내 팝업 제외 (노출 이력에 가입 시각 기록) | |
| $vo->setPrivateMarketingConsentNoticePopupDt(date('Y-m-d H:i:s')); | |
| } else { | |
| $privateMarketingConsentOptionFl = ''; | |
| } | |
| $vo->setPrivateMarketingConsentOptionFl($privateMarketingConsentOptionFl); | |
| $vo->setMaillingFl($joinSession->get('maillingFl')); | |
| $vo->setSmsFl($joinSession->get('smsFl')); | |
| $vo->setForeigner($joinSession->get('foreigner')); | |
| $vo->setDupeinfo($joinSession->get('dupeinfo')); | |
| $vo->setPakey($joinSession->get('pakey')); | |
| 'sexFl', | |
| 'marriFl', | |
| 'expirationFl', | |
| 'privateMarketingConsentOptionFl', | |
| ], $memberData | |
| ); | |
변경 전MemberVO.php
| protected $ex1, $ex2, $ex3, $ex4, $ex5, $ex6; | |
| protected $privateApprovalFl; | |
| protected $privateApprovalOptionFl; | |
| protected $privateOfferFl; | |
| protected $privateConsignFl; | |
| protected $foreigner; | |
| $this->privateApprovalOptionFl = $privateApprovalOptionFl; | |
| } | |
| /** | |
| * @param mixed $privateOfferFl | |
| */ | |
변경 후MemberVO.php
| protected $ex1, $ex2, $ex3, $ex4, $ex5, $ex6; | |
| protected $privateApprovalFl; | |
| protected $privateApprovalOptionFl; | |
| protected $privateMarketingConsentOptionFl; | |
| protected $privateMarketingConsentNoticePopupDt; | |
| protected $privateOfferFl; | |
| protected $privateConsignFl; | |
| protected $foreigner; | |
| $this->privateApprovalOptionFl = $privateApprovalOptionFl; | |
| } | |
| /** | |
| * @param mixed $privateMarketingConsentOptionFl 마케팅 목적 개인정보 수집 및 이용 동의 | |
| */ | |
| public function setPrivateMarketingConsentOptionFl($privateMarketingConsentOptionFl) | |
| { | |
| $this->privateMarketingConsentOptionFl = $privateMarketingConsentOptionFl; | |
| } | |
| /** | |
| * @param mixed $privateMarketingConsentNoticePopupDt 마케팅 목적 개인정보 수집 및 이용 동의 안내 팝업 노출 일시 | |
| */ | |
| public function setPrivateMarketingConsentNoticePopupDt($privateMarketingConsentNoticePopupDt) | |
| { | |
| $this->privateMarketingConsentNoticePopupDt = $privateMarketingConsentNoticePopupDt; | |
| } | |
| /** | |
| * @param mixed $maillingFl 이메일 수신 동의 | |
| */ | |
| public function setMaillingFl($maillingFl) | |
| { | |
| $this->maillingFl = $maillingFl; | |
| } | |
| /** | |
| * @param mixed $smsFl 모바일 메시지 수신 동의 | |
| */ | |
| public function setSmsFl($smsFl) | |
| { | |
| $this->smsFl = $smsFl; | |
| } | |
| /** | |
| * @param mixed $privateOfferFl | |
| */ | |
변경 전MyPage.php
| $requestParams['privateConsignFl'] = json_encode($agreementData['privateConsignFl'], JSON_UNESCAPED_SLASHES); | |
| $requestParams['privateOfferFl'] = json_encode($agreementData['privateOfferFl'], JSON_UNESCAPED_SLASHES); | |
| $passValidation = isset($memberSession['memPw']) == false && $memberSession['snsJoinFl'] == 'y'; | |
| $requestParams = $this->validateMemberByModification($requestParams, $passValidation); | |
| $addExclude = [ | |
| $v->add('privateApprovalOptionFl', '', false, '{' . __('개인정보 수집 및 이용') . '}'); | |
| $v->add('privateOfferFl', '', false, '{' . __('개인정보동의 제3자 제공') . '}'); | |
| $v->add('privateConsignFl', '', false, '{' . __('개인정보동의 취급업무 위탁') . '}'); | |
| if (StringUtils::strIsSet($requestParams['memPw'], '') !== '') { | |
| \Component\Member\MemberValidation::validateMemberPassword($requestParams['memPw']); | |
| $v->add('memPw', '', true, '{' . __('비밀번호') . '}'); | |
| } else { | |
| $requestParams['privateOfferFl'] = $arrprivateOffer; | |
| } | |
| return $requestParams; | |
| } | |
| } | |
변경 후MyPage.php
| $requestParams['privateConsignFl'] = json_encode($agreementData['privateConsignFl'], JSON_UNESCAPED_SLASHES); | |
| $requestParams['privateOfferFl'] = json_encode($agreementData['privateOfferFl'], JSON_UNESCAPED_SLASHES); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의는 사용 시에만 setAgreementData 세팅 (미사용 시 미포함 → 컬럼값 갱신 안 함, 기존값 유지) | |
| if (array_key_exists('privateMarketingConsentOptionFl', $agreementData)) { | |
| $requestParams['privateMarketingConsentOptionFl'] = $agreementData['privateMarketingConsentOptionFl']; | |
| } | |
| $passValidation = isset($memberSession['memPw']) == false && $memberSession['snsJoinFl'] == 'y'; | |
| $requestParams = $this->validateMemberByModification($requestParams, $passValidation); | |
| $addExclude = [ | |
| $v->add('privateApprovalOptionFl', '', false, '{' . __('개인정보 수집 및 이용') . '}'); | |
| $v->add('privateOfferFl', '', false, '{' . __('개인정보동의 제3자 제공') . '}'); | |
| $v->add('privateConsignFl', '', false, '{' . __('개인정보동의 취급업무 위탁') . '}'); | |
| $v->add('privateMarketingConsentOptionFl', '', false, '{' . __('마케팅 목적 개인정보 수집 및 이용 동의') . '}'); | |
| if (StringUtils::strIsSet($requestParams['memPw'], '') !== '') { | |
| \Component\Member\MemberValidation::validateMemberPassword($requestParams['memPw']); | |
| $v->add('memPw', '', true, '{' . __('비밀번호') . '}'); | |
| } else { | |
| $requestParams['privateOfferFl'] = $arrprivateOffer; | |
| } | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 (사용 시에만 동의 'y' / 미동의 'n' 저장. 미사용 시 빈값 유지 - 로그인 안내 팝업 조건) | |
| $privateMarketingMemberData = $inform->getInformDataArray(BuyerInformCode::PRIVATE_MARKETING_MEMBER); | |
| if (($privateMarketingMemberData[0]['modeFl'] ?? 'n') === 'y') { | |
| $requestParams['privateMarketingConsentOptionFl'] = (($requestParams['privateMarketingConsentOptionFl'] ?? '') === 'y') ? 'y' : 'n'; | |
| } | |
| return $requestParams; | |
| } | |
| } | |
변경 전MemberUtil.php
| } | |
| $joinField = \Component\Policy\JoinItemPolicy::getInstance()->getPolicy($mallSno); | |
| $html[] = '<tr>'; | |
| for ($i = 1; $i < 7; $i++) { | |
| $key = 'ex' . $i; | |
| $value = $joinField[$key]; | |
| continue; | |
| } | |
| if ($value['name']) { | |
| $title .= '<br /><span class="nobold">(' . $value['name'] . ')</span>'; | |
| } | |
| if ($i != 1 && $i % 2 != 0) { | |
| $html[] = '</tr><tr>'; | |
| } | |
| $html[] = '<th class="input_title r_space ex">' . $title . '</th>'; | |
| $html[] = '<td>'; | |
| $tmpArray = array_map('trim', explode(',', $value['value'])); | |
| switch ($value['type']) { | |
| default : | |
| $html[] = '<input type="text" name="' . $key . '" class="form-control" value="' . $fieldValue[$key] . '"/>'; | |
| break; | |
| case 'SELECT': | |
| $html[] = gd_select_box($key, $key, gd_array_change_key_value($tmpArray), null, $fieldValue[$key], '=선택='); | |
| break; | |
| case 'RADIO': | |
| $html[] = gd_radio_box($key, array_combine(gd_array_values($tmpArray), gd_array_values($tmpArray)), $fieldValue[$key]); | |
| break; | |
| case 'CHECKBOX': | |
| $html[] = gd_check_box($key . '[]', array_combine(gd_array_values($tmpArray), gd_array_values($tmpArray)), $fieldValue[$key]); | |
| break; | |
| } | |
| $html[] = '</td>'; | |
| } | |
| return gd_implode('', $html); | |
| } | |
| /** | |
| * 로그인 되었는 지를 체크 (회원/비회원) | |
| * | |
| $data['agreementInfoFl'] = gd_isset($arrData['agreementInfoFl'], 'n'); | |
| $data['privateApprovalFl'] = gd_isset($arrData['privateApprovalFl'], 'n'); | |
| $data['under14ConsentFl'] = gd_isset($arrData['under14ConsentFl'], 'n'); | |
| //이용약관 체크값 설정 | |
| $myPage = \App::load('\\Component\\Member\\MyPage'); | |
| $data['privateApprovalOptionFl'] = gd_isset($agreementData['privateApprovalOptionFl']); | |
| $data['privateOfferFl'] = gd_isset($agreementData['privateOfferFl']); | |
| $data['privateConsignFl'] = gd_isset($agreementData['privateConsignFl']); | |
| // 인증설정체크해서 데이터 추가 useDataJoinFl | |
| $dreamInfo = gd_policy('member.auth_cellphone'); | |
| $params['sexFl'] = $params['sexFl'] ?? ''; | |
| $params['maillingFl'] = $params['maillingFl'] ?? ''; | |
| $params['smsFl'] = $params['smsFl'] ?? ''; | |
| $params['calendarFl'] = $params['calendarFl'] ?? ''; | |
| $params['expirationFl'] = $params['expirationFl'] ?? ''; | |
| $checked['sexFl'][$params['sexFl']] = | |
| $checked['maillingFl'][$params['maillingFl']] = | |
| $checked['smsFl'][$params['smsFl']] = | |
| $checked['calendarFl'][$params['calendarFl']] = | |
| $checked['expirationFl'][$params['expirationFl']] = 'checked="checked"'; | |
변경 후MemberUtil.php
| } | |
| $joinField = \Component\Policy\JoinItemPolicy::getInstance()->getPolicy($mallSno); | |
| $html = []; | |
| for ($i = 1; $i < 7; $i++) { | |
| $key = 'ex' . $i; | |
| $value = $joinField[$key]; | |
| continue; | |
| } | |
| if ($value['name']) { | |
| $title .= '<span class="nobold">(' . $value['name'] . ')</span>'; | |
| } | |
| $html[] = '<tr>'; | |
| $html[] = '<th><div class="ncua-align-items-center ncua-flex-column ncua-align-items-start">' . $title . '</div></th>'; | |
| $html[] = '<td><div class="ncua-flex-gap">'; | |
| $tmpArray = array_map('trim', explode(',', $value['value'])); | |
| switch ($value['type']) { | |
| case 'SELECT': | |
| $html[] = '<span class="ncua-select ncua-select--xs">'; | |
| $html[] = '<span class="ncua-select__content">'; | |
| $html[] = gd_select_box($key, $key, gd_array_change_key_value($tmpArray), null, $fieldValue[$key], '=선택=', null, 'ncua-select__tag'); | |
| $html[] = '</span>'; | |
| $html[] = '</span>'; | |
| break; | |
| case 'RADIO': | |
| $html[] = gd_radio_box_ncua($key, array_combine(gd_array_values($tmpArray), gd_array_values($tmpArray)), $fieldValue[$key]); | |
| break; | |
| case 'CHECKBOX': | |
| $html[] = gd_check_box_ncua($key . '[]', array_combine(gd_array_values($tmpArray), gd_array_values($tmpArray)), $fieldValue[$key]); | |
| break; | |
| default : | |
| $html[] = '<div class="ncua-input ncua-input--xs ncua-input-width-320">'; | |
| $html[] = '<div class="ncua-input__content">'; | |
| $html[] = '<div class="ncua-input__field ncua-input__field--xs">'; | |
| $html[] = '<input type="text" name="' . $key . '" value="' . gd_htmlspecialchars($fieldValue[$key]) . '" placeholder="추가정보를 입력하세요."/>'; | |
| $html[] = '</div>'; | |
| $html[] = '</div>'; | |
| $html[] = '</div>'; | |
| break; | |
| } | |
| $html[] = '</div></td>'; | |
| $html[] = '</tr>'; | |
| } | |
| return gd_implode('', $html); | |
| } | |
| /** | |
| * 약관 동의 표시 항목 생성 (informNm + 동의함/동의안함 라벨) | |
| * | |
| * 개인정보 수집·이용/취급위탁/제3자 제공/마케팅 동의 등 약관 표시 블록을 정형화한다. | |
| * | |
| * @param array $informList 약관 목록 (각 항목에 sno, informNm 포함. modeFl 이 'y' 아니면 '사용안함' 표기) | |
| * @param array $consentBySno 동의 상태 맵 (sno => 'y'/'n') | |
| * @param bool $denyWhenMissing 미응답(y/n 아님)을 '동의안함'으로 표시할지 여부. false면 해당 항목 스킵 | |
| * @return array [['informNm' => string, 'label' => string, 'unused'? => bool], ...] (unused=true 면 미사용 약관 → 항목명 없이 '사용안함'만 표기) | |
| */ | |
| public static function makeConsentItems(array $informList, array $consentBySno, bool $denyWhenMissing = false, string $agreementDt = ''): array | |
| { | |
| $items = []; | |
| foreach ($informList as $inform) { | |
| // 개별 약관 미사용(modeFl != 'y')이면 동의 여부와 무관하게 '사용안함' 표기 | |
| if (($inform['modeFl'] ?? 'y') !== 'y') { | |
| $items[] = ['informNm' => $inform['informNm'], 'label' => '사용안함', 'unused' => true]; | |
| continue; | |
| } | |
| $flag = $consentBySno[$inform['sno']] ?? ''; | |
| if ($flag === 'y') { | |
| // 동의: 년월일시분초까지 표기 | |
| $label = '동의함' . ($agreementDt !== '' ? '(' . DateTimeUtils::dateFormat('Y-m-d H:i:s', $agreementDt) . ')' : ''); | |
| } elseif ($flag === 'n' || $denyWhenMissing) { | |
| // 미동의: 년월일까지만 표기 (일시 없거나 미응답이면 날짜 생략) | |
| $label = '동의안함' . (($agreementDt !== '' && $flag === 'n') ? '(' . DateTimeUtils::dateFormat('Y-m-d', $agreementDt) . ')' : ''); | |
| } else { | |
| continue; | |
| } | |
| $items[] = ['informNm' => $inform['informNm'], 'label' => $label]; | |
| } | |
| return $items; | |
| } | |
| /** | |
| * 회원 약관 동의 표시용 행 데이터 생성. 약관 행 설정 배열을 받아 뷰에서 그대로 출력할 표시용 배열을 반환한다 (HTML 미생성 — 마크업은 뷰가 담당). | |
| * 약관이 늘어도 호출부에서 배열 항목만 추가하면 되고 메서드 시그니처는 불변. | |
| * | |
| * @param array $agreements 약관 행 목록. 각 항목: | |
| * - title string 제목 (뷰 <th> 출력용) | |
| * - tooltipSeq string data-tooltip-seq 값(선택) | |
| * - use bool 약관 사용/표시 여부 (false면 '사용안함') | |
| * - informs array 약관 목록 (sno, informNm) — use=true 일 때만 참조 | |
| * - flags mixed 동의 상태. sno=>('y'/'n') 배열(개인정보 항목별) 또는 단일 'y'/'n' 문자열(마케팅) | |
| * - denyWhenMissing bool 미응답(y/n 아님)을 '동의안함'으로 표시할지. false면 해당 항목 스킵 | |
| * - agreementDt string 동의/미동의 일시(선택). 지정 시 동의함(초까지)/동의안함(날짜까지)에 괄호로 병기. 컬럼 공통 값 | |
| * @return array 표시용 행 목록. 각 항목: [title, tooltipSeq, lines(표시 문자열 배열)] | |
| */ | |
| public static function buildPrivateAgreementRows(array $agreements): array | |
| { | |
| $rows = []; | |
| foreach ($agreements as $agreement) { | |
| $lines = []; | |
| if (!empty($agreement['use'])) { | |
| $informs = $agreement['informs'] ?? []; | |
| $flags = $agreement['flags'] ?? []; | |
| // 단일 플래그 문자열이면 전 항목에 동일 적용하도록 sno 맵으로 변환 | |
| if (!is_array($flags)) { | |
| $singleFlag = (string) $flags; | |
| $flags = []; | |
| foreach ($informs as $inform) { | |
| $flags[$inform['sno']] = $singleFlag; | |
| } | |
| } | |
| $agreementDt = (string) ($agreement['agreementDt'] ?? ''); | |
| $unusedShown = false; | |
| foreach (self::makeConsentItems($informs, $flags, !empty($agreement['denyWhenMissing']), $agreementDt) as $item) { | |
| if (!empty($item['unused'])) { | |
| // 미사용 약관(modeFl != 'y')은 항목명/동의여부 없이 '사용안함'만, 그룹당 1회만 표기 | |
| if ($unusedShown) { | |
| continue; | |
| } | |
| $unusedShown = true; | |
| $lines[] = '사용안함'; | |
| } else { | |
| $lines[] = '- ' . $item['informNm'] . ' : ' . $item['label']; | |
| } | |
| } | |
| } else { | |
| $lines[] = '사용안함'; | |
| } | |
| $rows[] = [ | |
| 'title' => $agreement['title'] ?? '', | |
| 'tooltipSeq' => $agreement['tooltipSeq'] ?? '', | |
| 'lines' => $lines, | |
| ]; | |
| } | |
| return $rows; | |
| } | |
| /** | |
| * 광고성 수신 동의(이메일/모바일 메시지) 표시용 라인 데이터 생성. 채널 사용여부 + 수신 flag + 최종 수신동의일(es_memberHistory 파생)로 | |
| * 동의함(초까지)/동의안함(날짜까지) 라벨을 조립한다 (HTML 미생성 — 마크업은 뷰가 담당). | |
| * | |
| * @param array $advertisingReceive gd_policy('member.advertisingReceive') — email.use / mobile.use ('y'/'n') | |
| * @param array $data 회원 데이터 (maillingFl, smsFl, lastReceiveAgreementDt[mail|sms], entryDt) | |
| * @return array 표시 문자열 배열. 채널 모두 미사용이면 ['사용안함'] | |
| */ | |
| public static function buildAdvertisingReceiveLines(array $advertisingReceive, array $data): array | |
| { | |
| $mailUse = (($advertisingReceive['email']['use'] ?? 'n') === 'y'); | |
| $smsUse = (($advertisingReceive['mobile']['use'] ?? 'n') === 'y'); | |
| if (!$mailUse && !$smsUse) { | |
| return ['사용안함']; | |
| } | |
| $channels = []; | |
| if ($mailUse) { | |
| $channels[] = ['label' => '이메일', 'flag' => $data['maillingFl'] ?? 'n', 'dt' => $data['lastReceiveAgreementDt']['mail'] ?? ($data['entryDt'] ?? '')]; | |
| } | |
| if ($smsUse) { | |
| $channels[] = ['label' => '모바일 메시지', 'flag' => $data['smsFl'] ?? 'n', 'dt' => $data['lastReceiveAgreementDt']['sms'] ?? ($data['entryDt'] ?? '')]; | |
| } | |
| $lines = []; | |
| foreach ($channels as $channel) { | |
| // 동의: 년월일시분초까지 / 미동의: 년월일까지 (일시 없으면 괄호 생략) | |
| if ($channel['flag'] === 'y') { | |
| $label = '동의함' . ($channel['dt'] !== '' ? '(' . DateTimeUtils::dateFormat('Y-m-d H:i:s', $channel['dt']) . ')' : ''); | |
| } else { | |
| $label = '동의안함' . ($channel['dt'] !== '' ? '(' . DateTimeUtils::dateFormat('Y-m-d', $channel['dt']) . ')' : ''); | |
| } | |
| $lines[] = '- ' . $channel['label'] . ' : ' . $label; | |
| } | |
| return $lines; | |
| } | |
| /** | |
| * 비밀번호 입력 필드 placeholder 문구 생성 (회원 등록/수정 공통) | |
| * | |
| * @param array $joinField 회원가입 항목 정책 (passwordCombineFl, memPw.minlen/maxlen) | |
| * @return string 조합 규칙 + 길이 안내 문구 | |
| */ | |
| public static function buildPasswordPlaceholder(array $joinField): string | |
| { | |
| $combine = match ($joinField['passwordCombineFl'] ?? '') { | |
| 'engNum' => '영문대문자/영문소문자/숫자 중 2개 이상 포함', | |
| 'engNumEtc' => '영문대문자/영문소문자/숫자/특수문자 중 3개 이상 포함', | |
| default => '영문대문자/영문소문자 or 숫자', | |
| }; | |
| return $combine . ', ' . $joinField['memPw']['minlen'] . '~' . $joinField['memPw']['maxlen'] . '자'; | |
| } | |
| /** | |
| * 로그인 되었는 지를 체크 (회원/비회원) | |
| * | |
| $data['agreementInfoFl'] = gd_isset($arrData['agreementInfoFl'], 'n'); | |
| $data['privateApprovalFl'] = gd_isset($arrData['privateApprovalFl'], 'n'); | |
| $data['under14ConsentFl'] = gd_isset($arrData['under14ConsentFl'], 'n'); | |
| // 광고성 수신 동의 (이메일 수신 동의 / 모바일 메시지 수신 동의) | |
| $data['maillingFl'] = gd_isset($arrData['maillingFl'], 'n'); | |
| $data['smsFl'] = gd_isset($arrData['smsFl'], 'n'); | |
| //이용약관 체크값 설정 | |
| $myPage = \App::load('\\Component\\Member\\MyPage'); | |
| $data['privateApprovalOptionFl'] = gd_isset($agreementData['privateApprovalOptionFl']); | |
| $data['privateOfferFl'] = gd_isset($agreementData['privateOfferFl']); | |
| $data['privateConsignFl'] = gd_isset($agreementData['privateConsignFl']); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 | |
| $data['privateMarketingConsentOptionFl'] = gd_isset($agreementData['privateMarketingConsentOptionFl']); | |
| // 인증설정체크해서 데이터 추가 useDataJoinFl | |
| $dreamInfo = gd_policy('member.auth_cellphone'); | |
| $params['sexFl'] = $params['sexFl'] ?? ''; | |
| $params['maillingFl'] = $params['maillingFl'] ?? ''; | |
| $params['smsFl'] = $params['smsFl'] ?? ''; | |
| $params['privateMarketingConsentOptionFl'] = $params['privateMarketingConsentOptionFl'] ?? ''; | |
| $params['calendarFl'] = $params['calendarFl'] ?? ''; | |
| $params['expirationFl'] = $params['expirationFl'] ?? ''; | |
| $checked['sexFl'][$params['sexFl']] = | |
| $checked['maillingFl'][$params['maillingFl']] = | |
| $checked['smsFl'][$params['smsFl']] = | |
| $checked['privateMarketingConsentOptionFl'][$params['privateMarketingConsentOptionFl']] = | |
| $checked['calendarFl'][$params['calendarFl']] = | |
| $checked['expirationFl'][$params['expirationFl']] = 'checked="checked"'; | |
변경 전MemberModifyController.php
| use Framework\Debug\Exception\AlertBackException; | |
| use Framework\Utility\DateTimeUtils; | |
| use Framework\Utility\StringUtils; | |
| /** | |
| $memberData = []; | |
| $memberService->getMemberDataWithChecked($memNo, $memberData, $checked); | |
| $memberData = gd_array_merge($memberData, $memberService->getLastAgreementNotificationByMember($memNo)); | |
| $privateApprovalOption = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_APPROVAL_OPTION, 'sno,informNm,content', true, $memberData['mallSno']); | |
| $privateOffer = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_OFFER, 'sno,informNm,content', true, $memberData['mallSno']); | |
| $privateConsign = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_CONSIGN, 'sno,informNm,content', true, $memberData['mallSno']); | |
| $memberData = gd_array_merge($memberData, $historyService->getLastReceiveAgreementByMember($memNo)); | |
| $memberHistory = $historyService->getMemberHistory($memNo, $request->get()->get('page', 1), $request->get()->get('pageNum', 10)); | |
| $memberData['recommendCnt'] = $memberService->getRecommendCount($memberData['memId']); | |
| if ($memberData['rncheck'] == 'realname') { | |
| $additionalCertification[$key]['file'] = $companyCertification->getCertificationByMemNoAndType($memNo, $key); | |
| } | |
| $this->setData('mode', 'modify'); | |
| $this->setData('joinField', \Component\Member\Util\MemberUtil::getJoinField($memberData['mallSno'])); | |
| $this->setData('htmlExtra', \Component\Member\Util\MemberUtil::makeExtraField($memberData)); | |
| $this->setData('data', $memberData); | |
| $this->setData('checked', $checked); | |
| $this->setData('privateApprovalOption', $privateApprovalOption); | |
| $this->setData('privateOffer', $privateOffer); | |
| $this->setData('privateConsign', $privateConsign); | |
| $this->setData('groupCouponConditionManual', gd_policy('member.group')['couponConditionManual']); | |
| $this->setData('hidePasswordBlock', $hidePasswordBlock); | |
| $this->setData('certification', $certification); | |
변경 후MemberModifyController.php
| use Framework\Debug\Exception\AlertBackException; | |
| use Framework\Utility\DateTimeUtils; | |
| use Framework\Utility\SkinUtils; | |
| use Framework\Utility\StringUtils; | |
| /** | |
| $memberData = []; | |
| $memberService->getMemberDataWithChecked($memNo, $memberData, $checked); | |
| $memberData = gd_array_merge($memberData, $memberService->getLastAgreementNotificationByMember($memNo)); | |
| $privateApprovalOption = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_APPROVAL_OPTION, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateOffer = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_OFFER, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateConsign = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_CONSIGN, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateMarketingMember = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_MARKETING_MEMBER, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateMarketingMemberUse = (($privateMarketingMember[0]['modeFl'] ?? 'n') === 'y'); | |
| // 개인정보 동의 항목별 마지막 변경 일시(컬럼 공통). 이력 없으면 가입일(entryDt) 폴백 | |
| $privateAgreementDt = $historyService->getLastPrivateAgreementDateByMember((int) $memNo); | |
| $memberEntryDt = $memberData['entryDt'] ?? ''; | |
| // 약관 동의 표시 행 조립 (개인정보 항목별/마케팅). 표시용 데이터 변환은 MemberUtil::buildPrivateAgreementRows | |
| $privateAgreements = [ | |
| ['title' => '개인정보 수집·이용', 'tooltipSeq' => '036', 'use' => is_array($memberData['privateApprovalOptionFl'] ?? null), 'informs' => $privateApprovalOption, 'flags' => $memberData['privateApprovalOptionFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateApprovalOptionFl'] ?? $memberEntryDt], | |
| ['title' => '개인정보 취급위탁', 'tooltipSeq' => '037', 'use' => is_array($memberData['privateConsignFl'] ?? null), 'informs' => $privateConsign, 'flags' => $memberData['privateConsignFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateConsignFl'] ?? $memberEntryDt], | |
| ['title' => '개인정보 제3자 제공', 'tooltipSeq' => '038', 'use' => is_array($memberData['privateOfferFl'] ?? null), 'informs' => $privateOffer, 'flags' => $memberData['privateOfferFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateOfferFl'] ?? $memberEntryDt], | |
| ['title' => '마케팅 목적 개인정보 수집 및 이용 동의', 'tooltipSeq' => '039', 'use' => $privateMarketingMemberUse, 'informs' => $privateMarketingMember, 'flags' => $memberData['privateMarketingConsentOptionFl'] ?? '', 'denyWhenMissing' => true, 'agreementDt' => $privateAgreementDt['privateMarketingConsentOptionFl'] ?? $memberEntryDt], | |
| ]; | |
| $advertisingReceiveChannelUse = $buyerInformService->getAdvertisingReceiveChannelUse($memberData['mallSno']); | |
| $advertisingReceive = [ | |
| 'email' => ['use' => $advertisingReceiveChannelUse['mail']], | |
| 'mobile' => ['use' => $advertisingReceiveChannelUse['sms']], | |
| ]; | |
| $memberData = gd_array_merge($memberData, $historyService->getLastReceiveAgreementByMember($memNo)); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의/거부일 (없으면 '-') | |
| $memberData['privateMktAgreementDt'] = $memberData['lastReceiveAgreementDt']['privateMkt'] ?? '-'; | |
| $memberHistory = $historyService->getMemberHistory($memNo, $request->get()->get('page', 1), $request->get()->get('pageNum', 10)); | |
| $memberData['recommendCnt'] = $memberService->getRecommendCount($memberData['memId']); | |
| if ($memberData['rncheck'] == 'realname') { | |
| $additionalCertification[$key]['file'] = $companyCertification->getCertificationByMemNoAndType($memNo, $key); | |
| } | |
| // NCDS 템플릿 설정 | |
| $this->setData('adminBodySubClass', 'ncds'); | |
| $this->setData('mode', 'modify'); | |
| $this->setData('callPrefixList', SkinUtils::getCallPrefixList()); | |
| $joinField = \Component\Member\Util\MemberUtil::getJoinField($memberData['mallSno']); | |
| $this->setData('joinField', $joinField); | |
| $this->setData('passwordPlaceholder', \Component\Member\Util\MemberUtil::buildPasswordPlaceholder($joinField)); | |
| $this->setData('htmlExtra', \Component\Member\Util\MemberUtil::makeExtraField($memberData)); | |
| $this->setData('data', $memberData); | |
| $this->setData('checked', $checked); | |
| $this->setData('privateApprovalOption', $privateApprovalOption); | |
| $this->setData('privateOffer', $privateOffer); | |
| $this->setData('privateConsign', $privateConsign); | |
| $this->setData('privateMarketingMember', $privateMarketingMember); | |
| $this->setData('privateMarketingMemberUse', $privateMarketingMemberUse); | |
| $this->setData('privateAgreementRows', \Component\Member\Util\MemberUtil::buildPrivateAgreementRows($privateAgreements)); | |
| $this->setData('advertisingReceive', $advertisingReceive); | |
| $this->setData('advertisingReceiveLines', \Component\Member\Util\MemberUtil::buildAdvertisingReceiveLines($advertisingReceive, $memberData)); | |
| $this->setData('groupCouponConditionManual', gd_policy('member.group')['couponConditionManual']); | |
| $this->setData('hidePasswordBlock', $hidePasswordBlock); | |
| $this->setData('certification', $certification); | |
변경 전MemberPsController.php
| use Framework\Debug\Exception\LayerException; | |
| use Origin\Service\Policy\Member\JoinPolicyService; | |
| use Origin\Service\Member\KakaoSync\KakaoSyncSettingService; | |
| /** | |
| * Class 회원 처리 | |
| switch ($requestAllParams['mode']) { | |
| case 'register': | |
| $memberService->register(new MemberVO($requestPostParams)); | |
| $this->json(__("회원등록을 성공하였습니다.")); | |
| break; | |
| case 'modify': | |
| $memberAdminService->modifyMemberData($requestAllParams); | |
| $this->json(__('저장이 완료되었습니다.')); | |
| break; | |
| throw new Exception(__('요청을 처리할 페이지를 찾을 수 없습니다.'), 404); | |
| break; | |
| } | |
| } catch (Exception $e) { | |
| if ($request->isAjax() === true) { | |
| switch ($e->getCode()) { | |
변경 후MemberPsController.php
| use Framework\Debug\Exception\LayerException; | |
| use Origin\Service\Policy\Member\JoinPolicyService; | |
| use Origin\Service\Member\KakaoSync\KakaoSyncSettingService; | |
| use Respect\Validation\Exceptions\NestedValidationException; | |
| use Respect\Validation\Validator; | |
| /** | |
| * Class 회원 처리 | |
| switch ($requestAllParams['mode']) { | |
| case 'register': | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 형식 검증 | |
| Validator::arrayVal() | |
| ->key('privateMarketingConsentOptionFl', Validator::in(['y', 'n']), false) | |
| ->assert($requestAllParams); | |
| $memberService->register(new MemberVO($requestPostParams)); | |
| $this->json(__("회원등록을 성공하였습니다.")); | |
| break; | |
| case 'modify': | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 형식 검증 | |
| Validator::arrayVal() | |
| ->key('privateMarketingConsentOptionFl', Validator::in(['y', 'n']), false) | |
| ->assert($requestAllParams); | |
| $memberAdminService->modifyMemberData($requestAllParams); | |
| $this->json(__('저장이 완료되었습니다.')); | |
| break; | |
| throw new Exception(__('요청을 처리할 페이지를 찾을 수 없습니다.'), 404); | |
| break; | |
| } | |
| } catch (NestedValidationException $e) { | |
| \Logger::channel('member')->warning('member.validate.fail', [ | |
| 'mode' => $requestAllParams['mode'] ?? '', | |
| 'errors' => $e->getMessages(), | |
| ]); | |
| if ($request->isAjax()) { | |
| $this->json( | |
| data: [ | |
| 'success' => false, | |
| 'message' => __('잘못된 요청입니다.'), | |
| 'data' => [] | |
| ], | |
| ); | |
| } else { | |
| throw new LayerException(__('잘못된 요청입니다.'), $e->getCode(), $e, null, 3000); | |
| } | |
| } catch (Exception $e) { | |
| if ($request->isAjax() === true) { | |
| switch ($e->getCode()) { | |
변경 전MemberRegisterController.php
| use Component\Member\Group\Util as GroupUtil; | |
| use Component\Member\MemberVO; | |
| use Component\Member\Util\MemberUtil; | |
| /** | |
| * Class 회원 등록 | |
| $companyCertification = \App::getInstance(\Component\Member\Company\CompanyCertification::class); | |
| $certificationMaxFileSize = $companyCertification->getCompanyCertificationFileSize(); | |
| $this->setData('mode', 'register'); | |
| $this->setData('joinField', $joinField); | |
| $this->setData('htmlExtra', MemberUtil::makeExtraField()); | |
| $this->setData('data', $member); | |
| $this->setData('checked', $vo->toChecked()); | |
| $this->setData('certificationMaxFileSize', $certificationMaxFileSize); | |
변경 후MemberRegisterController.php
| use Component\Member\Group\Util as GroupUtil; | |
| use Component\Member\MemberVO; | |
| use Component\Member\Util\MemberUtil; | |
| use Framework\Utility\SkinUtils; | |
| /** | |
| * Class 회원 등록 | |
| $companyCertification = \App::getInstance(\Component\Member\Company\CompanyCertification::class); | |
| $certificationMaxFileSize = $companyCertification->getCompanyCertificationFileSize(); | |
| // 신규 회원은 동의 이력이 없으므로 전부 '사용안함' | |
| $privateAgreements = [ | |
| ['title' => '개인정보 수집·이용', 'use' => false], | |
| ['title' => '개인정보 취급위탁', 'use' => false], | |
| ['title' => '개인정보 제3자 제공', 'use' => false], | |
| ['title' => '마케팅 목적 개인정보 수집 및 이용 동의', 'use' => false], | |
| ]; | |
| $buyerInformService = \App::getInstance('BuyerInform'); | |
| if (!is_object($buyerInformService)) { | |
| $buyerInformService = new \Component\Agreement\BuyerInform(); | |
| } | |
| $mallSno = (int) (\Component\Mall\Mall::getSession('sno') ?: DEFAULT_MALL_NUMBER); | |
| // 신규 회원은 동의 이력이 없으므로 광고성 수신 동의도 '사용안함' (몰 설정과 무관) | |
| $advertisingReceive = [ | |
| 'email' => ['use' => 'n'], | |
| 'mobile' => ['use' => 'n'], | |
| ]; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 약관 사용 여부 (약관 사용 시에만 노출) | |
| $privateMarketingMember = $buyerInformService->getInformDataArray(\Component\Agreement\BuyerInformCode::PRIVATE_MARKETING_MEMBER, 'sno,informNm,content,modeFl', true, $mallSno); | |
| $privateMarketingMemberUse = (($privateMarketingMember[0]['modeFl'] ?? 'n') === 'y'); | |
| // NCDS 템플릿 설정 | |
| $this->setData('adminBodySubClass', 'ncds'); | |
| $this->setData('mode', 'register'); | |
| $this->setData('callPrefixList', SkinUtils::getCallPrefixList()); | |
| $this->setData('joinField', $joinField); | |
| $this->setData('passwordPlaceholder', MemberUtil::buildPasswordPlaceholder($joinField)); | |
| $this->setData('htmlExtra', MemberUtil::makeExtraField()); | |
| $this->setData('privateAgreementRows', MemberUtil::buildPrivateAgreementRows($privateAgreements)); | |
| $this->setData('advertisingReceive', $advertisingReceive); | |
| $this->setData('advertisingReceiveLines', MemberUtil::buildAdvertisingReceiveLines($advertisingReceive, $member)); | |
| $this->setData('privateMarketingMemberUse', $privateMarketingMemberUse); | |
| $this->setData('data', $member); | |
| $this->setData('checked', $vo->toChecked()); | |
| $this->setData('certificationMaxFileSize', $certificationMaxFileSize); | |
변경 전BaseAgreementWithPrivateController.php
| $privateApprovalTableOption = $agreementWithPrivateUtil->getTableByPrivateApprovalOption($mallSno); | |
| $privateConsignTable = $agreementWithPrivateUtil->getTableByPrivateConsign($mallSno); | |
| $privateOfferTable = $agreementWithPrivateUtil->getTableByPrivateOffer($mallSno); | |
| $privateGuestOrder = $buyerInform->getInformData(BuyerInformCode::PRIVATE_GUEST_ORDER, $mallSno); | |
| $privateGuestBoardWrite = $buyerInform->getInformData(BuyerInformCode::PRIVATE_GUEST_BOARD_WRITE, $mallSno); | |
| $privateGuestCommentWrite = $buyerInform->getInformData(BuyerInformCode::PRIVATE_GUEST_COMMENT_WRITE, $mallSno); | |
| $this->setData('privateApprovalTableOption', $privateApprovalTableOption); | |
| $this->setData('privateConsignTable', $privateConsignTable); | |
| $this->setData('privateOfferTable', $privateOfferTable); | |
| $this->setData('privateGuestOrderContent', $privateGuestOrder['content']); | |
| $this->setData('privateGuestBoardWriteContent', $privateGuestBoardWrite['content']); | |
| $this->setData('privateGuestCommentWriteContent', $privateGuestCommentWrite['content']); | |
변경 후BaseAgreementWithPrivateController.php
| $privateApprovalTableOption = $agreementWithPrivateUtil->getTableByPrivateApprovalOption($mallSno); | |
| $privateConsignTable = $agreementWithPrivateUtil->getTableByPrivateConsign($mallSno); | |
| $privateOfferTable = $agreementWithPrivateUtil->getTableByPrivateOffer($mallSno); | |
| $privateMarketingMember = $buyerInform->getInformData(BuyerInformCode::PRIVATE_MARKETING_MEMBER, $mallSno); | |
| $advertisingReceive = $buyerInform->getInformData(BuyerInformCode::ADVERTISING_RECEIVE, $mallSno); | |
| //--- 광고성 수신 동의 채널 사용여부 (es_config member.advertisingReceive) 및 회원가입 항목(이메일/휴대폰번호) 사용여부 | |
| $advertisingReceiveChannel = gd_policy('member.advertisingReceive', $mallSno); | |
| $joinItemPolicy = \App::load('Component\\Policy\\JoinItemPolicy'); | |
| $joinItem = $joinItemPolicy->getPolicy($mallSno); | |
| $privateGuestOrder = $buyerInform->getInformData(BuyerInformCode::PRIVATE_GUEST_ORDER, $mallSno); | |
| $privateGuestBoardWrite = $buyerInform->getInformData(BuyerInformCode::PRIVATE_GUEST_BOARD_WRITE, $mallSno); | |
| $privateGuestCommentWrite = $buyerInform->getInformData(BuyerInformCode::PRIVATE_GUEST_COMMENT_WRITE, $mallSno); | |
| $this->setData('privateApprovalTableOption', $privateApprovalTableOption); | |
| $this->setData('privateConsignTable', $privateConsignTable); | |
| $this->setData('privateOfferTable', $privateOfferTable); | |
| $this->setData('privateMarketingMember', $privateMarketingMember); | |
| $this->setData('advertisingReceive', $advertisingReceive); | |
| $this->setData('advertisingReceiveMailUse', $advertisingReceiveChannel['email']['use'] ?? 'n'); | |
| $this->setData('advertisingReceiveSmsUse', $advertisingReceiveChannel['mobile']['use'] ?? 'n'); | |
| $this->setData('joinItemEmailUse', $joinItem['email']['use'] ?? 'n'); | |
| $this->setData('joinItemCellPhoneUse', $joinItem['cellPhone']['use'] ?? 'n'); | |
| $this->setData('privateGuestOrderContent', $privateGuestOrder['content']); | |
| $this->setData('privateGuestBoardWriteContent', $privateGuestBoardWrite['content']); | |
| $this->setData('privateGuestCommentWriteContent', $privateGuestCommentWrite['content']); | |
변경 전BaseAgreementWithPrivatePsController.php
| use Framework\Debug\Exception\LayerException; | |
| use Origin\Service\Member\KakaoSync\KakaoSyncSettingService; | |
| use Request; | |
| /** | |
| * Class 약관/개인정보설정 처리 페이지 | |
| break; | |
| // --- 개인정보수집 동의항목 설정 | |
| case 'privateItem': | |
| \DB::begin_tran(); | |
| $removeSnoArray = json_decode(Request::post()->get('removeSno', [])); | |
| $mallSno = gd_isset(Request::post()->get('mallSno'), 1); | |
| foreach ($removeSnoArray as $key => $val) { | |
| $buyerInform->savePrivateConsign(Request::post()->all()); | |
| $buyerInform->savePrivateOffer(Request::post()->all()); | |
| $buyerInform->saveInformData(BuyerInformCode::PRIVATE_MARKETING, Request::post()->get('privateMarketingWriteWrite')); | |
| // 카카오 싱크 update 토필 발행 | |
| $kakaoSyncSettingService = \App::getInstance(KakaoSyncSettingService::class); | |
| $kakaoSyncSettingService->syncSettingWhenSaveTerms(); | |
| \DB::commit(); | |
| $this->json( | |
| [ | |
| 'message' => __('저장이 완료되었습니다.'), | |
| 'code' => 200, | |
| ] | |
| ); | |
| throw new Exception(__('요청을 처리할 페이지를 찾을 수 없습니다.'), 404); | |
| break; | |
| } | |
| } catch (Exception $e) { | |
| \DB::rollback(); | |
| if (Request::isAjax()) { | |
변경 후BaseAgreementWithPrivatePsController.php
| use Framework\Debug\Exception\LayerException; | |
| use Origin\Service\Member\KakaoSync\KakaoSyncSettingService; | |
| use Request; | |
| use Respect\Validation\Exceptions\ValidationException; | |
| use Respect\Validation\Validator; | |
| /** | |
| * Class 약관/개인정보설정 처리 페이지 | |
| break; | |
| // --- 개인정보수집 동의항목 설정 | |
| case 'privateItem': | |
| // post 유효성 검사 | |
| Validator::arrayVal() | |
| ->key('privateMarketingMemberFl', Validator::in(['y', 'n']), false) | |
| ->key('privateMarketingMemberNoticePopupFl', Validator::in(['y', 'n']), false) | |
| ->key('advertisingReceiveMailFl', Validator::in(['y', 'n']), false) | |
| ->key('advertisingReceiveSmsFl', Validator::in(['y', 'n']), false) | |
| ->assert(Request::post()->all()); | |
| \DB::begin_tran(); | |
| // [선택] 광고성 수신 동의 채널을 사용하면서 [선택] 마케팅 목적 개인정보 수집 및 이용 동의를 사용하지 않으면 저장 차단 | |
| $advertisingUse = Request::post()->get('advertisingReceiveMailFl', 'n') === 'y' || Request::post()->get('advertisingReceiveSmsFl', 'n') === 'y'; | |
| if ($advertisingUse && Request::post()->get('privateMarketingMemberFl', 'n') !== 'y') { | |
| throw new Exception(__("[선택] 마케팅 목적 개인정보 수집 및 이용 동의 약관을 '사용'으로 설정해주세요. [선택] 광고성 수신 동의 약관을 사용하기 위해서는 [선택] 마케팅 목적 개인정보 수집 및 이용 동의 약관을 반드시 사용해야 합니다."), 400); | |
| } | |
| $removeSnoArray = json_decode(Request::post()->get('removeSno', [])); | |
| $mallSno = gd_isset(Request::post()->get('mallSno'), 1); | |
| foreach ($removeSnoArray as $key => $val) { | |
| $buyerInform->savePrivateConsign(Request::post()->all()); | |
| $buyerInform->savePrivateOffer(Request::post()->all()); | |
| $buyerInform->saveInformData(BuyerInformCode::PRIVATE_MARKETING, Request::post()->get('privateMarketingWriteWrite')); | |
| $buyerInform->saveInformData(BuyerInformCode::PRIVATE_MARKETING_MEMBER, Request::post()->get('privateMarketingMemberWriteWrite'), $mallSno); | |
| $buyerInform->saveInformData(BuyerInformCode::ADVERTISING_RECEIVE, Request::post()->get('advertisingReceiveWriteWrite'), $mallSno); | |
| $advertisingReceiveChannels = $buyerInform->resolveAdvertisingReceiveChannels(Request::post()->all(), (int)$mallSno); | |
| $policy->setValue('member.advertisingReceive', $advertisingReceiveChannels, $mallSno); | |
| // 카카오 싱크 update 토필 발행 | |
| $kakaoSyncSettingService = \App::getInstance(KakaoSyncSettingService::class); | |
| $kakaoSyncSettingService->syncSettingWhenSaveTerms(); | |
| \DB::commit(); | |
| // [선택] 마케팅 목적 개인정보 수집 및 이용 동의를 사용하면서 [선택] 광고성 수신 동의를 사용하지 않으면 안내 문구 노출 | |
| $message = __('저장이 완료되었습니다.'); | |
| $marketingMemberUse = Request::post()->get('privateMarketingMemberFl', 'n') === 'y'; | |
| $advertisingUse = Request::post()->get('advertisingReceiveMailFl', 'n') === 'y' || Request::post()->get('advertisingReceiveSmsFl', 'n') === 'y'; | |
| if ($marketingMemberUse && !$advertisingUse) { | |
| $message .= ' ' . __('[선택] 마케팅 목적 개인정보 수집 및 이용 동의 약관만 사용하시면 광고성 메시지를 발송할 수 없습니다. 광고성 메시지를 보내시려면 [선택] 광고성 수신 동의 약관도 함께 사용해주세요.'); | |
| } | |
| $this->json( | |
| [ | |
| 'message' => $message, | |
| 'code' => 200, | |
| ] | |
| ); | |
| throw new Exception(__('요청을 처리할 페이지를 찾을 수 없습니다.'), 404); | |
| break; | |
| } | |
| } catch (ValidationException $e) { | |
| \Logger::channel('agreement')->warning(__METHOD__, ['error' => $e->getMessage()]); | |
| $this->json(['error' => ['code' => 400, 'message' => __('잘못된 요청입니다.')]]); | |
| } catch (Exception $e) { | |
| \DB::rollback(); | |
| if (Request::isAjax()) { | |
변경 전MemberCrmDetailController.php
| $session->set(Member::SESSION_MODIFY_MEMBER_INFO, $memberData); | |
| //@formatter:off | |
| $checked = SkinUtils::setChecked(['memberFl', 'appFl', 'maillingFl', 'smsFl', 'sexFl', 'marriFl', 'expirationFl',], $memberData); | |
| //@formatter:on | |
| $memberData['privateApprovalOptionFl'] = json_decode(stripslashes($memberData['privateApprovalOptionFl']), true); | |
| $memberData['privateOfferFl'] = json_decode(stripslashes($memberData['privateOfferFl']), true); | |
| /** @var \Bundle\Component\Agreement\BuyerInform $buyerInform */ | |
| $buyerInform = App::load('\\Component\\Agreement\\BuyerInform'); | |
| $privateApprovalOption = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_APPROVAL_OPTION, 'sno,informNm,content', true, $memberData['mallSno']); | |
| $privateOffer = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_OFFER, 'sno,informNm,content', true, $memberData['mallSno']); | |
| $privateConsign = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_CONSIGN, 'sno,informNm,content', true, $memberData['mallSno']); | |
| // 하이픈 제거 | |
| $memberData['fax'] = str_replace("-", "", $memberData['fax']); | |
| $this->setData('memberData', $memberData); | |
| $this->setData('mode', 'modify'); | |
| $this->setData('modeTxt', '회원수정'); | |
| $this->setData('joinField', MemberUtil::getJoinField($memberData['mallSno'])); | |
| $this->setData('htmlExtra', MemberUtil::makeExtraField($memberData)); | |
| $this->setData('data', $memberData); | |
| $this->setData('checked', $checked); | |
| $this->setData('history', $memberHistory['data']); | |
| $this->setData('privateApprovalOption', $privateApprovalOption); | |
| $this->setData('privateOffer', $privateOffer); | |
| $this->setData('privateConsign', $privateConsign); | |
| $this->setData('groupCouponConditionManual', gd_policy('member.group')['couponConditionManual']); | |
| $this->setData('hidePasswordBlock', $hidePasswordBlock); | |
| $this->setData('certification', $certification); | |
변경 후MemberCrmDetailController.php
| $session->set(Member::SESSION_MODIFY_MEMBER_INFO, $memberData); | |
| //@formatter:off | |
| $checked = SkinUtils::setChecked(['memberFl', 'appFl', 'maillingFl', 'smsFl', 'sexFl', 'marriFl', 'expirationFl', 'privateMarketingConsentOptionFl',], $memberData); | |
| //@formatter:on | |
| $memberData['privateApprovalOptionFl'] = json_decode(stripslashes($memberData['privateApprovalOptionFl']), true); | |
| $memberData['privateOfferFl'] = json_decode(stripslashes($memberData['privateOfferFl']), true); | |
| /** @var \Bundle\Component\Agreement\BuyerInform $buyerInform */ | |
| $buyerInform = App::load('\\Component\\Agreement\\BuyerInform'); | |
| $privateApprovalOption = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_APPROVAL_OPTION, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateOffer = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_OFFER, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateConsign = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_CONSIGN, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateMarketingMember = $buyerInform->getInformDataArray(BuyerInformCode::PRIVATE_MARKETING_MEMBER, 'sno,informNm,content,modeFl', true, $memberData['mallSno']); | |
| $privateMarketingMemberUse = (($privateMarketingMember[0]['modeFl'] ?? 'n') === 'y'); | |
| // 개인정보 동의 항목별 마지막 변경 일시(컬럼 공통). 이력 없으면 가입일(entryDt) 폴백 | |
| $privateAgreementDt = $history->getLastPrivateAgreementDateByMember((int) $memberNo); | |
| $memberEntryDt = $memberData['entryDt'] ?? ''; | |
| // 약관 동의 표시 행 조립 (개인정보 항목별/마케팅). 표시용 데이터 변환은 MemberUtil::buildPrivateAgreementRows | |
| $privateAgreements = [ | |
| ['title' => '개인정보 수집·이용', 'tooltipSeq' => '036', 'use' => is_array($memberData['privateApprovalOptionFl'] ?? null), 'informs' => $privateApprovalOption, 'flags' => $memberData['privateApprovalOptionFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateApprovalOptionFl'] ?? $memberEntryDt], | |
| ['title' => '개인정보 취급위탁', 'tooltipSeq' => '037', 'use' => is_array($memberData['privateConsignFl'] ?? null), 'informs' => $privateConsign, 'flags' => $memberData['privateConsignFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateConsignFl'] ?? $memberEntryDt], | |
| ['title' => '개인정보 제3자 제공', 'tooltipSeq' => '038', 'use' => is_array($memberData['privateOfferFl'] ?? null), 'informs' => $privateOffer, 'flags' => $memberData['privateOfferFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateOfferFl'] ?? $memberEntryDt], | |
| ['title' => '마케팅 목적 개인정보 수집 및 이용 동의', 'tooltipSeq' => '039', 'use' => $privateMarketingMemberUse, 'informs' => $privateMarketingMember, 'flags' => $memberData['privateMarketingConsentOptionFl'] ?? '', 'denyWhenMissing' => true, 'agreementDt' => $privateAgreementDt['privateMarketingConsentOptionFl'] ?? $memberEntryDt], | |
| ]; | |
| $advertisingReceiveChannelUse = $buyerInform->getAdvertisingReceiveChannelUse($memberData['mallSno']); | |
| $advertisingReceive = [ | |
| 'email' => ['use' => $advertisingReceiveChannelUse['mail']], | |
| 'mobile' => ['use' => $advertisingReceiveChannelUse['sms']], | |
| ]; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의/거부일 (없으면 '-') | |
| $memberData['privateMktAgreementDt'] = $memberData['lastReceiveAgreementDt']['privateMkt'] ?? '-'; | |
| // 하이픈 제거 | |
| $memberData['fax'] = str_replace("-", "", $memberData['fax']); | |
| $this->setData('memberData', $memberData); | |
| $this->setData('mode', 'modify'); | |
| $this->setData('modeTxt', '회원수정'); | |
| $joinField = MemberUtil::getJoinField($memberData['mallSno']); | |
| $this->setData('joinField', $joinField); | |
| $this->setData('passwordPlaceholder', MemberUtil::buildPasswordPlaceholder($joinField)); | |
| $this->setData('htmlExtra', MemberUtil::makeExtraField($memberData)); | |
| $this->setData('privateMarketingMemberUse', $privateMarketingMemberUse); | |
| $this->setData('data', $memberData); | |
| $this->setData('checked', $checked); | |
| $this->setData('history', $memberHistory['data']); | |
| $this->setData('privateApprovalOption', $privateApprovalOption); | |
| $this->setData('privateOffer', $privateOffer); | |
| $this->setData('privateConsign', $privateConsign); | |
| $this->setData('privateMarketingMember', $privateMarketingMember); | |
| $this->setData('privateAgreementRows', MemberUtil::buildPrivateAgreementRows($privateAgreements)); | |
| $this->setData('advertisingReceive', $advertisingReceive); | |
| $this->setData('advertisingReceiveLines', MemberUtil::buildAdvertisingReceiveLines($advertisingReceive, $memberData)); | |
| $this->setData('groupCouponConditionManual', gd_policy('member.group')['couponConditionManual']); | |
| $this->setData('hidePasswordBlock', $hidePasswordBlock); | |
| $this->setData('certification', $certification); | |
변경 전JoinAgreementController.php
| $privateApprovalOption = $inform->getInformDataArray(BuyerInformCode::PRIVATE_APPROVAL_OPTION); | |
| $privateConsign = $inform->getInformDataArray(BuyerInformCode::PRIVATE_CONSIGN); | |
| $privateOffer = $inform->getInformDataArray(BuyerInformCode::PRIVATE_OFFER); | |
| $ipinConfig = gd_policy('member.ipin'); | |
| $authCellPhoneConfig = gd_get_auth_cellphone_info(); | |
| $memberJoinConfig = gd_policy('member.join'); | |
| $this->setData('privateApprovalOption', $privateApprovalOption); | |
| $this->setData('privateConsign', $privateConsign); | |
| $this->setData('privateOffer', $privateOffer); | |
| // debug($memberJoinConfig); | |
변경 후JoinAgreementController.php
| $privateApprovalOption = $inform->getInformDataArray(BuyerInformCode::PRIVATE_APPROVAL_OPTION); | |
| $privateConsign = $inform->getInformDataArray(BuyerInformCode::PRIVATE_CONSIGN); | |
| $privateOffer = $inform->getInformDataArray(BuyerInformCode::PRIVATE_OFFER); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 / 광고성 수신 동의 | |
| $privateMarketingMember = $inform->getInformData(BuyerInformCode::PRIVATE_MARKETING_MEMBER); | |
| $advertisingReceive = $inform->getAdvertisingReceiveContentWithReplaceCode(); | |
| $advertisingReceiveChannelUse = $inform->getAdvertisingReceiveChannelUse(); | |
| $ipinConfig = gd_policy('member.ipin'); | |
| $authCellPhoneConfig = gd_get_auth_cellphone_info(); | |
| $memberJoinConfig = gd_policy('member.join'); | |
| $this->setData('privateApprovalOption', $privateApprovalOption); | |
| $this->setData('privateConsign', $privateConsign); | |
| $this->setData('privateOffer', $privateOffer); | |
| $this->setData('privateMarketingMember', $privateMarketingMember); | |
| $this->setData('advertisingReceive', $advertisingReceive); | |
| $this->setData('advertisingReceiveMailUse', $advertisingReceiveChannelUse['mail']); | |
| $this->setData('advertisingReceiveSmsUse', $advertisingReceiveChannelUse['sms']); | |
| $this->setData('isUseAdvertisingReceive', $inform->isUseAdvertisingReceive()); | |
| // debug($memberJoinConfig); | |
변경 전LoginPsController.php
| \DB::rollback(); | |
| $logger->info(__METHOD__ . ', ' . $e->getFile() . '[' . $e->getLine() . '], ' . $e->getMessage()); | |
| } | |
| } | |
| if($message){ | |
| throw new AlertRedirectException($message, 0, null, $returnUrl); | |
변경 후LoginPsController.php
| \DB::rollback(); | |
| $logger->info(__METHOD__ . ', ' . $e->getFile() . '[' . $e->getLine() . '], ' . $e->getMessage()); | |
| } | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 안내 (미동의 회원 로그인 시 계정당 1회, 확인 후 마이페이지 이동) | |
| // my_page.php는 진입 시 비밀번호 재확인을 요구하므로 게이트인 my_page_password.php로 직접 보낸다(이중 alert/리다이렉트 방지). | |
| if (empty($message) && $member->markPrivateMarketingConsentNoticeShown()) { | |
| $message = __('마케팅 이메일 및 모바일 메시지 수신을 위해 개인정보 수집 및 이용에 동의해 주세요.'); | |
| $returnUrl = '../mypage/my_page_password.php'; | |
| } | |
| } | |
| if($message){ | |
| throw new AlertRedirectException($message, 0, null, $returnUrl); | |
변경 전MyPageController.php
| $this->setData('privateApprovalOption', $inform->getInformDataArray(BuyerInformCode::PRIVATE_APPROVAL_OPTION)); | |
| $this->setData('privateOffer', $inform->getInformDataArray(BuyerInformCode::PRIVATE_OFFER)); | |
| $this->setData('privateConsign', $inform->getInformDataArray(BuyerInformCode::PRIVATE_CONSIGN)); | |
| $this->setData('snsConnection', json_encode($snsConnection)); | |
| $this->setData('usePaycoLogin', $paycoPolicy->usePaycoLogin()); | |
| $this->setData('useNaverLogin', $naverPolicy->useNaverLogin()); | |
변경 후MyPageController.php
| $this->setData('privateApprovalOption', $inform->getInformDataArray(BuyerInformCode::PRIVATE_APPROVAL_OPTION)); | |
| $this->setData('privateOffer', $inform->getInformDataArray(BuyerInformCode::PRIVATE_OFFER)); | |
| $this->setData('privateConsign', $inform->getInformDataArray(BuyerInformCode::PRIVATE_CONSIGN)); | |
| $this->setData('privateMktApprovalOption', $inform->getInformDataArray(BuyerInformCode::PRIVATE_MARKETING_MEMBER)); | |
| $this->setData('advertisingReceive', $inform->getAdvertisingReceiveContentWithReplaceCode((int)$mallSno)); | |
| // 광고성 수신 동의 채널(이메일/모바일) 노출 여부 | |
| $advertisingReceiveChannelUse = $inform->getAdvertisingReceiveChannelUse((int)$mallSno); | |
| $this->setData('advertisingReceiveMailUse', $advertisingReceiveChannelUse['mail']); | |
| $this->setData('advertisingReceiveSmsUse', $advertisingReceiveChannelUse['sms']); | |
| // 광고성 수신 동의 블록 노출 = 채널 하나라도 사용 (es_buyerInform modeFl 아님) | |
| $this->setData('isUseAdvertisingReceive', $inform->isUseAdvertisingReceive((int)$mallSno)); | |
| $this->setData('snsConnection', json_encode($snsConnection)); | |
| $this->setData('usePaycoLogin', $paycoPolicy->usePaycoLogin()); | |
| $this->setData('useNaverLogin', $naverPolicy->useNaverLogin()); | |
변경 전AgreementController.php
| case BuyerInformCode::PRIVATE_APPROVAL: | |
| $terms = $inform->getInformData(BuyerInformCode::PRIVATE_APPROVAL); | |
| break; | |
| case BuyerInformCode::BASE_PRIVATE: | |
| $terms = $inform->getPrivateWithReplaceCode(BuyerInformCode::BASE_PRIVATE); | |
| break; | |
변경 후AgreementController.php
| case BuyerInformCode::PRIVATE_APPROVAL: | |
| $terms = $inform->getInformData(BuyerInformCode::PRIVATE_APPROVAL); | |
| break; | |
| case BuyerInformCode::PRIVATE_MARKETING_MEMBER: | |
| $terms = $inform->getInformData(BuyerInformCode::PRIVATE_MARKETING_MEMBER); | |
| break; | |
| case BuyerInformCode::ADVERTISING_RECEIVE: | |
| $terms = $inform->getAdvertisingReceiveContentWithReplaceCode(); | |
| break; | |
| case BuyerInformCode::BASE_PRIVATE: | |
| $terms = $inform->getPrivateWithReplaceCode(BuyerInformCode::BASE_PRIVATE); | |
| break; | |
변경 전join_agreement.html
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <div class="important_check_box"> | |
| <strong class="important_check dn">{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</strong> | |
| </div> | |
| $('.js_terms_view :checkbox', $formTerms).change(function (e) { | |
| $('strong.important_check').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.js_terms_view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| if (isTermsAgreeSelect) { | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| } | |
| }); | |
| } | |
| }); | |
| </script> | |
| { # footer } | |
변경 후join_agreement.html
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <!-- {? privateMarketingMember['modeFl']=='y'} --> | |
| <div class="join_agreement_box js_terms_view"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree6" name=""/> | |
| <label class="check_s" for="termsAgree6"><strong class="choice">({=__('선택')})</strong> {=__('마케팅 목적 개인정보 수집 및 이용 동의')} </label> | |
| <span><a href="../service/agreement.php?code={privateMarketingMember['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <div class="agreement_choice_box"> | |
| <table summary="{=__('마케팅 목적 개인정보 수집 및 이용 동의 내용입니다.')}" border="0" cellpadding="0" cellspacing="0"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(privateMarketingMember['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="privateMktApprovalOption" name="privateMarketingConsentOptionFl"/> | |
| <label class="check_s" for="privateMktApprovalOption">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td>{=nl2br(privateMarketingMember['content'])}</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <!-- {? isUseAdvertisingReceive} --> | |
| <div class="join_agreement_box js_terms_view"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree7" name=""/> | |
| <label class="check_s" for="termsAgree7"><strong class="choice">({=__('선택')})</strong> {=__('광고성 수신 동의')} </label> | |
| <span><a href="../service/agreement.php?code={advertisingReceive['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <div class="agreement_choice_box"> | |
| <table summary="{=__('광고성 수신 동의 내용입니다.')}" border="0" cellpadding="0" cellspacing="0"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(advertisingReceive['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveAll" name=""/> | |
| <label class="check_s" for="advertisingReceiveAll">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td>{=nl2br(advertisingReceive['content'])}</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!-- {? advertisingReceiveMailUse=='y'} --> | |
| <div class="form_element"> | |
| <input type="checkbox" id="maillingFl" name="maillingFl" class="js_advertising_channel"/> | |
| <label class="check_s" for="maillingFl">{=__('이메일 수신 동의')}</label> | |
| </div> | |
| <!-- {/} --> | |
| <!-- {? advertisingReceiveSmsUse=='y'} --> | |
| <div class="form_element"> | |
| <input type="checkbox" id="smsFl" name="smsFl" class="js_advertising_channel"/> | |
| <label class="check_s" for="smsFl">{=__('모바일 메시지 수신 동의')}</label> | |
| </div> | |
| <!-- {/} --> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <div class="important_check_box"> | |
| <strong class="important_check dn">{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</strong> | |
| </div> | |
| $('.js_terms_view :checkbox', $formTerms).change(function (e) { | |
| $('strong.important_check').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.js_terms_view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| if (isTermsAgreeSelect) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMktApprovalOption', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formTerms).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formTerms.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formTerms.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } else { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formTerms).length > 0; | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#privateMktApprovalOption', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| } | |
| }); | |
| } | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더(termsAgree3~7)도 선택 (하나라도 해제 시 해제) | |
| $formTerms.on('change', '.js_terms_view .agreement_choice_box :checkbox', function () { | |
| const $termsView = $(this).closest('.js_terms_view'); | |
| const $header = $termsView.children('.form_element').children(':checkbox'); | |
| const $subs = $termsView.find('.agreement_choice_box :checkbox'); | |
| const allChecked = $subs.length > 0 && $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| /* | |
| * 전체 동의 역동기화 — 하위 체크박스가 모두 선택되면 전체 동의도 선택 (하나라도 해제되면 해제) | |
| */ | |
| const syncAllAgree = function () { | |
| const $targets = $(':checkbox', $formTerms).not('#allAgree').not('#termsAgree'); | |
| const allChecked = $targets.length > 0 && $targets.not(':checked').length === 0; | |
| $('#allAgree', $formTerms).prop('checked', allChecked) | |
| .siblings('label').toggleClass('on', allChecked); | |
| }; | |
| $formTerms.on('change', ':checkbox', function (e) { | |
| if (e.target.id === 'allAgree' || e.target.id === 'termsAgree') { | |
| return; | |
| } | |
| syncAllAgree(); | |
| }); | |
| }); | |
| </script> | |
| { # footer } | |
변경 전_join_view.html
| </select> | |
| </div> | |
| <div class="member_warning js_email"></div> | |
| <!--{? joinField.maillingFl.use === 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="maillingFl" name="maillingFl" value="y" {? data.maillingFl == 'y'}checked="checked"{/}/> | |
| <label for="maillingFl" class="check_s {? data.maillingFl == 'y'}on{/}">{=__('정보/이벤트 메일 수신에 동의합니다.')}</label> | |
| </div> | |
| <!--{/}--> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| </div> | |
| <!--{? joinField.smsFl.use === 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="smsFl" name="smsFl" value="y" {? data.smsFl == 'y'}checked="checked"{/}/> | |
| <label for="smsFl" class="check_s {? data.smsFl == 'y'}on{/}">{=__('정보/이벤트 SMS 수신에 동의합니다.')}</label> | |
| </div> | |
| <!--{/}--> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
변경 후_join_view.html
| </select> | |
| </div> | |
| <div class="member_warning js_email"></div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
변경 전_join_view_other.html
| <!--{/}--> | |
| <!-- N : 약관동의 시작 --> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y'}--> | |
| <div class="join_agreement_cont"> | |
| <h3>{=__('약관동의현황')}</h3> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // privateOffer modeFl end}--> | |
| </div> | |
| <!-- //join_agreement_cont --> | |
| <!--{ / }--> | |
변경 후_join_view_other.html
| <!--{/}--> | |
| <!-- N : 약관동의 시작 --> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y' || privateMktApprovalOption[0]['modeFl']=='y' || isUseAdvertisingReceive}--> | |
| <div class="join_agreement_cont"> | |
| <h3>{=__('약관동의현황')}</h3> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{? privateMktApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="join_agreement_box"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree6"/> | |
| <label for="termsAgree6" class="check_s"><strong class="choice">({=__('선택')})</strong> {=__('마케팅 목적 개인정보 수집 및 이용 동의')} </label> | |
| <span><a href="../service/agreement.php?code={privateMktApprovalOption[0]['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <!--{@ privateMktApprovalOption}--> | |
| <div class="agreement_choice_box"> | |
| <table border="0" cellpadding="0" cellspacing="0" summary="{=__('마케팅 목적 개인정보 수집 및 이용 동의 내용입니다.')}"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(.informNm)}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="privateMarketingConsentOptionFl" name="privateMarketingConsentOptionFl" value="y" <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="privateMarketingConsentOptionFl" class="check_s <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->on<!--{/}-->">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td> | |
| <div class="agreement_scroll"> | |
| {=nl2br(.content)} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| <!--{/ // privateMktApprovalOption loop end}--> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // privateMktApprovalOption modeFl end}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="join_agreement_box js_terms_view"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree7"/> | |
| <label for="termsAgree7" class="check_s"><strong class="choice">({=__('선택')})</strong> {=__('광고성 수신 동의')} </label> | |
| <span><a href="../service/agreement.php?code={advertisingReceive['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <div class="agreement_choice_box"> | |
| <table border="0" cellpadding="0" cellspacing="0" summary="{=__('광고성 수신 동의 내용입니다.')}"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(advertisingReceive['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveAll" <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveAll" class="check_s <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->on<!--{/}-->">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td> | |
| <div class="agreement_scroll"> | |
| {=nl2br(advertisingReceive['content'])} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse == 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveMail" name="maillingFl" value="y" class="js_advertising_channel" <!--{? data['maillingFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveMail" class="check_s <!--{? data['maillingFl'] == 'y'}-->on<!--{/}-->">{=__('이메일 수신 동의')}</label> | |
| </div> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse == 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveSms" name="smsFl" value="y" class="js_advertising_channel" <!--{? data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveSms" class="check_s <!--{? data['smsFl'] == 'y'}-->on<!--{/}-->">{=__('모바일 메시지 수신 동의')}</label> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| <!-- //agreement_choice_box --> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // isUseAdvertisingReceive end}--> | |
| </div> | |
| <!-- //join_agreement_cont --> | |
| <!--{ / }--> | |
변경 전my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.join_agreement_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 후my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.join_agreement_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMarketingConsentOptionFl', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| // 전체선택(advertisingReceiveAll) 직접 조작 시 광고성 수신 동의(termsAgree7) 헤더도 동기화 | |
| $('#termsAgree7', $formJoin).prop('checked', isChecked).siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formJoin).length > 0; | |
| const allChannelChecked = $('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0; | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| // 수신 채널 전부 선택 시 광고성 수신 동의(termsAgree7) 헤더 ON (일부만이면 켜지 않음) | |
| if (allChannelChecked) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formJoin).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#privateMarketingConsentOptionFl', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 그룹 [선택] 헤더 체크 시 광고성 수신 동의·수신 채널 연동 | |
| $formJoin.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더도 선택 (하나라도 해제 시 해제) | |
| $formJoin.on('change', '.join_agreement_box .agreement_choice_box :checkbox', function () { | |
| const $box = $(this).closest('.join_agreement_box'); | |
| const $header = $box.children('.form_element').children(':checkbox'); | |
| // 광고성 수신 동의(termsAgree7)는 채널 1개 이상 선택 의미라 전체 선택 동기화에서 제외 | |
| if ($header.attr('id') === 'termsAgree7') { | |
| return; | |
| } | |
| const $subs = $box.find('.agreement_choice_box :checkbox'); | |
| const allChecked = $subs.length > 0 && $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| // 초기 로드: 저장된 하위 선택 상태로 상위 [선택] 헤더 동기화 | |
| $('.join_agreement_box', $formJoin).each(function () { | |
| const $box = $(this); | |
| const $header = $box.children('.form_element').children(':checkbox'); | |
| // 광고성 수신 동의(termsAgree7)는 채널 1개 이상 선택 의미라 전체 선택 동기화에서 제외 | |
| if ($header.attr('id') === 'termsAgree7') { | |
| return; | |
| } | |
| const $subs = $box.find('.agreement_choice_box :checkbox'); | |
| if ($subs.length > 0 && $subs.not(':checked').length === 0) { | |
| $header.prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| }); | |
| // 초기 로드: 수신 채널이 전부 선택된 상태면 광고성 수신 동의(termsAgree7) 헤더 ON | |
| if ($('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 전join_agreement.html
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <div class="important_check_box"> | |
| <strong class="important_check dn">{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</strong> | |
| </div> | |
| $('.js_terms_view :checkbox', $formTerms).change(function (e) { | |
| $('strong.important_check').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.js_terms_view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| if (isTermsAgreeSelect) { | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| } | |
| }); | |
| } | |
| }); | |
| </script> | |
| { # footer } | |
변경 후join_agreement.html
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <!-- {? privateMarketingMember['modeFl']=='y'} --> | |
| <div class="join_agreement_box js_terms_view"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree6" name=""/> | |
| <label class="check_s" for="termsAgree6"><strong class="choice">({=__('선택')})</strong> {=__('마케팅 목적 개인정보 수집 및 이용 동의')} </label> | |
| <span><a href="../service/agreement.php?code={privateMarketingMember['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <div class="agreement_choice_box"> | |
| <table summary="{=__('마케팅 목적 개인정보 수집 및 이용 동의 내용입니다.')}" border="0" cellpadding="0" cellspacing="0"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(privateMarketingMember['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="privateMktApprovalOption" name="privateMarketingConsentOptionFl"/> | |
| <label class="check_s" for="privateMktApprovalOption">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td>{=nl2br(privateMarketingMember['content'])}</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <!-- {? isUseAdvertisingReceive} --> | |
| <div class="join_agreement_box js_terms_view"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree7" name=""/> | |
| <label class="check_s" for="termsAgree7"><strong class="choice">({=__('선택')})</strong> {=__('광고성 수신 동의')} </label> | |
| <span><a href="../service/agreement.php?code={advertisingReceive['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <div class="agreement_choice_box"> | |
| <table summary="{=__('광고성 수신 동의 내용입니다.')}" border="0" cellpadding="0" cellspacing="0"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(advertisingReceive['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveAll" name=""/> | |
| <label class="check_s" for="advertisingReceiveAll">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td>{=nl2br(advertisingReceive['content'])}</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!-- {? advertisingReceiveMailUse=='y'} --> | |
| <div class="form_element"> | |
| <input type="checkbox" id="maillingFl" name="maillingFl" class="js_advertising_channel"/> | |
| <label class="check_s" for="maillingFl">{=__('이메일 수신 동의')}</label> | |
| </div> | |
| <!-- {/} --> | |
| <!-- {? advertisingReceiveSmsUse=='y'} --> | |
| <div class="form_element"> | |
| <input type="checkbox" id="smsFl" name="smsFl" class="js_advertising_channel"/> | |
| <label class="check_s" for="smsFl">{=__('모바일 메시지 수신 동의')}</label> | |
| </div> | |
| <!-- {/} --> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <!-- //join_agreement_box --> | |
| <div class="important_check_box"> | |
| <strong class="important_check dn">{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</strong> | |
| </div> | |
| $('.js_terms_view :checkbox', $formTerms).change(function (e) { | |
| $('strong.important_check').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.js_terms_view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| if (isTermsAgreeSelect) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMktApprovalOption', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formTerms).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formTerms.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formTerms.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } else { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formTerms).length > 0; | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#privateMktApprovalOption', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| } | |
| }); | |
| } | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더(termsAgree3~7)도 선택 (하나라도 해제 시 해제) | |
| $formTerms.on('change', '.js_terms_view .agreement_choice_box :checkbox', function () { | |
| const $termsView = $(this).closest('.js_terms_view'); | |
| const $header = $termsView.children('.form_element').children(':checkbox'); | |
| const $subs = $termsView.find('.agreement_choice_box :checkbox'); | |
| const allChecked = $subs.length > 0 && $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| /* | |
| * 전체 동의 역동기화 — 하위 체크박스가 모두 선택되면 전체 동의도 선택 (하나라도 해제되면 해제) | |
| */ | |
| const syncAllAgree = function () { | |
| const $targets = $(':checkbox', $formTerms).not('#allAgree').not('#termsAgree'); | |
| const allChecked = $targets.length > 0 && $targets.not(':checked').length === 0; | |
| $('#allAgree', $formTerms).prop('checked', allChecked) | |
| .siblings('label').toggleClass('on', allChecked); | |
| }; | |
| $formTerms.on('change', ':checkbox', function (e) { | |
| if (e.target.id === 'allAgree' || e.target.id === 'termsAgree') { | |
| return; | |
| } | |
| syncAllAgree(); | |
| }); | |
| }); | |
| </script> | |
| { # footer } | |
변경 전_join_view.html
| </select> | |
| </div> | |
| <div class="member_warning js_email"></div> | |
| <!--{? joinField.maillingFl.use === 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="maillingFl" name="maillingFl" value="y" {? data.maillingFl == 'y'}checked="checked"{/}/> | |
| <label for="maillingFl" class="check_s {? data.maillingFl == 'y'}on{/}">{=__('정보/이벤트 메일 수신에 동의합니다.')}</label> | |
| </div> | |
| <!--{/}--> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| </div> | |
| <!--{? joinField.smsFl.use === 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="smsFl" name="smsFl" value="y" {? data.smsFl == 'y'}checked="checked"{/}/> | |
| <label for="smsFl" class="check_s {? data.smsFl == 'y'}on{/}">{=__('정보/이벤트 SMS 수신에 동의합니다.')}</label> | |
| </div> | |
| <!--{/}--> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
변경 후_join_view.html
| </select> | |
| </div> | |
| <div class="member_warning js_email"></div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
변경 전_join_view_other.html
| <!--{/}--> | |
| <!-- N : 약관동의 시작 --> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y'}--> | |
| <div class="join_agreement_cont"> | |
| <h3>{=__('약관동의현황')}</h3> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // privateOffer modeFl end}--> | |
| </div> | |
| <!-- //join_agreement_cont --> | |
| <!--{ / }--> | |
변경 후_join_view_other.html
| <!--{/}--> | |
| <!-- N : 약관동의 시작 --> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y' || privateMktApprovalOption[0]['modeFl']=='y' || isUseAdvertisingReceive}--> | |
| <div class="join_agreement_cont"> | |
| <h3>{=__('약관동의현황')}</h3> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{? privateMktApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="join_agreement_box"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree6"/> | |
| <label for="termsAgree6" class="check_s"><strong class="choice">({=__('선택')})</strong> {=__('마케팅 목적 개인정보 수집 및 이용 동의')} </label> | |
| <span><a href="../service/agreement.php?code={privateMktApprovalOption[0]['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <!--{@ privateMktApprovalOption}--> | |
| <div class="agreement_choice_box"> | |
| <table border="0" cellpadding="0" cellspacing="0" summary="{=__('마케팅 목적 개인정보 수집 및 이용 동의 내용입니다.')}"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(.informNm)}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="privateMarketingConsentOptionFl" name="privateMarketingConsentOptionFl" value="y" <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="privateMarketingConsentOptionFl" class="check_s <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->on<!--{/}-->">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td> | |
| <div class="agreement_scroll"> | |
| {=nl2br(.content)} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| <!--{/ // privateMktApprovalOption loop end}--> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // privateMktApprovalOption modeFl end}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="join_agreement_box js_terms_view"> | |
| <div class="form_element"> | |
| <input type="checkbox" id="termsAgree7"/> | |
| <label for="termsAgree7" class="check_s"><strong class="choice">({=__('선택')})</strong> {=__('광고성 수신 동의')} </label> | |
| <span><a href="../service/agreement.php?code={advertisingReceive['informCd']}" target="_blank">{=__('전체보기')}</a></span> | |
| </div> | |
| <div class="agreement_choice_box"> | |
| <table border="0" cellpadding="0" cellspacing="0" summary="{=__('광고성 수신 동의 내용입니다.')}"> | |
| <colgroup> | |
| <col width="10px"> | |
| <col width="300px"> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th>{=__('선택')}</th> | |
| <th>{=nl2br(advertisingReceive['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveAll" <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveAll" class="check_s <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->on<!--{/}-->">{=__('선택')}</label> | |
| </div> | |
| </td> | |
| <td> | |
| <div class="agreement_scroll"> | |
| {=nl2br(advertisingReceive['content'])} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse == 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveMail" name="maillingFl" value="y" class="js_advertising_channel" <!--{? data['maillingFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveMail" class="check_s <!--{? data['maillingFl'] == 'y'}-->on<!--{/}-->">{=__('이메일 수신 동의')}</label> | |
| </div> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse == 'y'}--> | |
| <div class="form_element"> | |
| <input type="checkbox" id="advertisingReceiveSms" name="smsFl" value="y" class="js_advertising_channel" <!--{? data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveSms" class="check_s <!--{? data['smsFl'] == 'y'}-->on<!--{/}-->">{=__('모바일 메시지 수신 동의')}</label> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| <!-- //agreement_choice_box --> | |
| </div> | |
| <!-- //join_agreement_box --> | |
| <!--{/ // isUseAdvertisingReceive end}--> | |
| </div> | |
| <!-- //join_agreement_cont --> | |
| <!--{ / }--> | |
변경 전my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.join_agreement_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 후my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.join_agreement_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMarketingConsentOptionFl', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| // 전체선택(advertisingReceiveAll) 직접 조작 시 광고성 수신 동의(termsAgree7) 헤더도 동기화 | |
| $('#termsAgree7', $formJoin).prop('checked', isChecked).siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formJoin).length > 0; | |
| const allChannelChecked = $('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0; | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| // 수신 채널 전부 선택 시 광고성 수신 동의(termsAgree7) 헤더 ON (일부만이면 켜지 않음) | |
| if (allChannelChecked) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formJoin).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#privateMarketingConsentOptionFl', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 그룹 [선택] 헤더 체크 시 광고성 수신 동의·수신 채널 연동 | |
| $formJoin.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더도 선택 (하나라도 해제 시 해제) | |
| $formJoin.on('change', '.join_agreement_box .agreement_choice_box :checkbox', function () { | |
| const $box = $(this).closest('.join_agreement_box'); | |
| const $header = $box.children('.form_element').children(':checkbox'); | |
| // 광고성 수신 동의(termsAgree7)는 채널 1개 이상 선택 의미라 전체 선택 동기화에서 제외 | |
| if ($header.attr('id') === 'termsAgree7') { | |
| return; | |
| } | |
| const $subs = $box.find('.agreement_choice_box :checkbox'); | |
| const allChecked = $subs.length > 0 && $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| // 초기 로드: 저장된 하위 선택 상태로 상위 [선택] 헤더 동기화 | |
| $('.join_agreement_box', $formJoin).each(function () { | |
| const $box = $(this); | |
| const $header = $box.children('.form_element').children(':checkbox'); | |
| // 광고성 수신 동의(termsAgree7)는 채널 1개 이상 선택 의미라 전체 선택 동기화에서 제외 | |
| if ($header.attr('id') === 'termsAgree7') { | |
| return; | |
| } | |
| const $subs = $box.find('.agreement_choice_box :checkbox'); | |
| if ($subs.length > 0 && $subs.not(':checked').length === 0) { | |
| $header.prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| }); | |
| // 초기 로드: 수신 채널이 전부 선택된 상태면 광고성 수신 동의(termsAgree7) 헤더 ON | |
| if ($('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 전join_agreement.html
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| $('.terms-view :checkbox', $formTerms).change(function (e) { | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.terms-view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| } | |
| }); | |
| } | |
| }); | |
| </script> | |
| { # footer } | |
변경 후join_agreement.html
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <!-- {? privateMarketingMember['modeFl']=='y'} --> | |
| <div class="terms-view"> | |
| <p> | |
| <input type="checkbox" class="checkbox" id="termsAgree6" name=""> | |
| <label for="termsAgree6"> | |
| <span class="option"><strong>({=__('선택')})</strong></span> | |
| {=__('마케팅 목적 개인정보 수집 및 이용 동의')} | |
| </label> | |
| <a href="../service/agreement.php?code={privateMarketingMember['informCd']}" target="_blank">{=__('전체보기')}</a> | |
| </p> | |
| <div class="consignment-box"> | |
| <table summary="{=__('마케팅 목적 개인정보 수집 및 이용 동의 내용입니다.')}" class="" cellspacing="0" border="1"> | |
| <colgroup> | |
| <col width="79px"> | |
| <col> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th scope="col">{=__('선택')}</th> | |
| <th scope="col">{=nl2br(privateMarketingMember['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox" id="privateMktApprovalOption" name="privateMarketingConsentOptionFl"> | |
| <label for="privateMktApprovalOption">{=__('선택')}</label> | |
| </span> | |
| </td> | |
| <td> | |
| <div> | |
| {=nl2br(privateMarketingMember['content'])} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <!-- {? isUseAdvertisingReceive} --> | |
| <div class="terms-view"> | |
| <p> | |
| <input type="checkbox" class="checkbox" id="termsAgree7" name=""> | |
| <label for="termsAgree7"> | |
| <span class="option"><strong>({=__('선택')})</strong></span> | |
| {=__('광고성 수신 동의')} | |
| </label> | |
| <a href="../service/agreement.php?code={advertisingReceive['informCd']}" target="_blank">{=__('전체보기')}</a> | |
| </p> | |
| <div class="consignment-box"> | |
| <table summary="{=__('광고성 수신 동의 내용입니다.')}" class="" cellspacing="0" border="1"> | |
| <colgroup> | |
| <col width="79px"> | |
| <col> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th scope="col">{=__('선택')}</th> | |
| <th scope="col">{=nl2br(advertisingReceive['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox" id="advertisingReceiveAll" name=""> | |
| <label for="advertisingReceiveAll">{=__('선택')}</label> | |
| </span> | |
| </td> | |
| <td> | |
| <div> | |
| {=nl2br(advertisingReceive['content'])} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; gap:8px; margin:10px;"> | |
| <!-- {? advertisingReceiveMailUse=='y'} --> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox js_advertising_channel" id="maillingFl" name="maillingFl"> | |
| <label for="maillingFl">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| <!-- {/} --> | |
| <!-- {? advertisingReceiveSmsUse=='y'} --> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox js_advertising_channel" id="smsFl" name="smsFl"> | |
| <label for="smsFl">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| <!-- {/} --> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- {/} --> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| $('.terms-view :checkbox', $formTerms).change(function (e) { | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.terms-view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMktApprovalOption', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formTerms).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formTerms.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formTerms.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } else { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formTerms).length > 0; | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#privateMktApprovalOption', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| } | |
| }); | |
| } | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더(termsAgree3~7)도 선택 (하나라도 해제 시 해제) | |
| $formTerms.on('change', '.terms-view .consignment-box :checkbox', function () { | |
| const $termsView = $(this).closest('.terms-view'); | |
| const $header = $termsView.children('p').children(':checkbox'); | |
| const $subs = $termsView.find('.consignment-box :checkbox'); | |
| const allChecked = $subs.length > 0 && $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| /* | |
| * 전체 동의 역동기화 — 하위 체크박스가 모두 선택되면 전체 동의도 선택 (하나라도 해제되면 해제) | |
| */ | |
| const syncAllAgree = function () { | |
| const $targets = $(':checkbox', $formTerms).not('#allAgree').not('#termsAgree'); | |
| const allChecked = $targets.length > 0 && $targets.not(':checked').length === 0; | |
| $('#allAgree', $formTerms).prop('checked', allChecked) | |
| .siblings('label').toggleClass('on', allChecked); | |
| }; | |
| $formTerms.on('change', ':checkbox', function (e) { | |
| if (e.target.id === 'allAgree' || e.target.id === 'termsAgree') { | |
| return; | |
| } | |
| syncAllAgree(); | |
| }); | |
| }); | |
| </script> | |
| { # footer } | |
변경 전_join_view.html
| </select> | |
| </div> | |
| </div> | |
| <!--{? joinField.maillingFl.use === 'y'}--> | |
| <div class="form-element"> | |
| <input type="checkbox" class="checkbox" id="maillingFl" name="maillingFl" value="y" {? data.maillingFl == 'y'}checked="checked"{/}> | |
| <label for="maillingFl" class="{? data.maillingFl == 'y'}on{/}">{=__('정보/이벤트 메일 수신에 동의합니다.')}</label> | |
| </div> | |
| <!--{/}--> | |
| </td> | |
| </tr> | |
| <!--{/}--><!--{? joinField.cellPhone.use == 'y'}--> | |
| </button> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| <!--{? joinField.smsFl.use === 'y'}--> | |
| <div class="form-element"> | |
| <input type="checkbox" class="checkbox" id="smsFl" name="smsFl" value="y" {? data.smsFl == 'y'}checked="checked"{/}> | |
| <label for="smsFl" class="{? data.smsFl == 'y'}on{/}">{=__('정보/이벤트 SMS 수신에 동의합니다.')}</label> | |
| </div> | |
| <!--{/}--> | |
| </td> | |
| </tr> | |
| <!--{/}--><!--{? joinField.phone.use == 'y'}--> | |
변경 후_join_view.html
| </select> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--><!--{? joinField.cellPhone.use == 'y'}--> | |
| </button> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| </td> | |
| </tr> | |
| <!--{/}--><!--{? joinField.phone.use == 'y'}--> | |
변경 전_join_view_other.html
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{/ // isMyPage end}--> | |
변경 후_join_view_other.html
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{? privateMktApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="terms-view"> | |
| <p> | |
| <input type="checkbox" class="checkbox" id="termsAgree6" name=""> | |
| <label for="termsAgree6"> | |
| <span class="option"> | |
| <strong>({=__('선택')})</strong> | |
| </span> | |
| {=__('마케팅 목적 개인정보 수집 및 이용 동의')} | |
| </label> | |
| <a href="../service/agreement.php?code={privateMktApprovalOption[0]['informCd']}" target="_blank">{=__('전체보기')}</a> | |
| </p> | |
| <div class="consignment-box"> | |
| <!--{@ privateMktApprovalOption}--> | |
| <table summary="{=__('마케팅 목적 개인정보 수집 및 이용 동의 내용입니다.')}" class="" cellspacing="0" border="1"> | |
| <colgroup> | |
| <col width="79px"> | |
| <col> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th scope="col">{=__('선택')}</th> | |
| <th scope="col">{=nl2br(.informNm)}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox" id="privateMarketingConsentOptionFl" name="privateMarketingConsentOptionFl" value="y" <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="<!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->on<!--{/}-->" for="privateMarketingConsentOptionFl">{=__('선택')}</label> | |
| </span> | |
| </td> | |
| <td> | |
| <div> | |
| {=nl2br(.content)} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <!--{/ // privateMktApprovalOption loop end}--> | |
| </div> | |
| </div> | |
| <!--{/ // privateMktApprovalOption modeFl end}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="terms-view js_terms_view"> | |
| <p> | |
| <input type="checkbox" class="checkbox" id="termsAgree7" name=""> | |
| <label for="termsAgree7"> | |
| <span class="option"> | |
| <strong>({=__('선택')})</strong> | |
| </span> | |
| {=__('광고성 수신 동의')} | |
| </label> | |
| <a href="../service/agreement.php?code={advertisingReceive['informCd']}" target="_blank">{=__('전체보기')}</a> | |
| </p> | |
| <div class="consignment-box"> | |
| <table summary="{=__('광고성 수신 동의 내용입니다.')}" class="" cellspacing="0" border="1"> | |
| <colgroup> | |
| <col width="79px"> | |
| <col> | |
| </colgroup> | |
| <thead> | |
| <tr> | |
| <th scope="col">{=__('선택')}</th> | |
| <th scope="col">{=nl2br(advertisingReceive['informNm'])}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox" id="advertisingReceiveAll" <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="<!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->on<!--{/}-->" for="advertisingReceiveAll">{=__('선택')}</label> | |
| </span> | |
| </td> | |
| <td> | |
| <div> | |
| {=nl2br(advertisingReceive['content'])} | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; gap:8px; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse == 'y'}--> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox js_advertising_channel" id="advertisingReceiveMail" name="maillingFl" value="y" <!--{? data['maillingFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="<!--{? data['maillingFl'] == 'y'}-->on<!--{/}-->" for="advertisingReceiveMail">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse == 'y'}--> | |
| <span class="form-element"> | |
| <input type="checkbox" class="checkbox js_advertising_channel" id="advertisingReceiveSms" name="smsFl" value="y" <!--{? data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="<!--{? data['smsFl'] == 'y'}-->on<!--{/}-->" for="advertisingReceiveSms">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // isUseAdvertisingReceive end}--> | |
| <!--{/ // isMyPage end}--> | |
변경 전my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.terms-view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 후my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.terms-view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMarketingConsentOptionFl', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| // 전체선택(advertisingReceiveAll) 직접 조작 시 광고성 수신 동의(termsAgree7) 헤더도 동기화 | |
| $('#termsAgree7', $formJoin).prop('checked', isChecked).siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formJoin).length > 0; | |
| const allChannelChecked = $('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0; | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| // 수신 채널 전부 선택 시 광고성 수신 동의(termsAgree7) 헤더 ON (일부만이면 켜지 않음) | |
| if (allChannelChecked) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formJoin).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#privateMarketingConsentOptionFl', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 그룹 [선택] 헤더 체크 시 광고성 수신 동의·수신 채널 연동 | |
| $formJoin.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더도 선택 (하나라도 해제 시 해제) | |
| // - story_g 는 약관 그룹 마크업이 .terms-view / .consignment-box 구조 (moment·mygreek 의 .join_agreement_box 아님) | |
| $formJoin.on('change', '.terms-view .consignment-box :checkbox', function () { | |
| const $box = $(this).closest('.terms-view'); | |
| const $subs = $box.find('.consignment-box :checkbox'); | |
| const $header = $box.find(':checkbox').not($subs); | |
| // 광고성 수신 동의(termsAgree7)는 채널 1개 이상 선택 의미라 전체 선택 동기화에서 제외 | |
| if ($header.attr('id') === 'termsAgree7') { | |
| return; | |
| } | |
| const allChecked = $subs.length > 0 && $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| // 초기 로드: 저장된 하위 선택 상태로 상위 [선택] 헤더 동기화 | |
| $('.terms-view', $formJoin).each(function () { | |
| const $box = $(this); | |
| const $subs = $box.find('.consignment-box :checkbox'); | |
| const $header = $box.find(':checkbox').not($subs); | |
| // 광고성 수신 동의(termsAgree7)는 채널 1개 이상 선택 의미라 전체 선택 동기화에서 제외 | |
| if ($header.attr('id') === 'termsAgree7') { | |
| return; | |
| } | |
| if ($subs.length > 0 && $subs.not(':checked').length === 0) { | |
| $header.prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| }); | |
| // 초기 로드: 수신 채널이 전부 선택된 상태면 광고성 수신 동의(termsAgree7) 헤더 ON | |
| if ($('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 전join_agreement.html
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.privacy_box dd button').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
| } | |
| }); | |
| window.addEventListener('message', function (e) { | |
| if (e.origin === "{=authDreamUrl}") { | |
| $('#layerSearch').remove(); | |
| } | |
| }); | |
| }); | |
| /** | |
변경 후join_agreement.html
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateMarketingMember['modeFl']=='y'}--> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree6"/> | |
| <label for="termsAgree6">({=__('선택')}) {=__('마케팅 목적 개인정보 수집 및 이용 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div class="privacy_big_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="privateMktApprovalOption" name="privateMarketingConsentOptionFl"/> | |
| <label for="privateMktApprovalOption">{=nl2br(privateMarketingMember['informNm'])}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{privateMarketingMember['informCd']}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(privateMarketingMember['content'])}</div> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!-- //privacy_big_box --> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree7"/> | |
| <label for="termsAgree7">({=__('선택')}) {=__('광고성 수신 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div class="privacy_big_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="advertisingReceiveAll"/> | |
| <label for="advertisingReceiveAll">{=nl2br(advertisingReceive['informNm'])}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{advertisingReceive['informCd']}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(advertisingReceive['content'])}</div> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!-- //privacy_big_box --> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse=='y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="maillingFl" name="maillingFl"/> | |
| <label for="maillingFl">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse=='y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="smsFl" name="smsFl"/> | |
| <label for="smsFl">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMktApprovalOption', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formTerms).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formTerms.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formTerms.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } else { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formTerms).length > 0; | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#privateMktApprovalOption', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.privacy_box dd button:not(.js_agreement_view)').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
| } | |
| }); | |
| // 약관 전문 새창 열기 (전체보기) | |
| $('.js_agreement_view').on('click', function () { | |
| window.open('../service/agreement.php?code=' + $(this).data('code')); | |
| }); | |
| window.addEventListener('message', function (e) { | |
| if (e.origin === "{=authDreamUrl}") { | |
| $('#layerSearch').remove(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더(termsAgree3~7)도 선택 (하나라도 해제 시 해제) | |
| $formTerms.on('change', '.privacy_box :checkbox', function () { | |
| const $box = $(this).closest('.privacy_box'); | |
| const $header = $box.children('dl').find(':checkbox'); | |
| const $subs = $box.find(':checkbox').not($header); | |
| if ($subs.length === 0) { | |
| return; | |
| } | |
| const allChecked = $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| /* | |
| * 전체 동의 역동기화 — 하위 체크박스가 모두 선택되면 전체 동의도 선택 (하나라도 해제되면 해제) | |
| */ | |
| const syncAllAgree = function () { | |
| const $targets = $(':checkbox', $formTerms).not('#allAgree').not('#termsAgree'); | |
| const allChecked = $targets.length > 0 && $targets.not(':checked').length === 0; | |
| $('#allAgree', $formTerms).prop('checked', allChecked) | |
| .siblings('label').toggleClass('on', allChecked); | |
| }; | |
| $formTerms.on('change', ':checkbox', function (e) { | |
| if (e.target.id === 'allAgree' || e.target.id === 'termsAgree') { | |
| return; | |
| } | |
| syncAllAgree(); | |
| }); | |
| }); | |
| /** | |
변경 전_join_view.html
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <!--{? joinField.maillingFl.use === 'y'}--> | |
| <div class="description"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="maillingFl" class="ignore" name="maillingFl" value="y" {? data.maillingFl=='y'}checked="checked"{/}/> | |
| <label for="maillingFl">{=__('정보/이벤트 메일 수신에 동의합니다.')}</label> | |
| </span> | |
| </div> | |
| <!--{/}--> | |
| <div class="description">※ {=__('아이디 비밀번호 찾기에 활용 되므로 정확하게 입력해 주세요')}</div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{? joinField.smsFl.use === 'y'}--> | |
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <div class="description"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="ignore" id="smsFl" name="smsFl" value="y" {? data.smsFl=='y'}checked="checked"{/}/> | |
| <label for="smsFl">{=__('정보/이벤트 SMS 수신에 동의합니다.')}</label> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{/}--> | |
| <!--{? joinField.phone.use == 'y'}--> | |
| <div class="input_wrap"> | |
변경 후_join_view.html
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <div class="description">※ {=__('아이디 비밀번호 찾기에 활용 되므로 정확하게 입력해 주세요')}</div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{? joinField.phone.use == 'y'}--> | |
| <div class="input_wrap"> | |
변경 전_join_view_other.html
| <!--{/}--> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y'}--> | |
| <p class="tit">{=__('약관동의현황')}</p> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy_big_box"> | |
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{/}--> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.privacy_box dd button').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
변경 후_join_view_other.html
| <!--{/}--> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y' || privateMktApprovalOption[0]['modeFl']=='y' || isUseAdvertisingReceive}--> | |
| <p class="tit">{=__('약관동의현황')}</p> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy_big_box"> | |
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{? privateMktApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree6" name=""/> | |
| <label for="termsAgree6">({=__('선택')}) {=__('마케팅 목적 개인정보 수집 및 이용 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <!--{@ privateMktApprovalOption}--> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="privateMarketingConsentOptionFl" name="privateMarketingConsentOptionFl" value="y" <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="privateMarketingConsentOptionFl">{=nl2br(.informNm)}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{.informCd}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(.content)}</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // privateMktApprovalOption modeFl end}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree7" name=""/> | |
| <label for="termsAgree7">({=__('선택')}) {=__('광고성 수신 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="advertisingReceiveAll" name="" <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveAll">{=nl2br(advertisingReceive['informNm'])}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{advertisingReceive['informCd']}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(advertisingReceive['content'])}</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse == 'y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="advertisingReceiveMail" name="maillingFl" value="y" class="js_advertising_channel" <!--{? data['maillingFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveMail">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse == 'y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="advertisingReceiveSms" name="smsFl" value="y" class="js_advertising_channel" <!--{? data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveSms">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // isUseAdvertisingReceive end}--> | |
| <!--{/}--> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.js_agreement_view').on('click', function () { | |
| window.open('../service/agreement.php?code=' + $(this).data('code')); | |
| }); | |
| $('.privacy_box dd button:not(.js_agreement_view)').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
변경 전my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 후my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMarketingConsentOptionFl', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| // 전체선택(advertisingReceiveAll) 직접 조작 시 광고성 수신 동의(termsAgree7) 헤더도 동기화 | |
| $('#termsAgree7', $formJoin).prop('checked', isChecked).siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formJoin).length > 0; | |
| const allChannelChecked = $('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0; | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| // 수신 채널 전부 선택 시 광고성 수신 동의(termsAgree7) 헤더 ON (일부만이면 켜지 않음) | |
| if (allChannelChecked) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formJoin).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#privateMarketingConsentOptionFl', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 그룹 [선택] 헤더 체크 시 광고성 수신 동의·수신 채널 연동 | |
| $formJoin.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더도 선택 (하나라도 해제 시 해제) — 중첩 privacy_box 대응: 헤더 기준으로 그룹 판정 | |
| $formJoin.on('change', '.privacy_box :checkbox', function () { | |
| $('#termsAgree3, #termsAgree4, #termsAgree5, #termsAgree6', $formJoin).each(function () { | |
| const $header = $(this); | |
| const $subs = $header.closest('.privacy_box').find(':checkbox').not($header); | |
| if ($subs.length === 0) { | |
| return; | |
| } | |
| const allChecked = $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| }); | |
| // 초기 로드: 저장된 하위 선택 상태로 상위 [선택] 헤더 동기화 | |
| $('#termsAgree3, #termsAgree4, #termsAgree5, #termsAgree6', $formJoin).each(function () { | |
| const $subs = $(this).closest('.privacy_box').find(':checkbox').not(this); | |
| if ($subs.length > 0 && $subs.not(':checked').length === 0) { | |
| $(this).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| }); | |
| // 초기 로드: 수신 채널이 전부 선택된 상태면 광고성 수신 동의(termsAgree7) 헤더 ON | |
| if ($('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 전join_agreement.html
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.privacy_box dd button').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
| } | |
| }); | |
| window.addEventListener('message', function (e) { | |
| if (e.origin === "{=authDreamUrl}") { | |
| $('#layerSearch').remove(); | |
| } | |
| }); | |
| }); | |
| /** | |
변경 후join_agreement.html
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateMarketingMember['modeFl']=='y'}--> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree6"/> | |
| <label for="termsAgree6">({=__('선택')}) {=__('마케팅 목적 개인정보 수집 및 이용 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div class="privacy_big_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="privateMktApprovalOption" name="privateMarketingConsentOptionFl"/> | |
| <label for="privateMktApprovalOption">{=nl2br(privateMarketingMember['informNm'])}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{privateMarketingMember['informCd']}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(privateMarketingMember['content'])}</div> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!-- //privacy_big_box --> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree7"/> | |
| <label for="termsAgree7">({=__('선택')}) {=__('광고성 수신 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div class="privacy_big_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="advertisingReceiveAll"/> | |
| <label for="advertisingReceiveAll">{=nl2br(advertisingReceive['informNm'])}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{advertisingReceive['informCd']}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(advertisingReceive['content'])}</div> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!-- //privacy_big_box --> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse=='y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="maillingFl" name="maillingFl"/> | |
| <label for="maillingFl">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse=='y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="smsFl" name="smsFl"/> | |
| <label for="smsFl">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| <!-- //privacy_content --> | |
| </div> | |
| <!--{/}--> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMktApprovalOption', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formTerms).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formTerms.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formTerms.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } else { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formTerms).length > 0; | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#privateMktApprovalOption', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| /* | |
| * 14세 동의 항목 체크박스 이벤트 | |
| */ | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.privacy_box dd button:not(.js_agreement_view)').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
| } | |
| }); | |
| // 약관 전문 새창 열기 (전체보기) | |
| $('.js_agreement_view').on('click', function () { | |
| window.open('../service/agreement.php?code=' + $(this).data('code')); | |
| }); | |
| window.addEventListener('message', function (e) { | |
| if (e.origin === "{=authDreamUrl}") { | |
| $('#layerSearch').remove(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더(termsAgree3~7)도 선택 (하나라도 해제 시 해제) | |
| $formTerms.on('change', '.privacy_box :checkbox', function () { | |
| const $box = $(this).closest('.privacy_box'); | |
| const $header = $box.children('dl').find(':checkbox'); | |
| const $subs = $box.find(':checkbox').not($header); | |
| if ($subs.length === 0) { | |
| return; | |
| } | |
| const allChecked = $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| /* | |
| * 전체 동의 역동기화 — 하위 체크박스가 모두 선택되면 전체 동의도 선택 (하나라도 해제되면 해제) | |
| */ | |
| const syncAllAgree = function () { | |
| const $targets = $(':checkbox', $formTerms).not('#allAgree').not('#termsAgree'); | |
| const allChecked = $targets.length > 0 && $targets.not(':checked').length === 0; | |
| $('#allAgree', $formTerms).prop('checked', allChecked) | |
| .siblings('label').toggleClass('on', allChecked); | |
| }; | |
| $formTerms.on('change', ':checkbox', function (e) { | |
| if (e.target.id === 'allAgree' || e.target.id === 'termsAgree') { | |
| return; | |
| } | |
| syncAllAgree(); | |
| }); | |
| }); | |
| /** | |
변경 전_join_view.html
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <!--{? joinField.maillingFl.use === 'y'}--> | |
| <div class="description"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="maillingFl" class="ignore" name="maillingFl" value="y" {? data.maillingFl=='y'}checked="checked"{/}/> | |
| <label for="maillingFl">{=__('정보/이벤트 메일 수신에 동의합니다.')}</label> | |
| </span> | |
| </div> | |
| <!--{/}--> | |
| <div class="description">※ {=__('아이디 비밀번호 찾기에 활용 되므로 정확하게 입력해 주세요')}</div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{? joinField.smsFl.use === 'y'}--> | |
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <div class="description"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="ignore" id="smsFl" name="smsFl" value="y" {? data.smsFl=='y'}checked="checked"{/}/> | |
| <label for="smsFl">{=__('정보/이벤트 SMS 수신에 동의합니다.')}</label> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{/}--> | |
| <!--{? joinField.phone.use == 'y'}--> | |
| <div class="input_wrap"> | |
변경 후_join_view.html
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <div class="description">※ {=__('아이디 비밀번호 찾기에 활용 되므로 정확하게 입력해 주세요')}</div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{? joinField.phone.use == 'y'}--> | |
| <div class="input_wrap"> | |
변경 전_join_view_other.html
| <!--{/}--> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y'}--> | |
| <p class="tit">{=__('약관동의현황')}</p> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy_big_box"> | |
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{/}--> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.privacy_box dd button').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
변경 후_join_view_other.html
| <!--{/}--> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y' || privateMktApprovalOption[0]['modeFl']=='y' || isUseAdvertisingReceive}--> | |
| <p class="tit">{=__('약관동의현황')}</p> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy_big_box"> | |
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{? privateMktApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree6" name=""/> | |
| <label for="termsAgree6">({=__('선택')}) {=__('마케팅 목적 개인정보 수집 및 이용 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <!--{@ privateMktApprovalOption}--> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="privateMarketingConsentOptionFl" name="privateMarketingConsentOptionFl" value="y" <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="privateMarketingConsentOptionFl">{=nl2br(.informNm)}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{.informCd}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(.content)}</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // privateMktApprovalOption modeFl end}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="termsAgree7" name=""/> | |
| <label for="termsAgree7">({=__('선택')}) {=__('광고성 수신 동의')}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button">{=__('내용보기')} ▼</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div class="privacy_big_box"> | |
| <div class="privacy_box"> | |
| <dl> | |
| <dt> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="advertisingReceiveAll" name="" <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveAll">{=nl2br(advertisingReceive['informNm'])}</label> | |
| </span> | |
| </dt> | |
| <dd><button type="button" class="js_agreement_view" data-code="{advertisingReceive['informCd']}">{=__('전체보기')}</button></dd> | |
| </dl> | |
| <div class="privacy_content"> | |
| <div>{=nl2br(advertisingReceive['content'])}</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse == 'y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="advertisingReceiveMail" name="maillingFl" value="y" class="js_advertising_channel" <!--{? data['maillingFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveMail">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse == 'y'}--> | |
| <span class="inp_chk"> | |
| <input type="checkbox" id="advertisingReceiveSms" name="smsFl" value="y" class="js_advertising_channel" <!--{? data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->/> | |
| <label for="advertisingReceiveSms">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // isUseAdvertisingReceive end}--> | |
| <!--{/}--> | |
| <script type="text/javascript"> | |
| $(document).ready(function() { | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| /* | |
| * 약관 내용보기 이벤트 | |
| */ | |
| $('.js_agreement_view').on('click', function () { | |
| window.open('../service/agreement.php?code=' + $(this).data('code')); | |
| }); | |
| $('.privacy_box dd button:not(.js_agreement_view)').on({ | |
| 'click':function(){ | |
| var privacy_dp = $(this).parent().parent().parent().find('> .privacy_content').css('display'); | |
| if(privacy_dp == 'none'){ | |
변경 전my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 후my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy_box'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMarketingConsentOptionFl', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formJoin).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| // 전체선택(advertisingReceiveAll) 직접 조작 시 광고성 수신 동의(termsAgree7) 헤더도 동기화 | |
| $('#termsAgree7', $formJoin).prop('checked', isChecked).siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formJoin.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formJoin).length > 0; | |
| const allChannelChecked = $('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0; | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| // 수신 채널 전부 선택 시 광고성 수신 동의(termsAgree7) 헤더 ON (일부만이면 켜지 않음) | |
| if (allChannelChecked) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formJoin).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formJoin).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formJoin.on('change', '#privateMarketingConsentOptionFl', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formJoin).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 그룹 [선택] 헤더 체크 시 광고성 수신 동의·수신 채널 연동 | |
| $formJoin.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더도 선택 (하나라도 해제 시 해제) — 중첩 privacy_box 대응: 헤더 기준으로 그룹 판정 | |
| $formJoin.on('change', '.privacy_box :checkbox', function () { | |
| $('#termsAgree3, #termsAgree4, #termsAgree5, #termsAgree6', $formJoin).each(function () { | |
| const $header = $(this); | |
| const $subs = $header.closest('.privacy_box').find(':checkbox').not($header); | |
| if ($subs.length === 0) { | |
| return; | |
| } | |
| const allChecked = $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| }); | |
| // 초기 로드: 저장된 하위 선택 상태로 상위 [선택] 헤더 동기화 | |
| $('#termsAgree3, #termsAgree4, #termsAgree5, #termsAgree6', $formJoin).each(function () { | |
| const $subs = $(this).closest('.privacy_box').find(':checkbox').not(this); | |
| if ($subs.length > 0 && $subs.not(':checked').length === 0) { | |
| $(this).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| }); | |
| // 초기 로드: 수신 채널이 전부 선택된 상태면 광고성 수신 동의(termsAgree7) 헤더 ON | |
| if ($('.js_advertising_channel', $formJoin).length > 0 | |
| && $('.js_advertising_channel:not(:checked)', $formJoin).length === 0) { | |
| $('#termsAgree7', $formJoin).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| gd_select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 전join_agreement.html
| </div> | |
| </div> | |
| <!--{/}--> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| $(document).ready(function () { | |
| var body = $('body'), $formTerms = $('#formTerms'); | |
| $('#btnNextStep').click(function () { | |
| var pass = true; | |
| /* | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy-item'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| window.addEventListener('message', function (e) { | |
| if (e.origin === "{=authDreamUrl}") { | |
| $('#layerSearch').remove(); | |
| } | |
| }); | |
| }); | |
| /** | |
| * 아이폰+페이스북앱에서 location.href로 페이지 이동으로 처리시 | |
변경 후join_agreement.html
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateMarketingMember['modeFl']=='y'}--> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="termsAgree6" name=""> | |
| <label for="termsAgree6">({=__('선택')}) {=__('마케팅 목적 개인정보 수집 및 이용 동의')}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset toggle-switch">{=__('내용보기')} ▼</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="privateMktApprovalOption" name="privateMarketingConsentOptionFl"> | |
| <label for="privateMktApprovalOption">{=nl2br(privateMarketingMember['informNm'])}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset js_agreement_view" data-code="{privateMarketingMember['informCd']}">{=__('전체보기')}</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| {=nl2br(privateMarketingMember['content'])} | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="termsAgree7" name=""> | |
| <label for="termsAgree7">({=__('선택')}) {=__('광고성 수신 동의')}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset toggle-switch">{=__('내용보기')} ▼</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="advertisingReceiveAll" name=""> | |
| <label for="advertisingReceiveAll">{=nl2br(advertisingReceive['informNm'])}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset js_agreement_view" data-code="{advertisingReceive['informCd']}">{=__('전체보기')}</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| {=nl2br(advertisingReceive['content'])} | |
| </div> | |
| </div> | |
| <div class="js_advertising_channel_box"> | |
| <!--{? advertisingReceiveMailUse=='y'}--> | |
| <div class="privacy-item"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="maillingFl" name="maillingFl"> | |
| <label for="maillingFl">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse=='y'}--> | |
| <div class="privacy-item"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="smsFl" name="smsFl"> | |
| <label for="smsFl">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <p class="msg dn"> | |
| <span>{=__('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.')}</span> | |
| </p> | |
| $(document).ready(function () { | |
| var body = $('body'), $formTerms = $('#formTerms'); | |
| // 약관 전문 새창 열기 (전체보기) | |
| body.on('click', '.js_agreement_view', function () { | |
| window.open('../service/agreement.php?code=' + $(this).data('code')); | |
| }); | |
| $('#btnNextStep').click(function () { | |
| var pass = true; | |
| /* | |
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy-item'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMktApprovalOption', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7', $formTerms).length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel', $formTerms).prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $formTerms.on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $formTerms.on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel', $formTerms).prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } else { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked', $formTerms).length > 0; | |
| $('#advertisingReceiveAll', $formTerms).prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#privateMktApprovalOption', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6', $formTerms).prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| $formTerms.on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| window.addEventListener('message', function (e) { | |
| if (e.origin === "{=authDreamUrl}") { | |
| $('#layerSearch').remove(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더(termsAgree3~7)도 선택 (하나라도 해제 시 해제) | |
| $formTerms.on('change', '.privacy-item.toggle-item .privacy-body :checkbox', function () { | |
| const $group = $(this).closest('.privacy-body').closest('.privacy-item.toggle-item'); | |
| const $header = $group.children('.privacy-head').find(':checkbox'); | |
| const $subs = $group.children('.privacy-body').find(':checkbox'); | |
| if ($subs.length === 0) { | |
| return; | |
| } | |
| const allChecked = $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| /* | |
| * 전체 동의 역동기화 — 하위 체크박스가 모두 선택되면 전체 동의도 선택 (하나라도 해제되면 해제) | |
| */ | |
| const syncAllAgree = function () { | |
| const $targets = $(':checkbox', $formTerms).not('#allAgree').not('#termsAgree'); | |
| const allChecked = $targets.length > 0 && $targets.not(':checked').length === 0; | |
| $('#allAgree', $formTerms).prop('checked', allChecked) | |
| .siblings('label').toggleClass('on', allChecked); | |
| }; | |
| $formTerms.on('change', ':checkbox', function (e) { | |
| if (e.target.id === 'allAgree' || e.target.id === 'termsAgree') { | |
| return; | |
| } | |
| syncAllAgree(); | |
| }); | |
| }); | |
| /** | |
| * 아이폰+페이스북앱에서 location.href로 페이지 이동으로 처리시 | |
변경 전_join_view.html
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <!--{? joinField.maillingFl.use === 'y'}--> | |
| <div class="description chk"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="checkbox sp" id="maillingFl" name="maillingFl" value="y" {? data.maillingFl== | |
| 'y'}checked="checked"{/}> | |
| <label for="maillingFl">{=__('정보/이벤트 메일 수신에 동의합니다.')}</label> | |
| </span> | |
| </div> | |
| <!--{/}--> | |
| <div class="description_wrap"> | |
| <div class="description">※ {=__('아이디 비밀번호 찾기에 활용 되므로 정확하게 입력해 주세요')}</div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| <!--{? joinField.smsFl.use === 'y'}--> | |
| <div class="description chk"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="checkbox sp" id="smsFl" name="smsFl" value="y" {? data.smsFl== | |
| 'y'}checked="checked"{/}> | |
| <label for="smsFl">{=__('정보/이벤트 SMS 수신에 동의합니다.')}</label> | |
| </span> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| <!--{/}--><!--{? joinField.phone.use == 'y'}--> | |
변경 후_join_view.html
| <div class="input_wrap"> | |
| <div class="input_title"></div> | |
| <div class="input_content"> | |
| <div class="description_wrap"> | |
| <div class="description">※ {=__('아이디 비밀번호 찾기에 활용 되므로 정확하게 입력해 주세요')}</div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{/}--><!--{? joinField.phone.use == 'y'}--> | |
변경 전_join_view_other.html
| <!--{/}--> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y'}--> | |
| <div class="account_title"> | |
| <b class="title">{=__('약관동의현황')}</b> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{/}--> | |
| <script type="text/javascript"> | |
| $(document).ready(function () { | |
| e.preventDefault(); | |
| $('p.msg').addClass('hidden'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy-item'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| <!--{ ? useAppleLogin }--> | |
| $("#apple_btn").on("click", startClicked); | |
| function startClicked(){ | |
변경 후_join_view_other.html
| <!--{/}--> | |
| </div> | |
| <!--{/}--> | |
| <!--{? privateApprovalOption[0]['modeFl'] == 'y' || privateConsign[0]['modeFl']=='y' || privateOffer[0]['modeFl']=='y' || privateMktApprovalOption[0]['modeFl']=='y' || isUseAdvertisingReceive}--> | |
| <div class="account_title"> | |
| <b class="title">{=__('약관동의현황')}</b> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // privateOffer modeFl end}--> | |
| <!--{? privateMktApprovalOption[0]['modeFl'] == 'y'}--> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="termsAgree6" name=""> | |
| <label for="termsAgree6">({=__('선택')}) {=__('마케팅 목적 개인정보 수집 및 이용 동의')}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset toggle-switch">{=__('내용보기')} ▼</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| <!--{@ privateMktApprovalOption}--> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="privateMarketingConsentOptionFl" name="privateMarketingConsentOptionFl" value="y" <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="single <!--{? data['privateMarketingConsentOptionFl'] == 'y'}-->on<!--{/}-->" for="privateMarketingConsentOptionFl">{=nl2br(.informNm)}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset js_agreement_view" data-code="{.informCd}">{=__('전체보기')}</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| {=nl2br(.content)} | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| <!--{/ // privateMktApprovalOption modeFl end}--> | |
| <!--{? isUseAdvertisingReceive}--> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="termsAgree7" name=""> | |
| <label for="termsAgree7">({=__('선택')}) {=__('광고성 수신 동의')}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset toggle-switch">{=__('내용보기')} ▼</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| <div class="privacy-item toggle-item toggle-open"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp" id="advertisingReceiveAll" <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="single <!--{? data['maillingFl'] == 'y' || data['smsFl'] == 'y'}-->on<!--{/}-->" for="advertisingReceiveAll">{=nl2br(advertisingReceive['informNm'])}</label> | |
| </span> | |
| <div class="option"> | |
| <button type="button" class="btn-reset js_agreement_view" data-code="{advertisingReceive['informCd']}">{=__('전체보기')}</button> | |
| </div> | |
| </div> | |
| <div class="privacy-body"> | |
| {=nl2br(advertisingReceive['content'])} | |
| </div> | |
| </div> | |
| <div class="js_advertising_channel_box" style="display:flex; flex-direction:column; align-items:flex-start; margin:10px;"> | |
| <!--{? advertisingReceiveMailUse == 'y'}--> | |
| <div class="privacy-item"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="advertisingReceiveMail" name="maillingFl" value="y" <!--{? data['maillingFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="single <!--{? data['maillingFl'] == 'y'}-->on<!--{/}-->" for="advertisingReceiveMail">{=__('이메일 수신 동의')}</label> | |
| </span> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{? advertisingReceiveSmsUse == 'y'}--> | |
| <div class="privacy-item"> | |
| <div class="privacy-head"> | |
| <span class="inp_chk"> | |
| <input type="checkbox" class="sp js_advertising_channel" id="advertisingReceiveSms" name="smsFl" value="y" <!--{? data['smsFl'] == 'y'}-->checked="checked"<!--{/}-->> | |
| <label class="single <!--{? data['smsFl'] == 'y'}-->on<!--{/}-->" for="advertisingReceiveSms">{=__('모바일 메시지 수신 동의')}</label> | |
| </span> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/ // isUseAdvertisingReceive end}--> | |
| <!--{/}--> | |
| <script type="text/javascript"> | |
| $(document).ready(function () { | |
| e.preventDefault(); | |
| $('p.msg').addClass('hidden'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.privacy-item'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| // 마수동/광수동 약관 전문 새창 열기 (전체보기) | |
| $('.js_agreement_view').on('click', function () { | |
| window.open('../service/agreement.php?code=' + $(this).data('code')); | |
| }); | |
| <!--{ ? useAppleLogin }--> | |
| $("#apple_btn").on("click", startClicked); | |
| function startClicked(){ | |
변경 전my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.terms-view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |
변경 후my_page.html
| e.preventDefault(); | |
| $('p.msg').addClass('dn'); | |
| var $target = $(e.target), $label = $target.siblings('label'), $termsView = $target.closest('.terms-view'); | |
| var isTermsAgreeSelect = (e.target.id === 'termsAgree3') || (e.target.id === 'termsAgree4') || (e.target.id === 'termsAgree5') || (e.target.id === 'termsAgree6') || (e.target.id === 'termsAgree7'); | |
| var isTargetChecked = $target.prop('checked') === true; | |
| if (isTargetChecked) { | |
| } | |
| }); | |
| /* | |
| * 광고성 수신 동의 ↔ 이메일/모바일 수신 동의 ↔ 마케팅 목적 개인정보 수집 및 이용 동의 연동 (마이페이지 전용) | |
| * - 광고성 수신 동의 체크 → 이메일/모바일 채널 일괄 + 마케팅 목적 동의 ON | |
| * - 채널(1개 이상) 체크 → 광고성 수신 동의 + 마케팅 목적 동의 ON (채널은 각각 개별 토글) | |
| * - 이 스크립트는 마이페이지(my_page.html)에서만 로드되므로 $(document) 위임으로 바인딩해도 회원가입 화면엔 적용되지 않음 | |
| * (광고성 체크박스가 #formJoin 밖에 렌더되는 경우가 있어 $formJoin 스코프는 사용하지 않음) | |
| */ | |
| const checkMarketingApproval = function () { | |
| $('#privateMarketingConsentOptionFl').prop('checked', true).val('y').siblings('label').addClass('on'); | |
| $('#termsAgree6').prop('checked', true).siblings('label').addClass('on'); | |
| }; | |
| $(document).on('change', '#termsAgree7', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $(this).siblings('label').toggleClass('on', isChecked); | |
| $('#advertisingReceiveAll').prop('checked', isChecked) | |
| .siblings('label').toggleClass('on', isChecked); | |
| $('.js_advertising_channel').prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $(document).on('change', '#advertisingReceiveAll', function () { | |
| const isChecked = $(this).prop('checked') === true; | |
| $('.js_advertising_channel').prop('checked', isChecked).val(isChecked ? 'y' : 'n') | |
| .siblings('label').toggleClass('on', isChecked); | |
| // 전체선택(advertisingReceiveAll) 직접 조작 시 광고성 수신 동의(termsAgree7) 헤더도 동기화 | |
| $('#termsAgree7').prop('checked', isChecked).siblings('label').toggleClass('on', isChecked); | |
| if (isChecked) { | |
| checkMarketingApproval(); | |
| } | |
| }); | |
| $(document).on('change', '.js_advertising_channel', function () { | |
| const anyChannelChecked = $('.js_advertising_channel:checked').length > 0; | |
| const allChannelChecked = $('.js_advertising_channel').length > 0 | |
| && $('.js_advertising_channel:not(:checked)').length === 0; | |
| $('#advertisingReceiveAll').prop('checked', anyChannelChecked) | |
| .siblings('label').toggleClass('on', anyChannelChecked); | |
| if (anyChannelChecked) { | |
| checkMarketingApproval(); | |
| } | |
| // 수신 채널 전부 선택 시 광고성 수신 동의(termsAgree7) 헤더 ON (일부만이면 켜지 않음) | |
| if (allChannelChecked) { | |
| $('#termsAgree7').prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| if ($(this).prop('checked') === false) { | |
| $('#termsAgree7').prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 체크 시 광고성 수신 동의·수신 채널 일괄 선택 | |
| const checkAdvertising = function () { | |
| if ($('#termsAgree7').length === 0) { | |
| return; | |
| } | |
| $('#termsAgree7').prop('checked', true).siblings('label').addClass('on'); | |
| $('#advertisingReceiveAll').prop('checked', true).siblings('label').addClass('on'); | |
| $('.js_advertising_channel').prop('checked', true).val('y').siblings('label').addClass('on'); | |
| }; | |
| $(document).on('change', '#privateMarketingConsentOptionFl', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } else { | |
| $('#termsAgree6').prop('checked', false).siblings('label').removeClass('on'); | |
| } | |
| }); | |
| // 마케팅 목적 개인정보 수집 및 이용 동의 그룹 [선택] 헤더 체크 시 광고성 수신 동의·수신 채널 연동 | |
| $(document).on('change', '#termsAgree6', function () { | |
| if ($(this).prop('checked') === true) { | |
| checkAdvertising(); | |
| } | |
| }); | |
| // 그룹 하위 항목이 모두 선택되면 상위 [선택] 헤더도 선택 (하나라도 해제 시 해제) | |
| $(document).on('change', '.privacy-head :checkbox', function () { | |
| $('#termsAgree3, #termsAgree4, #termsAgree5, #termsAgree6').each(function () { | |
| const $header = $(this); | |
| const $subs = $header.closest('.privacy-item').find(':checkbox').not($header); | |
| if ($subs.length === 0) { | |
| return; | |
| } | |
| const allChecked = $subs.not(':checked').length === 0; | |
| $header.prop('checked', allChecked).siblings('label').toggleClass('on', allChecked); | |
| }); | |
| }); | |
| // 초기 로드: 저장된 하위 선택 상태로 상위 [선택] 헤더 동기화 | |
| $('#termsAgree3, #termsAgree4, #termsAgree5, #termsAgree6').each(function () { | |
| const $subs = $(this).closest('.privacy-item').find(':checkbox').not(this); | |
| if ($subs.length > 0 && $subs.not(':checked').length === 0) { | |
| $(this).prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| }); | |
| // 초기 로드: 수신 채널이 전부 선택된 상태면 광고성 수신 동의(termsAgree7) 헤더 ON | |
| if ($('.js_advertising_channel').length > 0 | |
| && $('.js_advertising_channel:not(:checked)').length === 0) { | |
| $('#termsAgree7').prop('checked', true).siblings('label').addClass('on'); | |
| } | |
| select_email_domain('email'); | |
| <!--{? (joinField.marriFl.use == 'y' && joinField.marriDate.use == 'y') || joinField.birthDt.use == 'y' }--> | |