SlideShare a Scribd company logo
1 of 16
X p r e s s E n g i n eX E H u b
# 오승훈
1. 소개
2. 개요
3. 구조
XE3.0
Frontend
Validator
XE3.0 을 만들 때 이런 생각을 했습니다.
javascript form validation .. 귀찮다!!!
Backend 에서 처리하는 Validation 이 있는데 Javascript 에서도 또 만들어야 하나..
Backend 에서 사용한 Validation Rule 을 Frontend 에서 사용할 수 있게 해보자!
Frontend Validator
Frontend Validation
<script type="text/javascript">
var ruleSet = { ruleName: "join", rules:
{"email":"required|email","display_name":"required","password":"required|confi
rmed|password","agree_termsofservice":"accepted","agree_private_info_colle
ct":"accepted"} };
</script>
data-rule
하나의 페이지에서 여러개의 validation rule 사용
data-rule 로 사용할 frontend validator 이름 설정
개요 <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type">
data-rule-alert-type
경고 메시지 처리 방법 설정
기본으로 toast, form 두가지 타입 제공
사용자는 별도의 메시지 처리 방식 사용할 수 있음
data-rule
<script type="text/javascript">
var ruleSet = { ruleName: "join", rules:
{"email":"required|email","display_name":"required","password":"required|confi
rmed|password","agree_termsofservice":"accepted","agree_private_info_colle
ct":"accepted"} };
</script>
하나의 페이지에서 여러개의 validation rule 사용
data-rule 로 사용할 frontend validator 이름 설정
<form action="action_url" method="post" data-rule="join"
data-rule-alert-type="custom_alert_type">
toast 사용
data-rule-alert-type
<form action="action_url" method="post" data-rule="join"
data-rule-alert-type="toast">
<form action="action_url" method="post" data-rule="join"
data-rule-alert-type="custom_alert_type">
custom alert type 사용
구조
동작
1. XeFrontend::rule() 로 form 에서 사용할 validation rule set 정의
2. form 에 data-rule 로 validation rule set 이름 지정
3. $('body').on('submit', 'form[data-rule]', ...) 으로 form 전송할 때 validation 실행
{{ XeFrontend::rule('join', [
"email" => "required|email"
"display_name" => "required"
"password" => "required|confirmed|password"
"agree_termsofservice" => "accepted"
"agree_private_info_collect" => "accepted"
]) }}
사용할 validation 정의
XeFrontend::rule 에서 지정한 첫번째 인자값 사용
data-rule="join"
data-rule 지정
form submit 이벤트 발생하면 validation 실행
javascript validator 사용
실패할 경우 griper 로 메시지 출력
form submit
<form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type">
...
</form>
<script>
var ruleSet = { ruleName: "join", rules:
{"email":"required|email","display_name":"required","password":"required|confirmed|password","agree_termsofservice":"accepted","agre
e_private_info_collect":"accepted"} }
</script>
<script>
$(function() {
XE.Validator.rules.join.password_confirmation = 'password_confirmation';
});
</script>
사용할 validation 정의
1. validator 가 ruleSet 변수에 할당된 json 데이터를 기반으로 처리
2. ruleSet 변수 할당은 {{ XeFrontend::rule($array) }} 로 처리
3. validator
https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/index.js#L508
{{ XeFrontend::rule('join', [
"email" => "required|email"
"display_name" => "required"
"password" => "required|confirmed|password"
"agree_termsofservice" => "accepted"
"agree_private_info_collect" => "accepted"
]) }}
HTML
PHP
<form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type">
...
</form>
<script>
var ruleSet = { ruleName: "join", rules:
{"email":"required|email","display_name":"required","password":"required|confirmed|password","agree_termsofservice":"accepted","agre
e_private_info_collect":"accepted"} }
</script>
<script>
$(function() {
XE.Validator.rules.join.password_confirmation = 'password_confirmation';
});
</script>
validator evaluator
1. Backend(PHP) 에 구현된 rule 코드를 Frontend validator 에 구현
2. rule 에 대한 처리 코드
https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/index.js#L54
required: function ($dst, parameters) {
const value = that.getValue($dst)
if (value === '') {
let errorMessage = 'validation.required'
if ($dst.is('input[type=checkbox]') ||
$dst.is('input[type=radio]')) {
errorMessage = 'validation.required_check'
} else if ($dst.is('input[type=select]')) {
errorMessage = 'validation.required_select'
}
that.error($dst, langInstance.trans(errorMessage, { attribute:
$dst.data('valid-name') || $dst.attr('name') }))
return false
}
return true
},
HTML
JAVASCRIPT
<form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type">
...
</form>
<script>
var ruleSet = { ruleName: "join", rules:
{"email":"required|email","display_name":"required","password":"required|confirmed|password","agree_termsofservice":"accepted","agre
e_private_info_collect":"accepted"} }
</script>
<script>
$(function() {
XE.Validator.rules.join.password_confirmation = 'password_confirmation';
});
</script>
validator custom rule
1. 코어에서 지원하지 않는 password_confirmation 처리
추가 rule 지정, XE.Validator.put()
https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/index.js#L736
2. 추가한 rule 을 form 에 연결
join 으로 정의한 validation 에 추가한 password_confirmation 연결
XE.Validator.put('password_confirmation', function ($dst,
parameters) {
if ($dst.val() == '') {
XE.Validator.error($dst, "비밀번호를 한번 더 입력해주세요
.");
return false;
}
var password = $('[name="password"]').val();
if ($dst.val() != password) {
XE.Validator.error($dst, "비밀번호가 일치하지 않습니다.");
return false;
}
return true;
});
JAVASCRIPTHTML
griper
1. griper
사용자 메시지 출력
toast, form 두가지 방식으로 메시지 처리
2. validator evaluator 가 실패할 경우 메시지 처리
XE.validator.error() 가 griper 사용해서 메시지 처리
https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/i
ndex.js#L786
3. XE.validator.extendAlertType() 으로 메시지 처리 방식 추가
var custom_alert_type = {
constructor: this,
options: {
selectors: {elementGroup: '.form-group', errorText: '.__xe_error_text'},
classes: {message: ['error-text', '__xe_error_text', 'text_caution']},
tags: {message: 'p'}
},
getGroup: function ($element) {
return $element.closest(this.options.selectors.elementGroup)
},
putByElement: function ($element, message) {
this.put(this.getGroup($element), message, $element)
},
put: function ($group, message, $element) { ... },
clear: function ($form) {
$form.find(this.options.tags.message + this.options.selectors.errorText).remove()
}
};
XE.Validator.extendAlertType('custom_alert_type', function ($element, message) {
custom_alert_type.putByElement($element, message);
});
JAVASCRIPT
메시지 출력 대상 이름 지정
1. 입력 상자 이름 지정
"이메일" 이름을 지정할 때 대상을 지정할 방법 필요
<form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type">
...
<input type="text" name="email" id="email" title="이메일" placeholder="이메일:예)hello@homespace.co.kr"
class="inp_apply_common" value="" data-valid-name="이메일">
...
</form>
HTML
translator
1. XE 는 다국어 지원
메시지 처리할 때 다국어 지원
https://github.com/xpressengine/xpressengine/blob/master/resources/ass
ets/core/validator/index.js#L97
2. 메시지 출력할 때 message key 사용
validation.required 와 같이 메시지를 직접 사용하지 않고 message key 로
지정
Backend 에서 정의된 메시지
https://github.com/xpressengine/xpressengine/blob/master/resources/lan
g/ko/validation.php
https://github.com/xpressengine/xpressengine/blob/master/resources/lan
g/common.php
required: function ($dst, parameters) {
const value = that.getValue($dst)
if (value === '') {
let errorMessage = 'validation.required'
if ($dst.is('input[type=checkbox]') ||
$dst.is('input[type=radio]')) {
errorMessage = 'validation.required_check'
} else if ($dst.is('input[type=select]')) {
errorMessage = 'validation.required_select'
}
that.error($dst, langInstance.trans(errorMessage, { attribute:
$dst.data('valid-name') || $dst.attr('name') }))
return false
}
return true
},
JAVASCRIPT
T h a n k y o u
X E H U B

More Related Content

What's hot

vine webdev
vine webdevvine webdev
vine webdevdcfc1997
 
Vuejs 시작하기
Vuejs 시작하기Vuejs 시작하기
Vuejs 시작하기성일 한
 
XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우
XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우
XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우XpressEngine
 
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화Jinhwa Ko
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1성일 한
 
Opinion 프로젝트 발표 자료
Opinion 프로젝트 발표 자료Opinion 프로젝트 발표 자료
Opinion 프로젝트 발표 자료joonseokkim11
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기NAVER D2
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기성일 한
 
Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자Kyoung Up Jung
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?Kyoung Up Jung
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기영우 박
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storageJinKyoungHeo
 

What's hot (17)

vine webdev
vine webdevvine webdev
vine webdev
 
Vuejs 시작하기
Vuejs 시작하기Vuejs 시작하기
Vuejs 시작하기
 
XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우
XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우
XE 오픈 세미나(2014-06-28) - (2/3) 레이아웃 제작 노하우
 
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
 
Opinion 프로젝트 발표 자료
Opinion 프로젝트 발표 자료Opinion 프로젝트 발표 자료
Opinion 프로젝트 발표 자료
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
How to evaluate accessibility with automatic
How to evaluate accessibility with automaticHow to evaluate accessibility with automatic
How to evaluate accessibility with automatic
 
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기
 
Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storage
 
Django View Part 1
Django View Part 1Django View Part 1
Django View Part 1
 

Similar to Xe3.0 frontend validator

자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)
자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)
자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)DK Lee
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Kim Hunmin
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발지수 윤
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&httpDong Jun Kwon
 
Android Google Cloud Message 설정
Android Google Cloud Message 설정Android Google Cloud Message 설정
Android Google Cloud Message 설정정호 이
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development지수 윤
 
Webframeworks angular js 세미나
Webframeworks angular js 세미나Webframeworks angular js 세미나
Webframeworks angular js 세미나WebFrameworks
 
투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)
투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)
투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)Junbum Lee
 

Similar to Xe3.0 frontend validator (20)

자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)
자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)
자바 웹 개발 시작하기 (7주차 : 국제화, 확인검증, 예외처리)
 
Hacosa j query 11th
Hacosa j query 11thHacosa j query 11th
Hacosa j query 11th
 
Nodejs express
Nodejs expressNodejs express
Nodejs express
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
Xe hack
Xe hackXe hack
Xe hack
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 
Android Google Cloud Message 설정
Android Google Cloud Message 설정Android Google Cloud Message 설정
Android Google Cloud Message 설정
 
Node.js 심화과정
Node.js 심화과정Node.js 심화과정
Node.js 심화과정
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
Webframeworks angular js 세미나
Webframeworks angular js 세미나Webframeworks angular js 세미나
Webframeworks angular js 세미나
 
투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)
투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)
투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)
 

