2. XML Js Filter

Views 1102 Votes 0 2011.01.17 12:28:50
SMaker *.22.160.18

 XML Js Filter

http://doc.xpressengine.com/classXmlJsFilter.html (클래스 구조)

XML Js Filter는 XML을 기반으로 하여 자바스크립트로 동작하는 Filter입니다.
폼의 입력 항목의 유효성 검사를 쉽게할 수 있고 AJAX를 이용해 서버의 특정 Module과 Action 통신을 하는 과정까지 모두 제어할 수 있습니다.

필수 항목 체크, 최소/최대 길이 제한, 입력값 확인 등의 기능을 지원합니다.

문법 소개 및 예제

아래는 XE내에서 실제로 사용하는 XML Js Filter의 예입니다.

<filter name="insert_board" module="board" act="procBoardAdminInsertBoard" confirm_msg_code="confirm_submit">
<form>
    <node target="mid" required="true" filter="alpha_number"/>
    <node target="browser_title" required="true" maxlength="250" />
    <node target="list_count" required="true" filter="number" />
    <node target="page_count" required="true" filter="number" />
</form>
<parameter>
    <param name="board_name" target="mid" />
    <param name="module_srl" target="module_srl" />
    <param name="module_category_srl" target="module_category_srl" />
    <param name="layout_srl" target="layout_srl" />
    <param name="skin" target="skin" />
    <param name="browser_title" target="browser_title" />
    <param name="use_category" target="use_category" />
    <param name="list_count" target="list_count" />
    <param name="page_count" target="page_count" />
    <param name="is_default" target="is_default" />
    <param name="description" target="description" />
    <param name="header_text" target="header_text" />
    <param name="footer_text" target="footer_text" />
    <param name="admin_id" target="admin_id" />
    <param name="open_rss" target="open_rss" />
</parameter>
<response callback_func="completeInsertBoard">
    <tag name="error" />
    <tag name="message" />
    <tag name="module" />
    <tag name="act" />
    <tag name="page" />
    <tag name="module_srl" />
</filter>
  • <filter>의 attribute
    • name : form에서 필터를 연동하기 위한 이름입니다. (javascript의 function name으로 등록이 됩니다)
    • module : form문내의 데이터를 전송하기 위한 Module 이름입니다.
    • act : 전송대상 module의 특정 Action을 지정합니다.
    • confirm_msg_code : 언어팩의 언어코드를 지정하여 전송 전에 confirm message를 사용할 수 있습니다.
    • extend_filter : field가 유동적일 경우 모듈이름.method이름 을 지정하여 해당 모듈의 model객체의 method의 결과를 이용하여 xml js filter에 지정된 내용외의 항목을 추가할 수 있습니다.
  • <form> filtering이 일어나는 form문내의 특정 field에 조건을 부여할 수 있습니다.
    <form>..</form> 자체를 생략하거나 <form />처럼 명시적으로 체크할 field 가 없으면 지정할 수 있습니다.

    • <form>
          <node target="field이름" required="true|false" filter="alpha_number..." minlength="10" maxlength="250" equalto="다른 field name" />
      </form>
    • target : form - field의 이름
    • required : 필수 여부 (생략 가능)
    • filter : 정규표현식을 통해서 value의 형식 체크 가능 (생략 가능)
    • email : email의 형식 ( aaa.aaa@aaa.com)
      userid : 영문+숫자+_, 첫 글자는 영문, 소문자
      alpha : 영문값만 허용
      number : 숫자만 허용
    • minlength : 최소 길이 체크 (생략 가능)
    • maxlength : 최대 길이 체크 (생략 가능)
    • equalto : 해당 field와 대상의 값이 동일함을 체크
  • <parameter> form문 내에서 특정 field를 다른 이름으로 변경해서 전송할 수 있습니다.
    <parameter>..</parameter> 자체를 생략하거나 <parameter />처럼 명시적으로 지정하지 않음을 알릴 수 있습니다.
    parameter을 이용시 지정된 field이외의 field는 모두 무시가 되니 주의 바랍니다.
  1. <parameter>
        <param name="field이름" target="변경하고자 하는 이름" />
    </parameter>
  • name : form - field의 이름
  • target : 서버에 전송할때 바꾸고자 하는 이름

 

  • <response> 서버의 특정 모듈과 통신을 한 후에 어떤 변수를 return 받을 것이며 javascript callback function을 어떤것을 이용할 것인지 지정할 수 있습니다.
    지정하지 않을 경우 return message가 success가 아닌 경우 message를 alert하고 현 페이지를 reload하게 됩니다.
  1. <response callback_func="J/S Callback Function">
        <tag name="error" />
    </response>

내부 동작 방식

XML JS Filter는 템플릿 코드내에서 요청이 이루어집니다.

<!--%import("filter/test.xml")-->

TemplateHandler는 import되는 XML Js Filter를 보고 컴파일된 JS 파일을 찾아서 <head>..</head>사이에 script file 추가를 하게 됩니다.
이 때 언어팩과의 연동을 시도하게 되며 컴파일된 Js 파일에 JavaScript 변수로 직접 메세지를 기록합니다.

컴파일 된 자바스크립트 파일의 위치 : ./files/cache/js_filter_compiled/{md5(path.filtername)}.언어코드.compiled.js

템플릿에서의 실제 사용 예

