본문으로 건너뛰기

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

PHP 8 · GODO25
변경 파일 수: 54개
변경 파일 목록
총 54개
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="/member/sms_auto.php" target="_blank" class="btn-link">SMS설정&gt;</a>&nbsp;&nbsp;<a href="/member/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="/member/sms_auto.php" target="_blank" class="btn-link">SMS설정&gt;</a>&nbsp;&nbsp;<a href="/member/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_view_history.php+1-1
변경 전_member_view_history.php
<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
<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+14-50
변경 전_member_view_other.php
<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>
 
변경 후_member_view_other.php
<col class="width-sm"/>
<col/>
</colgroup>
<?php foreach (($privateAgreementRows ?? []) as $row): ?>
<tr>
<th><?= $row['title'] ?></th>
<td>
<?php foreach ($row['lines'] as $line): ?>
<div><?= $line ?></div>
<?php endforeach; ?>
</td>
</tr>
<?php endforeach; ?>
<tr>
<th>광고성 수신 동의</th>
<td>
<?php foreach (($advertisingReceiveLines ?? []) as $line): ?>
<div><?= $line ?></div>
<?php endforeach; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
</td>
</tr>
</table>
 
Admin/member/_member_view.php+21-6
변경 전_member_view.php
<td colspan="3"><?= $data['sleepWakeDt']; ?></td>
</tr>
<?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<tr>
<th>이메일</th>
<td>
</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>
$mailAgreementView .= '<br/>(수신동의여부 확인메일 발송<br/> : ' . $data['lastNotificationDt']['mail'] . ')';
}
?>
<?= $data['maillingFl'] == 'y' ? $mailAgreementView : '거부 : ' . gd_date_format('Y-m-d', $mailLastReceiveAgreementDt); ?>
</td>
</tr>
<tr>
<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>
$smsAgreementView .= '<br/>(수신동의여부 확인SMS 발송<br/> : ' . $data['lastNotificationDt']['sms'] . ')';
}
?>
<?= $data['smsFl'] == 'y' ? $smsAgreementView : '거부 : ' . gd_date_format('Y-m-d', $smsLastReceiveAgreementDt); ?>
</td>
</tr>
<tr>
 
변경 후_member_view.php
<td colspan="3"><?= $data['sleepWakeDt']; ?></td>
</tr>
<?php } ?>
<?php if ($privateMarketingMemberUse): ?>
<tr>
<th>마케팅 목적 개인정보 수집 및 이용 동의</th>
<td>
<label class="checkbox-inline">
<input type="checkbox" name="privateMarketingConsentOptionFl" value="y" <?= ($mode === 'register') ? 'disabled' : '' ?> <?= $checked['privateMarketingConsentOptionFl']['y']; ?>/>
마케팅 목적 개인정보 수집 및 이용 동의
</label>
</td>
<th>마케팅 목적 개인정보 수집 및 이용 동의/거부일</th>
<td>
<?= ($data['privateMarketingConsentOptionFl'] === 'y' ? '동의 : ' : '거부 : ') . $data['privateMktAgreementDt'] ?>
</td>
</tr>
<?php endif; ?>
<tr>
<th>이메일</th>
<td>
</div>
<div class="form-inline">
<label class="checkbox-inline">
<input type="checkbox" name="maillingFl" <?= ($mode === 'register') ? 'disabled' : '' ?> value="y" data-default="" <?= $checked['maillingFl']['y']; ?>/>
마케팅 이메일 수신 동의
</label>
</div>
<p class="notice-danger notice-info">*수신동의설정 안내메일의 자동발송여부에 따라 회원정보의 수신동의설정 변경 시 해당 회원에게 안내메일이 자동 발송됩니다.</p>
$mailAgreementView .= '<br/>(수신동의여부 확인메일 발송<br/> : ' . $data['lastNotificationDt']['mail'] . ')';
}
?>
<?= $data['maillingFl'] == 'y' ? $mailAgreementView : '거부 : ' . $mailLastReceiveAgreementDt; ?>
</td>
</tr>
<tr>
<div class="form-inline">
<span id="cellPhoneMsg" class="input_error_msg"></span>
<label class="checkbox-inline">
<input type="checkbox" <?= ($mode === 'register') ? 'disabled' : '' ?> name="smsFl" value="y" <?= $checked['smsFl']['y']; ?>>
마케팅 모바일 메시지 수신 동의
</label>
</div>
<p class="notice-danger notice-info">*수신동의설정 안내메일의 자동발송여부에 따라 회원정보의 수신동의설정 변경 시 해당 회원에게 SMS가 자동 발송됩니다.</p>
$smsAgreementView .= '<br/>(수신동의여부 확인SMS 발송<br/> : ' . $data['lastNotificationDt']['sms'] . ')';
}
?>
<?= $data['smsFl'] == 'y' ? $smsAgreementView : '거부 : ' . $smsLastReceiveAgreementDt; ?>
</td>
</tr>
<tr>
 
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');
 