More from 승훈 오

2018 open seminar#1
2018 open seminar#12018 open seminar#1
2018 open seminar#1승훈 오
 
[Xe con2016] 오승훈 xe3로 웹사이트 만들기
[Xe con2016] 오승훈 xe3로 웹사이트 만들기[Xe con2016] 오승훈 xe3로 웹사이트 만들기
[Xe con2016] 오승훈 xe3로 웹사이트 만들기승훈 오
 
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작승훈 오
 
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기승훈 오
 
오픈세미나 플러그인만들기(한번더)
오픈세미나 플러그인만들기(한번더)오픈세미나 플러그인만들기(한번더)
오픈세미나 플러그인만들기(한번더)승훈 오
 
오픈세미나 플러그인만들기
오픈세미나 플러그인만들기오픈세미나 플러그인만들기
오픈세미나 플러그인만들기승훈 오
 
Selenium for-ui-test
Selenium for-ui-testSelenium for-ui-test
Selenium for-ui-test승훈 오
 
Selenium for XE
Selenium for XESelenium for XE
Selenium for XE승훈 오
 

More from 승훈 오 (9)

2018 open seminar#1
2018 open seminar#12018 open seminar#1
2018 open seminar#1
 
[Xe con2016] 오승훈 xe3로 웹사이트 만들기
[Xe con2016] 오승훈 xe3로 웹사이트 만들기[Xe con2016] 오승훈 xe3로 웹사이트 만들기
[Xe con2016] 오승훈 xe3로 웹사이트 만들기
 
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
 
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
 
