본문으로 건너뛰기

개인정보 수집 및 이용 동의 템플릿 개정

PHP 8 · GODO26
변경 파일 수: 59개
변경 파일 목록
총 59개
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/
변경 파일 코드
추가삭제
Admin/member/excel_member_up.php+3
변경 전excel_member_up.php
<div class="notice-info">
엑셀업로드 전 회원가입 시 발송 가능한 항목(회원가입, 마일리지 지급, 회원가입 축하 쿠폰)의 발송설정을 확인해주시기 바랍니다. <a href="/crm/auto_send.php" target="_blank" class="btn-link">SMS설정&gt;</a>&nbsp;&nbsp;<a href="/crm/mail_config_auto.php" target="_blank" class="btn-link">자동 메일 설정&gt;</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설정&gt;</a>&nbsp;&nbsp;<a href="/crm/mail_config_auto.php" target="_blank" class="btn-link">자동 메일 설정&gt;</a>
</div>
<div class="notice-info">
마케팅 목적 개인정보 수집 및 이용 항목 업로드 시 반드시 고객으로부터 받은 별도의 개인정보 수집·이용 동의서를 보유하고 계셔야 하며, NHN COMMERCE는 수탁사로서 업로드되는 데이터에 대한 책임을 지지 않습니다.
</div>
</td>
</tr>
</table>
 
Admin/member/member_detail_search.php+21-1
변경 전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"
 
Admin/member/member_joinitem.php+2-34
변경 전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>'+"-&nbsp;&nbsp;&nbsp;회원가입 항목에서 개인 정보 유효기간 미사용 시 1년간 쇼핑몰을 이용하지 않는 회원들을 "+'<br>'+"&nbsp;&nbsp;&nbsp;&nbsp;휴면회원으로 일괄 전환합니다."+'<br>'+"-&nbsp;&nbsp;&nbsp;개인 정보 유효기간 사용 시 회원에게 ‘휴면회원 방지기간’ 정보를 수집할 수 있으며, 각 회원이 "+'<br>'+"&nbsp;&nbsp;&nbsp;&nbsp;“1년(기본값)/3년/5년/탈퇴 시” 중 선택한 기간 동안 쇼핑몰을 이용하지 않는 경우 해당 회원의"+'<br>'+"&nbsp;&nbsp;&nbsp;&nbsp;정보를 휴면회원으로 전환합니다."+'<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>'+"-&nbsp;&nbsp;&nbsp;회원가입 항목에서 개인 정보 유효기간 미사용 시 1년간 쇼핑몰을 이용하지 않는 회원들을 "+'<br>'+"&nbsp;&nbsp;&nbsp;&nbsp;휴면회원으로 일괄 전환합니다."+'<br>'+"-&nbsp;&nbsp;&nbsp;개인 정보 유효기간 사용 시 회원에게 ‘휴면회원 방지기간’ 정보를 수집할 수 있으며, 각 회원이 "+'<br>'+"&nbsp;&nbsp;&nbsp;&nbsp;“1년(기본값)/3년/5년/탈퇴 시” 중 선택한 기간 동안 쇼핑몰을 이용하지 않는 경우 해당 회원의"+'<br>'+"&nbsp;&nbsp;&nbsp;&nbsp;정보를 휴면회원으로 전환합니다."+'<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>';
 
Admin/member/member_modify.php+16-2
변경 전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>
 
Admin/member/member_register.php+28-3
변경 전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>
 
Admin/member/_member_view_app_device.php+91-85
변경 전_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>
 
Admin/member/_member_view_business.php+318-215
변경 전_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>
 
Admin/member/_member_view_history.php+65-48
변경 전_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 %>&nbsp;&gt;&nbsp;<%- 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 %>&nbsp;&gt;&nbsp;<%- 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>
 
Admin/member/_member_view_other.php+306-211
변경 전_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">
개인정보 수집&middot;이용 선택동의 내역
</div>
<div class="form-inline">
<table class="table table-cols">
<colgroup>
<col class="width-sm"/>
<col/>
</colgroup>
<tr>
<th>개인정보<br/>수집&middot;이용</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">개인정보 수집&middot;이용 선택동의 내역</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>
 
Admin/member/_member_view.php+427-282
변경 전_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">
&nbsp;&nbsp;
<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>
 
Admin/policy/base_agreement_with_private.php+98
변경 전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');
 
Admin/share/member_crm_detail.php+15-1
변경 전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>
 