<!--%import("filter/test.xml")-->
<form action="./" method="get" onsubmit="procFilter(this, test)">
    제목 : <input type="text" name="title" value="" class="inputTypeText w200" />
    내용 : <textarea name="content" class="inputTypeTextArea w200"></textarea>
    <span class="button"><input type="submit" value="전송" /></span>
</form>

위에서 procFilter()는 첫번째 인자로 해당 폼의 object를 받는데 this로 지정하면 되고, 2번째 인자인 test는 적용하고자 하는 filter의 name 입니다.
폼의 내용이 전송 될 때 test filter는 동작을 하게 됩니다.

위 예제에서는 아래의 filter가 적용되어 있습니다.

  • 제목 (필수 항목, 최소 길이 10자, 최대 길이 50자)
  • 내용 (필수 항목, 최소 길이 1자, 최대 길이 250자)

아래는 test.xml 파일의 내용입니다.

<filter name="test">
    <form>
        <node target="title" required="true" maxlength="10" maxlength="50" />
        <node target="content" required="true" maxlength="1" maxlength="250" />
    </form>
    <parameter>
        <param name="title" target="title" />
        <param name="content" target="content" />
    </parameter>
    <response />
</filter>

뚱님*^^*

2009.09.15 18:04:15
*.94.41.89

동작 설명이 중급이상의 사용자나 알아들을 수 있겠네요.
좀 더 자세하게 그리고 친절하게 초급자도 어려움없이 이해할 수 있게 작성되면 좋겠습니다.

와우팝

2010.04.30 18:16:12
*.55.142.176

중급이 아니라 고급도 몰라요.

이거 맨근 사람을 알란가..

 

2+3 을..복잡한 파동방정식으로..

맹글어서..

아주..권위적으로..

설명할려고 노력하는 거 같음...

 

다른 사람을 그냥 통박 굴릴 수 밖에..ㅋㅋㅋ

st.june

2011.01.16 22:00:15
*.39.176.17

절대 동감입니다.


zb4 사용자가 zbxe로 옮겨오지 않는 대표적인 이유가 이런데 있는 게 아닐까 싶네요.

저만해도 정식으로 html 배워본 적이 없는데 zb4로는 웹게임까지 만들 수 있었던 데에 반해

zbxe는.. 솔직히 말해서 게임은커녕 회원 연동하는 메모장조차 못 만들겠습니다 ㅡ;


무작정 보안에 문제 있다며 zb4는 서서히 축소시켜 나가며 목졸라 죽인다(고 느낍니다)기보다는

zbxe가 사용자뿐만 아니라 개발자에게도 어느 정도 접근성을 허락했으면 좋겠습니다....

당장 자료실도 추후 업데이트에 대비할 수 있는 자기들의 문법을 지키지 않는 것은 심사에서 떨어뜨리는 등

그 문제 때문에 zb4가 위기를 맞았다고 하지만 저같은 아마추어(또는 짜깁기) 코더들은 xe에서 더 소외되네요.

난다날아

2011.01.16 22:44:00
*.143.74.212

<p>프로젝트 소식을 돌아보다 몇마디 적어 봅니다. 개발자에게 어느 정도 접근성을 허락했으면 좋겠다고 하셨는데요. 그리고 위에 분은 고급이라도 못 알아 들을 거라고 하셨는데요. 컴퓨터공학이나 컴퓨터과학 과정을 정상적으로 받은 분들이면 충분히 이해하고 XE를 이용하여 개발할 수 있다고 생각합니다. 전 처음 XE 소스 보고 정말 감탄하고 감명 받았습니다. 아! 이렇게 할 수도 있구나. 이론으로 배운 객체지향 프로그래밍에 대한 실 예를 볼 수 있어서 좋았습니다. 아무튼. 요지는 기본이 있는 분들은 많은 어려움 없이 XE 개발을 할 수 있을 겁니다. 기본기를 익히세요.


</p>

AndroidSea

2010.07.14 11:44:25
*.142.65.139

1. html form의 origin 항목을 a로 바꾸고자 할때 아래와 같이 사용하는 방법이 맞군요.

설명을 보면 오히려 반대로 되어있는 듯한데.. (설명 : <node target="field이름"> <param name="field이름" target="변경하고자 하는 이름" /> )

<form>
    <node target="a" required="true" />
</form> 
<parameter>
    <param name="origin" target="a" />  
</parameter>

 2. Xml JS Filter의 parameter와 xml query의 복합 사용시에위 상황에서        

<!-- testQuery.xml --> 
<column name="db_column" var="a" />

이렇게 쿼리를 주면 값 전달이 안되는군요? 위 설명에선 서버에 전송시에 "target" 값으로 한다고 했는데..

이럴 때는 parameter 값을 그냥 나두고  ( <node target="origin" required="true" /> )

컬럼 var 을 바꾸어 주어야 되는군요 (    <column name="db_column" var="a" /> )

 

위 두가지 사항이 설명이 틀린 것인지 실제 core구현이 잘못되어 있는 것인지,

아니면 제가 잘못 이해한 것인지;;

test 후에 사용하는데에는 문제가 없습니다만,

문서와 같이 보니 이상하군요

SMaker

2011.01.17 12:28:50
*.22.160.57

XmlJsFilter와 XmlQuery는 별개입니다.


별도로 XmlQuery로 넘겨주셔야 합니다.