오픈세미나 플러그인만들기(한번더)
오픈세미나 플러그인만들기(한번더)오픈세미나 플러그인만들기(한번더)
오픈세미나 플러그인만들기(한번더)
 
오픈세미나 플러그인만들기
오픈세미나 플러그인만들기오픈세미나 플러그인만들기
오픈세미나 플러그인만들기
 
Modernizing
ModernizingModernizing
Modernizing
 
Selenium for-ui-test
Selenium for-ui-testSelenium for-ui-test
Selenium for-ui-test
 
Selenium for XE
Selenium for XESelenium for XE
Selenium for XE
 

Xe3.0 frontend validator

  • 1. X p r e s s E n g i n eX E H u b
  • 2. # 오승훈 1. 소개 2. 개요 3. 구조 XE3.0 Frontend Validator
  • 3. XE3.0 을 만들 때 이런 생각을 했습니다. javascript form validation .. 귀찮다!!! Backend 에서 처리하는 Validation 이 있는데 Javascript 에서도 또 만들어야 하나.. Backend 에서 사용한 Validation Rule 을 Frontend 에서 사용할 수 있게 해보자! Frontend Validator
  • 4. Frontend Validation <script type="text/javascript"> var ruleSet = { ruleName: "join", rules: {"email":"required|email","display_name":"required","password":"required|confi rmed|password","agree_termsofservice":"accepted","agree_private_info_colle ct":"accepted"} }; </script>
  • 5. data-rule 하나의 페이지에서 여러개의 validation rule 사용 data-rule 로 사용할 frontend validator 이름 설정 개요 <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type"> data-rule-alert-type 경고 메시지 처리 방법 설정 기본으로 toast, form 두가지 타입 제공 사용자는 별도의 메시지 처리 방식 사용할 수 있음
  • 6. data-rule <script type="text/javascript"> var ruleSet = { ruleName: "join", rules: {"email":"required|email","display_name":"required","password":"required|confi rmed|password","agree_termsofservice":"accepted","agree_private_info_colle ct":"accepted"} }; </script> 하나의 페이지에서 여러개의 validation rule 사용 data-rule 로 사용할 frontend validator 이름 설정 <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type">
  • 7. toast 사용 data-rule-alert-type <form action="action_url" method="post" data-rule="join" data-rule-alert-type="toast"> <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type"> custom alert type 사용
  • 9. 동작 1. XeFrontend::rule() 로 form 에서 사용할 validation rule set 정의 2. form 에 data-rule 로 validation rule set 이름 지정 3. $('body').on('submit', 'form[data-rule]', ...) 으로 form 전송할 때 validation 실행 {{ XeFrontend::rule('join', [ "email" => "required|email" "display_name" => "required" "password" => "required|confirmed|password" "agree_termsofservice" => "accepted" "agree_private_info_collect" => "accepted" ]) }} 사용할 validation 정의 XeFrontend::rule 에서 지정한 첫번째 인자값 사용 data-rule="join" data-rule 지정 form submit 이벤트 발생하면 validation 실행 javascript validator 사용 실패할 경우 griper 로 메시지 출력 form submit
  • 10. <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type"> ... </form> <script> var ruleSet = { ruleName: "join", rules: {"email":"required|email","display_name":"required","password":"required|confirmed|password","agree_termsofservice":"accepted","agre e_private_info_collect":"accepted"} } </script> <script> $(function() { XE.Validator.rules.join.password_confirmation = 'password_confirmation'; }); </script> 사용할 validation 정의 1. validator 가 ruleSet 변수에 할당된 json 데이터를 기반으로 처리 2. ruleSet 변수 할당은 {{ XeFrontend::rule($array) }} 로 처리 3. validator https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/index.js#L508 {{ XeFrontend::rule('join', [ "email" => "required|email" "display_name" => "required" "password" => "required|confirmed|password" "agree_termsofservice" => "accepted" "agree_private_info_collect" => "accepted" ]) }} HTML PHP
  • 11. <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type"> ... </form> <script> var ruleSet = { ruleName: "join", rules: {"email":"required|email","display_name":"required","password":"required|confirmed|password","agree_termsofservice":"accepted","agre e_private_info_collect":"accepted"} } </script> <script> $(function() { XE.Validator.rules.join.password_confirmation = 'password_confirmation'; }); </script> validator evaluator 1. Backend(PHP) 에 구현된 rule 코드를 Frontend validator 에 구현 2. rule 에 대한 처리 코드 https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/index.js#L54 required: function ($dst, parameters) { const value = that.getValue($dst) if (value === '') { let errorMessage = 'validation.required' if ($dst.is('input[type=checkbox]') || $dst.is('input[type=radio]')) { errorMessage = 'validation.required_check' } else if ($dst.is('input[type=select]')) { errorMessage = 'validation.required_select' } that.error($dst, langInstance.trans(errorMessage, { attribute: $dst.data('valid-name') || $dst.attr('name') })) return false } return true }, HTML JAVASCRIPT
  • 12. <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type"> ... </form> <script> var ruleSet = { ruleName: "join", rules: {"email":"required|email","display_name":"required","password":"required|confirmed|password","agree_termsofservice":"accepted","agre e_private_info_collect":"accepted"} } </script> <script> $(function() { XE.Validator.rules.join.password_confirmation = 'password_confirmation'; }); </script> validator custom rule 1. 코어에서 지원하지 않는 password_confirmation 처리 추가 rule 지정, XE.Validator.put() https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/index.js#L736 2. 추가한 rule 을 form 에 연결 join 으로 정의한 validation 에 추가한 password_confirmation 연결 XE.Validator.put('password_confirmation', function ($dst, parameters) { if ($dst.val() == '') { XE.Validator.error($dst, "비밀번호를 한번 더 입력해주세요 ."); return false; } var password = $('[name="password"]').val(); if ($dst.val() != password) { XE.Validator.error($dst, "비밀번호가 일치하지 않습니다."); return false; } return true; }); JAVASCRIPTHTML
  • 13. griper 1. griper 사용자 메시지 출력 toast, form 두가지 방식으로 메시지 처리 2. validator evaluator 가 실패할 경우 메시지 처리 XE.validator.error() 가 griper 사용해서 메시지 처리 https://github.com/xpressengine/xpressengine/blob/master/resources/assets/core/validator/i ndex.js#L786 3. XE.validator.extendAlertType() 으로 메시지 처리 방식 추가 var custom_alert_type = { constructor: this, options: { selectors: {elementGroup: '.form-group', errorText: '.__xe_error_text'}, classes: {message: ['error-text', '__xe_error_text', 'text_caution']}, tags: {message: 'p'} }, getGroup: function ($element) { return $element.closest(this.options.selectors.elementGroup) }, putByElement: function ($element, message) { this.put(this.getGroup($element), message, $element) }, put: function ($group, message, $element) { ... }, clear: function ($form) { $form.find(this.options.tags.message + this.options.selectors.errorText).remove() } }; XE.Validator.extendAlertType('custom_alert_type', function ($element, message) { custom_alert_type.putByElement($element, message); }); JAVASCRIPT
  • 14. 메시지 출력 대상 이름 지정 1. 입력 상자 이름 지정 "이메일" 이름을 지정할 때 대상을 지정할 방법 필요 <form action="action_url" method="post" data-rule="join" data-rule-alert-type="custom_alert_type"> ... <input type="text" name="email" id="email" title="이메일" placeholder="이메일:예)hello@homespace.co.kr" class="inp_apply_common" value="" data-valid-name="이메일"> ... </form> HTML
  • 15. translator 1. XE 는 다국어 지원 메시지 처리할 때 다국어 지원 https://github.com/xpressengine/xpressengine/blob/master/resources/ass ets/core/validator/index.js#L97 2. 메시지 출력할 때 message key 사용 validation.required 와 같이 메시지를 직접 사용하지 않고 message key 로 지정 Backend 에서 정의된 메시지 https://github.com/xpressengine/xpressengine/blob/master/resources/lan g/ko/validation.php https://github.com/xpressengine/xpressengine/blob/master/resources/lan g/common.php required: function ($dst, parameters) { const value = that.getValue($dst) if (value === '') { let errorMessage = 'validation.required' if ($dst.is('input[type=checkbox]') || $dst.is('input[type=radio]')) { errorMessage = 'validation.required_check' } else if ($dst.is('input[type=select]')) { errorMessage = 'validation.required_select' } that.error($dst, langInstance.trans(errorMessage, { attribute: $dst.data('valid-name') || $dst.attr('name') })) return false } return true }, JAVASCRIPT
  • 16. T h a n k y o u X E H U B