Add multiple member agreements

- 가입 약관, 개인정보처리방침 등을 5개까지 추가할 수 있음
- 약관마다 각각 필수 또는 선택을 지정할 수 있음
- 모든 필수 약관에 동의해야 가입 가능
- 기본 스킨은 수정함. 서드파티 스킨에는 여전히 약관 1개만 표시됨
- 서드파티 스킨 사용시 동의 하나만 선택해도 전체 동의로 간주
This commit is contained in:
Kijin Sung 2017-11-27 14:43:20 +09:00
parent 20f924678a
commit 11c04c5a26
19 changed files with 251 additions and 72 deletions

View file

@ -8,6 +8,11 @@ $(function() {
"use strict";
// Disable debug panel?
if ($('body').hasClass("disable_debug_panel")) {
return;
}
// Find debug panel elements.
var panel = $("#rhymix_debug_panel");
var button = $("#rhymix_debug_button").show();

View file

@ -62,6 +62,8 @@
<action name="dispMemberAdminInsert" type="view" menu_name="userList" />
<action name="dispMemberAdminConfig" type="view" menu_name="userSetting" menu_index="true" />
<action name="dispMemberAdminFeaturesConfig" type="view" menu_name="userSetting" />
<action name="dispMemberAdminAgreementsConfig" type="view" menu_name="userSetting" />
<action name="dispMemberAdminAgreementsEdit" type="view" menu_name="userSetting" />
<action name="dispMemberAdminSignUpConfig" type="view" menu_name="userSetting" />
<action name="dispMemberAdminLoginConfig" type="view" menu_name="userSetting" />
<action name="dispMemberAdminDesignConfig" type="view" menu_name="userSetting" />
@ -78,6 +80,7 @@
<action name="procMemberAdminSelectedMemberManage" type="controller" ruleset="updateSeletecdMemberInfo" />
<action name="procMemberAdminInsertDefaultConfig" type="controller" ruleset="insertDefaultConfig" />
<action name="procMemberAdminInsertFeaturesConfig" type="controller" />
<action name="procMemberAdminInsertAgreementsConfig" type="controller" />
<action name="procMemberAdminInsertSignupConfig" type="controller" />
<action name="procMemberAdminInsertLoginConfig" type="controller" />
<action name="procMemberAdminInsertDesignConfig" type="controller" />

View file

@ -3,6 +3,7 @@ $lang->member = 'Member';
$lang->site = 'Site';
$lang->member_default_config = 'Basic Settings';
$lang->member_features_config = 'Features';
$lang->member_agreements_config = 'Terms of Service';
$lang->member_default_info = 'Basic Info';
$lang->member_extend_info = 'Additional Info';
$lang->default_group_1 = 'Associate Member';
@ -158,7 +159,7 @@ $lang->msg_not_uploaded_profile_image = 'Profile image could not be registered.'
$lang->msg_not_uploaded_image_name = 'Image name could not be registered.';
$lang->msg_not_uploaded_image_mark = 'Image mark could not be registered.';
$lang->msg_not_uploaded_group_image_mark = 'Group image mark could not be registered.';
$lang->msg_accept_agreement = 'You have to accept the agreement.';
$lang->msg_accept_agreement = 'You must accept all required agreements in order to sign up.';
$lang->msg_user_denied = 'You have entered a prohibited ID.';
$lang->msg_user_not_confirmed = 'Your account is not activated yet. Please check your email.';
$lang->msg_user_limited = 'You have entered an ID that cannot be used before %s';
@ -216,7 +217,7 @@ $lang->about_image_mark = 'Members will be able to use image mark in front of th
$lang->about_group_image_mark = 'You may use group marks shown before their names';
$lang->about_profile_image = 'Members will be able to use profile images';
$lang->about_signature_max_height = 'You can limit the signature max height. Set this as 0 or leave it blank not to limit it.';
$lang->about_accept_agreement = 'I have read the agreement and agree with it';
$lang->about_accept_agreement = 'I have read the above and agree with it.';
$lang->about_member_default = 'It will be set as the default group on sign up';
$lang->about_find_member_account = 'Please input the email address you have entered during the registration and we will send your account info to this email address.';
$lang->about_ssl_port = 'Please enter if you are using non-default SSL port';
@ -257,8 +258,12 @@ $lang->about_change_user_group = 'Resets the selected group of memebers.';
$lang->about_send_message = 'Send a message to the member about this. If you don\'t write a message, it is not sent.';
$lang->cmd_allowed = 'Allowed';
$lang->cmd_prohibited = 'Prohibited';
$lang->cmd_agreement_title = 'Title';
$lang->cmd_agreement_content = 'Content';
$lang->cmd_agreement_type = 'Agreement required';
$lang->cmd_required = 'Required';
$lang->cmd_optional = 'Optional';
$lang->cmd_disabled = 'Disabled';
$lang->cmd_image_max_width = 'Max Width';
$lang->cmd_image_max_height = 'Max Height';
$lang->cmd_input_extend_form = 'User Defined Input';

View file

@ -3,6 +3,7 @@ $lang->member = '회원';
$lang->site = '사이트';
$lang->member_default_config = '기본 설정';
$lang->member_features_config = '기능 설정';
$lang->member_agreements_config = '약관 설정';
$lang->member_default_info = '기본 정보';
$lang->member_extend_info = '추가 정보';
$lang->default_group_1 = '준회원';
@ -166,7 +167,7 @@ $lang->msg_not_uploaded_profile_image = '프로필 이미지를 등록할 수
$lang->msg_not_uploaded_image_name = '이미지 이름을 등록할 수 없습니다.';
$lang->msg_not_uploaded_image_mark = '이미지 마크를 등록할 수 없습니다.';
$lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수 없습니다.';
$lang->msg_accept_agreement = '약관에 동의해야 합니다.';
$lang->msg_accept_agreement = '필수 약관에 모두 동의해야 가입하실 수 있습니다.';
$lang->msg_user_denied = '입력한 아이디의 사용이 중지 되었습니다.';
$lang->msg_user_not_confirmed = '아직 메일 인증이 이루어지지 않았습니다. 메일을 확인해 주세요.';
$lang->msg_user_limited = '입력한 아이디는 %s 까지 사용하실 수 없습니다.';
@ -224,7 +225,7 @@ $lang->about_image_mark = '회원의 이름 앞에 마크를 달 수 있습니
$lang->about_group_image_mark = '회원의 이름 앞에 그룹 마크를 달 수 있습니다.';
$lang->about_profile_image = '회원의 프로필 이미지를 사용할 수 있게 합니다.';
$lang->about_signature_max_height = '서명란의 최대 높이를 제한할 수 있습니다. (0 또는 비워두면 제한하지 않습니다.)';
$lang->about_accept_agreement = '약관을 모두 읽었으며 동의합니다.';
$lang->about_accept_agreement = '위의 내용을 모두 읽었으며 동의합니다.';
$lang->about_member_default = '회원 가입을 한 사람이 최초에 속하는 그룹을 말합니다.';
$lang->about_find_member_account = '아이디/비밀번호는 가입시 등록한 메일 주소로 알려드립니다. 가입할 때 등록한 메일 주소를 입력하고 "ID/PW 찾기" 버튼을 클릭해주세요.<br />';
$lang->about_temp_password = '임시 비밀번호가 정상적으로 발급되었습니다.<br />로그인 후 반드시 비밀번호를 변경하세요.<br />';
@ -271,8 +272,12 @@ $lang->about_change_user_group = '선택한 회원의 그룹을 다시 설정.';
$lang->about_send_message = '회원에게 쪽지를 발송해서 이 사실을 알립니다. 작성하지 않으면 발송하지 않습니다.';
$lang->cmd_allowed = '허가';
$lang->cmd_prohibited = '제한';
$lang->cmd_agreement_title = '약관 제목';
$lang->cmd_agreement_content = '약관 내용';
$lang->cmd_agreement_type = '동의 필수 여부';
$lang->cmd_required = '필수';
$lang->cmd_optional = '선택';
$lang->cmd_disabled = '사용 안 함';
$lang->cmd_image_max_width = '너비 제한';
$lang->cmd_image_max_height = '높이 제한';
$lang->cmd_input_extend_form = '회원 정의 입력';

View file

@ -14,17 +14,22 @@
<input type="hidden" name="act" value="procMemberInsert" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/default/modify_info/1" />
<input type="hidden" name="success_return_url" value="{getUrl('act','dispMemberInfo')}" />
<!--@if(!$is_logged && $member_config->agreement)-->
<div class="agreement">
<div class="agreement" loop="$member_config->agreements => $i, $agreement" cond="$agreement->type !== 'disabled'">
<div class="title">
{$agreement->title}
<block cond="$agreement->type === 'required'">({$lang->cmd_required})</block>
<block cond="$agreement->type === 'optional'">({$lang->cmd_optional})</block>
</div>
<div class="text">
{$member_config->agreement}
{$agreement->content}
</div>
<div class="confirm">
<input type="checkbox" name="accept_agreement" value="Y" id="accept_agree" />
<label for="accept_agree">{$lang->about_accept_agreement}</label>
<label for="accept_agreement_{$i}">
<input type="checkbox" name="accept_agreement[{$i}]" value="Y" id="accept_agreement_{$i}" />
{$lang->about_accept_agreement}
</label>
</div>
</div>
<!--@end-->
<ul>
<li>
<label for="{$identifierForm->name}">{$identifierForm->title} <em style="color:red">*</em></label>

View file

@ -17,13 +17,18 @@
<input type="hidden" name="act" value="procMemberInsert" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins" />
<input type="hidden" name="success_return_url" value="{getUrl('act','dispMemberInfo')}" />
<div class="agreement" cond="$member_config->agreement">
<div class="agreement" loop="$member_config->agreements => $i, $agreement" cond="$agreement->type !== 'disabled'">
<div class="title">
{$agreement->title}
<block cond="$agreement->type === 'required'">({$lang->cmd_required})</block>
<block cond="$agreement->type === 'optional'">({$lang->cmd_optional})</block>
</div>
<div class="text">
{$member_config->agreement}
{$agreement->content}
</div>
<div class="confirm">
<label for="accept_agree">
<input type="checkbox" name="accept_agreement" value="Y" id="accept_agree" />
<label for="accept_agreement_{$i}">
<input type="checkbox" name="accept_agreement[{$i}]" value="Y" id="accept_agreement_{$i}" />
{$lang->about_accept_agreement}
</label>
</div>

View file

@ -244,6 +244,41 @@ class memberAdminController extends member
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminFeaturesConfig');
$this->setRedirectUrl($returnUrl);
}
public function procMemberAdminInsertAgreementsConfig()
{
$config = new stdClass;
$config->agreements = array();
$args = Context::getRequestVars();
for ($i = 1; $i < 20; $i++)
{
if (isset($args->{'agreement_' . $i . '_type'}))
{
$agreement = new stdClass;
$agreement->title = escape(utf8_trim($args->{'agreement_' . $i . '_title'}));
$agreement->content = $args->{'agreement_' . $i . '_content'};
$agreement->type = $args->{'agreement_' . $i . '_type'};
if (!in_array($agreement->type, array('required', 'optional', 'disabled')))
{
$agreement->type = 'disabled';
}
$config->agreements[$i] = $agreement;
}
}
// for compatibility with older versions
$config->agreement = $config->agreements[1]->content;
$oModuleController = getController('module');
$output = $oModuleController->updateModuleConfig('member', $config);
// default setting end
$this->setMessage('success_updated');
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminAgreementsConfig');
$this->setRedirectUrl($returnUrl);
}
public function procMemberAdminInsertSignupConfig()
{
@ -254,7 +289,6 @@ class memberAdminController extends member
'limit_day',
'limit_day_description',
'emailhost_check',
'agreement',
'redirect_url',
'profile_image', 'profile_image_max_width', 'profile_image_max_height',
'image_name', 'image_name_max_width', 'image_name_max_height',
@ -268,12 +302,6 @@ class memberAdminController extends member
$args->limit_day = (int)$args->limit_day;
if($args->emailhost_check != 'allowed' && $args->emailhost_check != 'prohibited') $args->emailhost_check == 'allowed';
if(!trim(strip_tags($args->agreement)))
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt';
FileHandler::removeFile($agreement_file);
$args->agreement = NULL;
}
if($args->redirect_url)
{
@ -353,18 +381,9 @@ class memberAdminController extends member
$args->signupForm = $signupForm;
// create Ruleset
$this->_createSignupRuleset($signupForm, $args->agreement);
$this->_createSignupRuleset($signupForm);
$this->_createLoginRuleset($args->identifier);
// check agreement value exist
if($args->agreement)
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt';
$output = FileHandler::writeFile($agreement_file, $args->agreement);
unset($args->agreement);
}
$output = $oModuleController->updateModuleConfig('member', $args);
// default setting end
@ -517,10 +536,9 @@ class memberAdminController extends member
/**
* Create ruleset file of signup
* @param object $signupForm (user define signup form)
* @param string $agreement
* @return void
*/
function _createSignupRuleset($signupForm, $agreement = null){
function _createSignupRuleset($signupForm){
$xml_file = './files/ruleset/insertMember.xml';
$buff = '<?xml version="1.0" encoding="utf-8"?>' . PHP_EOL.
'<ruleset version="1.5.0">' . PHP_EOL.
@ -531,10 +549,6 @@ class memberAdminController extends member
$fields = array();
if ($agreement)
{
$fields[] = '<field name="accept_agreement"><if test="$act == \'procMemberInsert\'" attr="required" value="true" /></field>';
}
foreach($signupForm as $formInfo)
{
if($formInfo->required || $formInfo->mustRequired)

View file

@ -147,6 +147,46 @@ class memberAdminView extends member
$this->setTemplateFile('features_config');
}
/**
* Set the agreements config.
*
* @return void
*/
public function dispMemberAdminAgreementsConfig()
{
$this->setTemplateFile('agreements_config');
}
/**
* Display the agreements edit form.
*
* @return void
*/
public function dispMemberAdminAgreementsEdit()
{
$agreement_id = intval(Context::get('id'));
Context::set('agreement_id', $agreement_id);
Context::set('agreement_content', getModel('member')->getMemberConfig()->agreements[$agreement_id]->content);
Context::addBodyClass('disable_debug_panel');
$oEditorModel = getModel('editor');
$option = $oEditorModel->getEditorConfig();
$option->primary_key_name = 'agreement_id';
$option->content_key_name = 'agreement_content';
$option->allow_fileupload = FALSE;
$option->enable_autosave = FALSE;
$option->enable_default_component = TRUE;
$option->enable_component = FALSE;
$option->height = 300;
$option->editor_focus = 'N';
$editor = $oEditorModel->getEditor($logged_info->member_srl, $option);
Context::set('editor', $editor);
$this->setLayoutPath('./common/tpl/');
$this->setLayoutFile("default_layout");
$this->setTemplateFile('agreements_edit');
}
public function dispMemberAdminSignUpConfig()
{
$config = $this->memberConfig;

View file

@ -213,12 +213,10 @@ class member extends ModuleObject {
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('member');
// check signup form ordering info
if(!$config->signupForm) return true;
// check agreement field exist
if($config->agreement && $config->agreement !== memberModel::_getAgreement())
if(!$config->signupForm || !is_array($config->signupForm)) return true;
foreach($config->signupForm as $signupItem)
{
return true;
if($signupItem->name === 'find_account_question') return true;
}
if($config->skin)
@ -340,24 +338,24 @@ class member extends ModuleObject {
$config = $oModuleModel->getModuleConfig('member');
$oModuleController = getController('module');
// check agreement value exist
if($config->agreement && $config->agreement !== memberModel::_getAgreement())
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt';
$output = FileHandler::writeFile($agreement_file, $config->agreement);
$config->agreement = NULL;
$output = $oModuleController->updateModuleConfig('member', $config);
}
$oMemberAdminController = getAdminController('member');
// check signup form ordering info
if(!$config->signupForm || !is_array($config->signupForm))
{
$identifier = 'user_id';
$config->signupForm = $oMemberAdminController->createSignupForm($identifier);
$config->identifier = $identifier;
$config->identifier = 'user_id';
$config->signupForm = $oMemberAdminController->createSignupForm($config->identifier);
$output = $oModuleController->updateModuleConfig('member', $config);
}
foreach($config->signupForm as $signupItem)
{
if($signupItem->name === 'find_account_question')
{
$config->identifier = $config->identifier ?: 'user_id';
$config->signupForm = $oMemberAdminController->createSignupForm($config->identifier);
$output = $oModuleController->updateModuleConfig('member', $config);
break;
}
}
if($config->skin)
{

View file

@ -583,8 +583,16 @@ class memberController extends member
if(!$trigger_output->toBool ()) return $trigger_output;
// Check if an administrator allows a membership
if($config->enable_join != 'Y') return $this->stop ('msg_signup_disabled');
// Check if the user accept the license terms (only if terms exist)
if($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement');
$accept_agreement = Context::get('accept_agreement');
foreach($config->agreements as $i => $agreement)
{
if($agreement->type === 'required' && $accept_agreement !== 'Y' && $accept_agreement[$i] !== 'Y')
{
return $this->stop('msg_accept_agreement');
}
}
// Extract the necessary information in advance
$getVars = array();

View file

@ -50,7 +50,14 @@ class memberModel extends member
}
// Get terms of user
$config->agreement = memberModel::_getAgreement();
if(!$config->agreements)
{
$config->agreement = memberModel::_getAgreement();
$config->agreements[1] = new stdClass;
$config->agreements[1]->title = lang('agreement');
$config->agreements[1]->content = $config->agreement;
$config->agreements[1]->type = 'required';
}
if(!$config->webmaster_name) $config->webmaster_name = 'webmaster';
if(!$config->image_name_max_width) $config->image_name_max_width = 90;
@ -86,6 +93,9 @@ class memberModel extends member
return $config;
}
/**
* @deprecated
*/
function _getAgreement()
{
$agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt';

View file

@ -318,6 +318,7 @@
.xm .signin #warning{margin-right:-14px}
.xm .signin #warning>p{margin:10px 0}
.xm .agreement{border:1px solid #ddd;padding:15px 15px 10px 15px;border-radius:5px;background:#f8f8f8;margin-bottom:15px}
.xm .agreement>.title{padding: 0 0 10px 0;margin:0 0 10px 0;border-bottom:1px dotted #ccc; font-size:16px;font-weight:bold}
.xm .agreement>.text{max-height:200px;overflow:auto}
.xm .agreement>.confirm{padding:10px 0 0 0;margin:10px 0 0 0;border-top:1px dotted #ccc}
@media all and (max-width:480px){.xm .signin{margin:0;width:100%}}

View file

@ -11,13 +11,18 @@
<input type="hidden" name="act" value="procMemberInsert" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins" />
<input type="hidden" name="success_return_url" value="{getUrl('act','dispMemberInfo')}" />
<div class="agreement" cond="$member_config->agreement">
<div class="agreement" loop="$member_config->agreements => $i, $agreement" cond="$agreement->type !== 'disabled'">
<div class="title">
{$agreement->title}
<block cond="$agreement->type === 'required'">({$lang->cmd_required})</block>
<block cond="$agreement->type === 'optional'">({$lang->cmd_optional})</block>
</div>
<div class="text">
{$member_config->agreement}
{$agreement->content}
</div>
<div class="confirm">
<label for="accept_agree">
<input type="checkbox" name="accept_agreement" value="Y" id="accept_agree" />
<label for="accept_agreement_{$i}">
<input type="checkbox" name="accept_agreement[{$i}]" value="Y" id="accept_agreement_{$i}" />
{$lang->about_accept_agreement}
</label>
</div>

View file

@ -16,13 +16,18 @@
<input type="hidden" name="act" value="procMemberInsert" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins" />
<input type="hidden" name="success_return_url" value="{getUrl('act','dispMemberInfo')}" />
<div class="agreement" cond="$member_config->agreement">
<div class="agreement" loop="$member_config->agreements => $i, $agreement" cond="$agreement->type !== 'disabled'">
<div class="title">
{$agreement->title}
<block cond="$agreement->type === 'required'">({$lang->cmd_required})</block>
<block cond="$agreement->type === 'optional'">({$lang->cmd_optional})</block>
</div>
<div class="text">
{$member_config->agreement}
{$agreement->content}
</div>
<div class="confirm">
<label for="accept_agree">
<input type="checkbox" name="accept_agreement" value="Y" id="accept_agree" />
<label for="accept_agreement_{$i}">
<input type="checkbox" name="accept_agreement[{$i}]" value="Y" id="accept_agreement_{$i}" />
{$lang->about_accept_agreement}
</label>
</div>

View file

@ -0,0 +1,39 @@
<include target="header.html" />
<load target="js/default_config.js" />
<form action="./" class="x_form-horizontal" method="post">
<input type="hidden" name="module" value="member" />
<input type="hidden" name="act" value="procMemberAdminInsertAgreementsConfig" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin', 'act', $act)}" />
<input type="hidden" name="xe_validator_id" value="modules/member/tpl/1" />
<!--@for($i = 1; $i <= 5; $i++)-->
<section class="section">
<h2>{$lang->agreement} {$i}</h2>
<div class="x_control-group">
<div class="x_control-label" for="agreement_{$i}_title">{$lang->cmd_agreement_title}</div>
<div class="x_controls">
<input type="text" name="agreement_{$i}_title" id="agreement_{$i}_title" value="{$config->agreements[$i]->title}" />
</div>
</div>
<div class="x_control-group">
<div class="x_control-label">{$lang->cmd_agreement_content}</div>
<div class="x_controls">
<input type="hidden" name="agreement_{$i}_content" id="agreement_{$i}_content" value="{escape($config->agreements[$i]->content)}" />
<iframe id="agreement_{$i}_iframe" class="agreement_iframe" src="{getUrl('act', 'dispMemberAdminAgreementsEdit', 'id', $i)}"></iframe>
</div>
</div>
<div class="x_control-group">
<div class="x_control-label">{$lang->cmd_agreement_type}</div>
<div class="x_controls">
<label class="x_inline" for="agreement_{$i}_required"><input type="radio" name="agreement_{$i}_type" id="agreement_{$i}_required" value="required" checked="checked"|cond="$config->agreements[$i]->type === 'required'" /> {$lang->cmd_required}</label>
<label class="x_inline" for="agreement_{$i}_optional"><input type="radio" name="agreement_{$i}_type" id="agreement_{$i}_optional" value="optional" checked="checked"|cond="$config->agreements[$i]->type === 'optional'" /> {$lang->cmd_optional}</label>
<label class="x_inline" for="agreement_{$i}_disabled"><input type="radio" name="agreement_{$i}_type" id="agreement_{$i}_disabled" value="disabled" checked="checked"|cond="$config->agreements[$i]->type === 'disabled' || !$config->agreements[$i]->type" /> {$lang->cmd_disabled}</label>
</div>
</div>
</section>
<!--@end-->
<div class="btnArea x_clearfix">
<span class="x_pull-right"><input class="x_btn x_btn-primary" type="submit" value="{$lang->cmd_save}" /></span>
</div>
</form>

View file

@ -0,0 +1,28 @@
<script>
$(function() {
var editor;
var parent = window.opener ? window.opener : window.parent;
CKEDITOR.on('instanceReady', function(evt) {
editor = evt.editor;
editor.on("resize", function(evt){
var height = evt.data.outerHeight;
$("#agreement_{$agreement_id}_iframe", parent.document).height(height);
});
editor.on("change", function() {
var content = editor.getData();
$("#agreement_{$agreement_id}_content", parent.document).val(content);
});
$("#agreement_{$agreement_id}_iframe", parent.document).height($(".cke_chrome").first().parent().height());
});
});
</script>
<style>
body { margin: 0; }
</style>
<form>
<input type="hidden" name="agreement_id" id="agreement_id" value="{$agreement_id}" />
<input type="hidden" name="agreement_content" id="agreement_content" value="{escape($agreement_content)}" />
{$editor}
</form>

View file

@ -0,0 +1,9 @@
.agreement_iframe {
display: inline-block;
width: 100%;
box-sizing: border-box;
margin-bottom: -4px;
padding: 0;
border: 0;
height: 440px;
}

View file

@ -1,3 +1,4 @@
<load target="css/config.css" />
<load target="js/config.js" />
<div class="x_page-header">
<h1>{$lang->cmd_member_config} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_member_config" target="_blank">{$lang->help}</a></h1>
@ -8,6 +9,7 @@
<ul class="x_nav x_nav-tabs">
<li class="x_active"|cond="$act == 'dispMemberAdminConfig'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminConfig')}">{$lang->member_default_config}</a></li>
<li class="x_active"|cond="$act == 'dispMemberAdminFeaturesConfig'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminFeaturesConfig')}">{$lang->member_features_config}</a></li>
<li class="x_active"|cond="$act == 'dispMemberAdminAgreementsConfig'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminAgreementsConfig')}">{$lang->member_agreements_config}</a></li>
<li class="x_active"|cond="$act == 'dispMemberAdminSignUpConfig'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminSignUpConfig')}">{$lang->cmd_signup}</a></li>
<li class="x_active"|cond="$act == 'dispMemberAdminLoginConfig'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminLoginConfig')}">{$lang->cmd_login}</a></li>
<li class="x_active"|cond="$act == 'dispMemberAdminDesignConfig'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminDesignConfig')}">{$lang->cmd_set_design_info}</a></li>

View file

@ -74,14 +74,6 @@
<p class="x_help-inline">{$lang->about_redirect_url}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="agreement">{$lang->agreement}</label>
<div class="x_controls">{$editor}</div>
<style scoped>
#smart_content,
#smart_content>.tool{clear:none !important}
</style>
</div>
<div class="x_control-group">
<p class="x_control-label">{$lang->cmd_manage_form} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_faq_member_joinform" target="_blank">{$lang->help}</a></p>
<div class="x_controls">