Component/Agreement/BuyerInformCode.php+37
변경 전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';
}
 
/**
* 멤버 변수를 배열로 반환하는 함수
*
 
Component/Agreement/BuyerInform.php+104
변경 전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 . "'";
 
Component/Agreement/BuyerInformVo.php+17
변경 전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
*
 
Component/Database/DBTableField.php+1
변경 전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
 
 
Component/Database/MemberTableField.php+12
변경 전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',
 
Component/Excel/ExcelMember.php+10-1
변경 전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',
 
Component/Member/History.php+114-25
변경 전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;
}
}
}
 
Component/Member/MemberAdmin.php+10-2
변경 전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'], '') !== '') {
 
Component/Member/MemberDAO.php+18-4
변경 전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');
 
 
Component/Member/Member.php+59
변경 전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
);
 
 
Component/Member/MemberVO.php+34
변경 전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
*/
 
Component/Member/MyPage.php+13
변경 전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;
}
}
 
Component/Member/Util/MemberUtil.php+177-14
변경 전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"';
 
 
Controller/Admin/Member/MemberModifyController.php+34-4
변경 전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' => '개인정보 수집&middot;이용', '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);
 
Controller/Admin/Member/MemberPsController.php+26
변경 전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()) {
 
Controller/Admin/Member/MemberRegisterController.php+33
변경 전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' => '개인정보 수집&middot;이용', '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);
 
Controller/Admin/Policy/BaseAgreementWithPrivateController.php+12
변경 전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']);
 
Controller/Admin/Policy/BaseAgreementWithPrivatePsController.php+35-2
변경 전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()) {
 
Controller/Admin/Share/MemberCrmDetailController.php+32-5
변경 전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' => '개인정보 수집&middot;이용', '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);
 
Controller/Front/Member/JoinAgreementController.php+9
변경 전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);
 
Controller/Front/Member/LoginPsController.php+7
변경 전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);
 
Controller/Front/Mypage/MyPageController.php+8
변경 전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());
 
Controller/Front/Service/AgreementController.php+6
변경 전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;
 
data/skin/front/moment/member/join_agreement.html+176-1
변경 전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 }
 
data/skin/front/moment/member/_join_view.html-12
변경 전_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>
<!--{/}-->
 
data/skin/front/moment/member/_join_view_other.html+98-1
변경 전_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 -->
<!--{ / }-->
 
data/skin/front/moment/mypage/my_page.html+101-1
변경 전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' }-->
 
data/skin/front/mygreek/member/join_agreement.html+176-1
변경 전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 }
 
data/skin/front/mygreek/member/_join_view.html-12
변경 전_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>
<!--{/}-->
 
data/skin/front/mygreek/member/_join_view_other.html+98-1
변경 전_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 -->
<!--{ / }-->
 
data/skin/front/mygreek/mypage/my_page.html+101-1
변경 전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' }-->
 
data/skin/front/story_g/member/join_agreement.html+185-1
변경 전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 }
 
data/skin/front/story_g/member/_join_view.html-12
변경 전_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'}-->
 
data/skin/front/story_g/member/_join_view_other.html+102
변경 전_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}-->
 
data/skin/front/story_g/mypage/my_page.html+102-1
변경 전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' }-->
 
data/skin/mobile/moment/member/join_agreement.html+176-2
변경 전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();
});
});
 
/**
 
data/skin/mobile/moment/member/_join_view.html-22
변경 전_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">
 
data/skin/mobile/moment/member/_join_view_other.html+88-3
변경 전_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'){
 
data/skin/mobile/moment/mypage/my_page.html+95-1
변경 전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' }-->
 
data/skin/mobile/mygreek/member/join_agreement.html+176-2
변경 전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();
});
});
 
/**
 
data/skin/mobile/mygreek/member/_join_view.html-22
변경 전_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">
 
data/skin/mobile/mygreek/member/_join_view_other.html+88-3
변경 전_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'){
 
data/skin/mobile/mygreek/mypage/my_page.html+95-1
변경 전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' }-->
 
data/skin/mobile/story_g/member/join_agreement.html+177-1
변경 전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로 페이지 이동으로 처리시
 
data/skin/mobile/story_g/member/_join_view.html-18
변경 전_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'}-->
 
data/skin/mobile/story_g/member/_join_view_other.html+89-2
변경 전_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(){
 
data/skin/mobile/story_g/mypage/my_page.html+97-1
변경 전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' }-->