Form input values can be validated by two ways. Filter, the traditional verifying method, only worked on the client-side. But Ruleset, which will be adopted from the XE version 1.5, can verify the data on both client-side and server-side.
This article contains information on how to use rulesets only. If you want the information about Filter, visit XML Js Filter.
You can take following advantages using rulesets.
또한, 필터는 현재 폐지 예정으로 표시된 기술이므로 가급적 사용을 자제해주시길 바랍니다.
페이지를 처음 로드할 때 XE는 설정된 룰셋 파일을 읽어들여 룰셋을 자바스크립트 파일로 변경합니다. 웹 페이지 사용자가 폼 입력을 올바르게 마친 후 데이터를 서버로 전송하면 서버측에서도 룰셋 파일을 읽어 PHP 코드로 변환하고 이를 사용해 데이터를 다시 한번 검증합니다.

Notice that server-side validation will be executed before the data is transfered 서버측 데이터 검증 과정은 데이터가 모듈로 전달되기 전에 이루어지므로 이 점 유의하시기 바랍니다.
룰셋 파일은 모듈 바로 아래에 ruleset이라는 디렉토리를 만들어 추가할 수 있습니다. 예를 들어, 페이지(page) 모듈에 사용할 룰셋은 ./modules/page/ruleset에 저장합니다.
룰셋 파일은 모듈 정보 파일 module.xml과 템플릿(또는 스킨) 파일에서 설정해주어야 합니다. 이해를 돕기 위해 로그인 과정을 예로 들어보겠습니다. 로그인 과정은 member 모듈의 컨트롤러 메소드인 procMemberLogin()에서 처리합니다.
모듈 정보가 있는 파일을 열어 실행 전에 데이터를 검증할 메소드를 찾습니다. 예시에서는 procMemberLogin() 실행에 앞서 데이터의 유효성을 검사할 것이므로 다음과 같이 작성합니다.
<?xml version="1.0" encoding="utf=8"?>
<module>
<grants />
<permissions />
<actions>
...
<action name="procMemberLogin" type="controller" ruleset="login" standalone="true" />
...
</actions>
</module>
다시 말해, <action /> 태그에 rulest="login"과 같이 속성을 설정하면 procMemberLogin() 메서드를 실행하기 전에 login이라는 이름의 룰셋을 실행하여 입력값의 유효성을 확인한다는 뜻입니다.
폼을 전송하기 직전에 데이터를 검증할 룰셋을 정합니다. 예를 들어, 로그인 폼을 다음과 같이 작성했다고 가정해보겠습니다.
<form method="post">
아이디 : <input type="text" name="user_id" />
패스워드 : <input type="password" name="password" />
</form>
이 폼에 룰셋을 적용하려면 다음과 같이 작성합니다.
<form ruleset="login" method="post">
아이디 : <input type="text" name="user_id" />
패스워드 : <input type="password" name="password" />
</form>
룰셋 파일은 XML 형식으로 작성되고, 모듈 디렉토리 바로 아래에 ruleset이라는 디렉토리를 만든 후 그 안에 저장합니다. 예를 들어 member모듈에서 사용되는 login 룰셋 파일의 경로는 ./modules/member/ruleset/login.xml입니다.
파일의 기본 구조는 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<ruleset version="1.5.0">
<customrules>
... 사용자 정의 규칙 정의 ...
</customrules>
<fields>
... 폼에 적용할 규칙 정의 ...
</fields>
</ruleset>
예를 들어, user_id라는 필드에 "영문자만 허용"이라는 규칙을 적용하고 싶다면 다음과 같이 룰셋을 작성할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<ruleset version="1.5.0">
<fields>
<field name="user_id" rule="alpha" />
</fields>
</ruleset>
name 속성에는 입력 필드의 이름을, rule 속성에는 적용할 규칙의 이름을 입력합니다. alpha는 "영문자만" 허용하는 미리 정의된 규칙입니다.
규칙은 필드의 유효성을 검사할 때 사용합니다. 프로그램에서 미리 정의된 규칙을 사용할 수도 있고, 필요에 따라 직접 작성할 수도 있습니다.
몇 가지 자주 사용하는 규칙은 유효성 검사 프로그램 안에 미리 정의되어 있으므로 따로 작성할 필요가 없습니다.
미리 정의된 규칙은 다음과 같습니다.
규칙 이름
의미
정규 표현식
email
메일 주소
/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/
userid
사용자 아이디
/^[a-z]+[\w-]*[a-z0-9_]+$/i
url
URL
/^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-]+)+(:[0-9]+)/
alpha
영문자
/^[a-z]*$/i
alpha_number
영문자 및 숫자, 언더스코어
/^[a-z][a-z0-9_]*$/i
number
정수 숫자
/^[1-9][0-9]*$/
미리 정의된 규칙이 아닌 다른 규칙을 사용하고 싶다면 직접 규칙을 정의할 수 있습니다. 사용자 정의 규칙은 <customrules> 요소 안에 기술합니다. 이 요소는 생략할 수 있습니다.
...
<customrules>
<rule name="규칙이름" type="유형" test="테스트 코드" />
</customrules>
...
규칙 유형은 regex, enum, expression 중 하나를 사용할 수 있습니다. regex는 정규표현식을 작성할 때, enum은 주어진 값 중 하나만 선택할 수 있을 때, expression은 수식이 필요할 때 사용합니다.
정규표현식으로 규칙을 작성합니다. type 속성의 값을 regex로 설정하고, test 속성에 적용할 정규표현식을 입력하면 됩니다. 예를 들어, 알파벳, 숫자, 밑줄을 허용하는 규칙을 작성하려면 다음과 같이 작성할 수 있습니다.
...
<rule name="alpha_num" type="regex" test="/^\w+$/" />
...
주어진 목록에서 하나의 값만 선택할 수 있도록 합니다. type 속성의 값을 enum으로 설정하고 test 속성에 목록을 나열합니다. delim 속성을 사용해 각 항목을 구분할 구분자를 설정할 수 있는데, 기본값은 쉼표(,)입니다.
예를 들어, 사용자가 apple, orange, banana 중 하나만 선택하게 하려면 다음과 같이 규칙을 작성합니다.
...
<rule name="fruit" type="enum" test="apple,orange,banana" />
...
위 규칙의 구분자를 @로 사용하고 싶다면 다음과 같이 바꾸면 됩니다.
...
<rule name="fruit" type="enum" test="apple@orange@banana" delim="@" />
...
산술 연산 비교를 할 수 있습니다. 예를 들어 어떤 값이 10보다 작은지 확인하려면 다음과 같이 작성합니다. 단, <, >, & 문자는 XML에서 특수한 의미를 지니므로 각각 <, >, & 와 같이 XML 엔티티로 변환해야 합니다.
...
<rule name="less_than_10" type="expr" test="$$ < 10" />
...
이 코드에서 $$은 규칙을 적용한 필드의 값을 뜻합니다.
AND 또는 OR 연산자를 사용해 여러 개의 수식을 한번에 작성할 수도 있습니다.
...
<rule name="2_to_9" type="expr" test="$$ < 10 && $$ > 1" />
...
<field> 요소는 유효성을 검사할 필드를 설정할 때 사용하며, <fields> 요소 안에 기술합니다. 예를 들어 userid 필드의 값을 반드시 입력해야하고 사용자 아이디 규칙을 통과하도록 만들려면 다음과 같이 작성합니다.
<?xml version="1.0" encoding="utf-9"?>
<ruleset version="1.5.0">
<fields>
<field name="userid" rule="userid" required="true" />
</fields>
</ruleset>
<field> 요소에 사용하는 속성에 따라 다양한 검사가 가능합니다.
검사할 필드의 이름은 name 속성을 사용해 설정합니다. 예를 들어 userid 필드의 값을 검사하는 규칙은 다음과 같이 작성합니다.
...
<field name="userid" rule="적용할_규칙" />
...
특정 단어로 시작하는 모든 필드를 검사하고 싶다면 시작 단어 앞에 ^를 덧붙여 name 속성에 사용하면 됩니다. 예를 들어 "key"로 시작하는 필드에 같은 규칙을 적용하고 싶다면 field 노드를 다음과 같이 작성합니다.
...
<field name="^key" rule="적용할_규칙" />
...
위 규칙은 key1, key2, key3등의 필드에는 규칙을 적용하지만 1key, akey 등의 필드에는 규칙을 적용하지 않습니다.
rule 속성을 통해 적용할 규칙 이름을 설정합니다. 예를 들어, userid 필드에 알파벳만 허용하는 alpha 규칙을 적용하려면 다음과 같이 작성합니다.
...
<field name="userid" rule="alpha" />
...
복수 개의 규칙을 적용하려면 규칙 이름을 쉼표로 구분하여 표시해주면 됩니다. 예를 들어, number와 less_than_10 규칙을 적용하려면 다음과 같이 작성합니다.
...
<field name="num_value" rule="number,less_than_10" />
...
반드시 입력해야 하는 값은 required 속성을 사용하여 설정합니다. 이 속성이 설정된 필드는 반드시 값을 입력해야 하며 그렇지 않으면 에러가 발생합니다. 예를 들어, userid 필드의 값을 반드시 입력하도록 만들려면 다음과 같이 작성합니다.
...
<field name="userid" required="true" />
...
<field> 요소의 length 속성을 사용하면 입력된 문자의 길이를 정의할 수 있습니다. 문자열의 길이는 최소:최대와 같이 작성할 수 있는데, 최소 길이 제한을 없애고 싶다면 :최대로, 최대 길이 제한을 없애고 싶다면 최소:와 같이 작성할 수 있습니다. 예를 들어, 3글자 이상 6글자 이하로 글자수를 제한하고 싶다면 다음과 같이 <field> 요소를 작성할 수 있습니다.
...
<field name="userid" length="3:6" />
...
주의할 점은 여기서 말하는 문자열의 길이는 바이트(byte) 단위가 아닌 문자 단위라는 것입니다. 따라서, 한글 1글자와 알파벳 1글자는 길이가 같습니다. 길이를 바이트 단위로 체크하고 싶다면 길이 뒤에 문자b를 추가하면 됩니다. 예를 들어, 8바이트 이상 20바이트 이하로 값을 입력받고 싶다면 다음과 같이 작성합니다.
...
<field name="userid" length="3b:6b" />
...
필수 요소가 아닌 필드의 경우, 값을 입력하지 않으면 자동으로 기본값으로 설정해줍니다. 기본값은 default 속성을 사용해 설정할 수 있습니다. 예를 들어, count 필드의 기본값을 10으로 정하고 싶다면 다음과 같이 작성합니다.
...
<field name="count" default="10" />
...
어떤 필드의 값이 다른 필드의 값과 동일해야 할 때 사용합니다. equalto 속성을 사용해 현재의 필드와 값을 비교할 필드의 이름을 설정하면 됩니다.
...
<field name="password2" equalto="password1" />
...
검사를 시작하거나 마친 후 검사 결과 또는 입력값을 변경할 수 있는 기능입니다. For example, you can make a rule that allow only not numbers with the number rule and the not modifier.
...
<field name="word" rule="number" modifier="not" />
...
현재 지원하는 수정자는 not 밖에 없으며, 의미는 다음과 같습니다.
if 요소는 특정 조건에 따라 값을 변경할 때 사용하며 기본 구조는 다음과 같습니다.
...
<field name="필드이름" ... />
<if test="표현식" attr="속성이름" value="변경할_속성값" />
</field>
</mods>
...
표현식에서 사용하는 필드의 이름은 반드시 $ 기호를 앞에 붙여야 합니다. 예를 들어, use_openid 필드의 값이 on일 때 user_openid의 값을 필수 요소로 바꾸고 싶다면 다음과 같이 작성합니다.
...
<field name="user_openid" rule="userid">
<if test="$use_openid == 'on'" attr="required" value="true" />
</field>
...
View and moderate all "wiki Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Wiki"
Originally posted by: florin...@gmail.com
an english version would be nice