Component/Agreement/BuyerInformCode.php+37
변경 전BuyerInformCode.php
const PRIVATE_PROVIDER = '001010';
/** 마케팅 활용을 위한 개인정보 수집 · 이용 동의 (비회원 주문 시) */
const PRIVATE_MARKETING = '001011';
 
 
 
 
 
 
 
/** 이용안내 */
const BASE_GUIDE = '006001';
/** 탈퇴안내 */
case self::PRIVATE_MARKETING:
$this->initPrivateMarketing();
break;
 
 
 
 
 
 
}
}
 
$this->_groupCd = '001';
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* 멤버 변수를 배열로 반환하는 함수
*
 
변경 후BuyerInformCode.php
const PRIVATE_PROVIDER = '001010';
/** 마케팅 활용을 위한 개인정보 수집 · 이용 동의 (비회원 주문 시) */
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+14-2
변경 전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');
 
변경 후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');
 
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+138-1
변경 전MemberUtil.php
$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], '=선택=');
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
$tmpArray = array_map('trim', explode(',', $value['value']));
switch ($value['type']) {
default :
$html[] = '<input type="text" name="' . $key . '" class="form-control" value="' . gd_htmlspecialchars($fieldValue[$key]) . '"/>';
break;
case 'SELECT':
$html[] = gd_select_box($key, $key, gd_array_change_key_value($tmpArray), null, $fieldValue[$key], '=선택=');
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;
}
 
/**
* 로그인 되었는 지를 체크 (회원/비회원)
*
$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+27-3
변경 전MemberModifyController.php
$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') {
$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
$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;이용', 'use' => is_array($memberData['privateApprovalOptionFl'] ?? null), 'informs' => $privateApprovalOption, 'flags' => $memberData['privateApprovalOptionFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateApprovalOptionFl'] ?? $memberEntryDt],
['title' => '개인정보 취급위탁', 'use' => is_array($memberData['privateConsignFl'] ?? null), 'informs' => $privateConsign, 'flags' => $memberData['privateConsignFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateConsignFl'] ?? $memberEntryDt],
['title' => '개인정보 제3자 제공', 'use' => is_array($memberData['privateOfferFl'] ?? null), 'informs' => $privateOffer, 'flags' => $memberData['privateOfferFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateOfferFl'] ?? $memberEntryDt],
['title' => '마케팅 목적 개인정보 수집 및 이용 동의', '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') {
$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+28
변경 전MemberRegisterController.php
$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
$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');
 
$this->setData('mode', 'register');
$this->setData('joinField', $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+29-4
변경 전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('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;이용', 'use' => is_array($memberData['privateApprovalOptionFl'] ?? null), 'informs' => $privateApprovalOption, 'flags' => $memberData['privateApprovalOptionFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateApprovalOptionFl'] ?? $memberEntryDt],
['title' => '개인정보 취급위탁', 'use' => is_array($memberData['privateConsignFl'] ?? null), 'informs' => $privateConsign, 'flags' => $memberData['privateConsignFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateConsignFl'] ?? $memberEntryDt],
['title' => '개인정보 제3자 제공', 'use' => is_array($memberData['privateOfferFl'] ?? null), 'informs' => $privateOffer, 'flags' => $memberData['privateOfferFl'] ?? [], 'denyWhenMissing' => false, 'agreementDt' => $privateAgreementDt['privateOfferFl'] ?? $memberEntryDt],
['title' => '마케팅 목적 개인정보 수집 및 이용 동의', '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('modeTxt', '회원수정');
$this->setData('joinField', MemberUtil::getJoinField($memberData['mallSno']));
$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' }-->