모듈
XE는 다양한 추가 기능을 사용해서 업그레이드할 수 있는 CMS(Contents Management System)입니다. 추가 기능 중 가장 중요한 것이 모듈입니다. 모듈은 플랫폼에 새로운 기능을 추가하는 파일 모음입니다.
모듈을 생성하려면 다음의 세 가지 규칙을 따라야 합니다.
- 모듈은 modules 폴더 아래의 폴더에 저장해야 합니다. 폴더 이름은 모듈 이름과 같게 지정합니다. 생성한 모듈을 배포하려면 다른 개발자가 만든 모듈과 이름이 충돌하지 않게 독창적으로 모듈 이름을 정합니다.
- info.xml 파일에 모듈 제작자와 모듈 설명, 버전, 제작일과 같은 일반적인 정보를 작성합니다.
- module.xml 파일에 설정 파라미터와 액션 정의 등을 저장합니다.
info.xml은 다음과 같은 형태로 되어 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<module version="0.2">
<title xml:lang="en">Module name</title>
<description xml:lang="en">Module description </description>
<version>1</version>
<date>2011-05-01</date>
<category>service</category>
<author email_address="author@authorland.com" link="http://www.authoria.com/">
<name xml:lang="en">Author name</name>
</author>
</module>
<category> 요소는 관리자 메뉴에서 모듈 분류를 나타냅니다. 입력할 수 있는 옵션은 다음과 같습니다.
- service: 서비스 관리
- member: 회원 관리
- content: 정보 관리
- construction: 사이트 설정
- utility: 기능 설정
- accessory: 부가 기능 설정
- system: 시스템 관리/설정
- package: cafeXE, textyle 등의 패키지 모듈
XE에서 모든 입출력은 index.php를 통해 처리됩니다. 액션 요청 인수는 Module Handler에서 결정하며, 보통 $act 변수를 사용합니다. 모듈의 액션은 conf/module.xml 파일에 선언됩니다.
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants>
<grant name="post" default="guest">
<title xml:lang="en">Post</title>
</grants>
<permissions>
<permission action="dispForumAdminInsertForum" target="manager" />
<permission action="dispForumAdminForumInfo" target="manager" />
<permission action="procForumAdminInsertForum" target="manager" />
<permission action="procForumAdminInsertListConfig" target="manager" />
</permissions>
<actions>
<action name="dispForumIndex" type="view" />
<action name="dispForumContent" type="view" index="true"/>
<action name="dispForumNoticeList" type="view" />
<action name="dispForumContentList" type="view" />
<action name="dispForumContentView" type="view" />
<action name="dispForumCatogoryList" type="view" />
<action name="dispForumContentCommentList" type="view" />
<action name="dispForumContentFileList" type="view" />
<action name="procForumInsertDocument" type="controller" />
<action name="procForumDeleteDocument" type="controller" />
<action name="dispForumAdminContent" type="view" standalone="true" admin_index="true" menu_name="forum" menu_index="true" />
<action name="dispForumAdminForumInfo" type="view" standalone="true" menu_name="forum" />
<action name="dispForumAdminExtraVars" type="view" standalone="true" menu_name="forum" />
<action name="dispForumAdminForumAdditionSetup" type="view" standalone="true" menu_name="forum" />
<action name="procForumAdminDeleteForum" type="controller" standalone="true" menu_name="forum" ruleset="deleteForum" />
<action name="procForumAdminInsertListConfig" type="controller" standalone="true" menu_name="forum" ruleset="insertListConfig" />
<action name="dispForumCategory" type="mobile" />
<action name="getForumCommentPage" type="mobile" />
</actions>
<menus>
<menu name="forum">
<title xml:lang="en">Forum</title>
<title xml:lang="ko">포럼</title>
</menu>
</menus>
</module>
<action>
conf/module.xml에서 사용되는 속성은 다음과 같습니다.
|
속성 |
설명 |
|---|---|
|
name |
모듈 이름도 포함하는 액션 이름. 관리자 권한이 필요한 액션의 이름에는 "Admin"을 포함합니다. |
|
type |
액션이 어떤 타입이며 어떤 파일(뷰, 모델, 컨트롤러)에 저장돼야 하는지 정의. 이름에 "Admin"이 포함되어 있으면 관리자 뷰, 모델 또는 컨트롤러 PHP 파일에 있어야 합니다. |
|
standalone |
이 속성이 "true"로 설정되면 현재 액션은 나머지 모듈에 독립적입니다. 이 속성이 "false"로 설정되면 요청이 수신되지 않고 모듈이 실행될 때 에러를 출력합니다. 현재는 사용되지 않는 속성으로 deprecated 예정입니다. |
|
index |
모듈의 기본 액션 설정. 한 액션에만 적용되어야 합니다. |
|
admin_index |
모듈 백 엔드의 기본 액션. 한 액션에만 적용됩니다. |
|
setup_index |
모듈 설정 페이지로 사용되며, 관리자 액션에만 설정할 수 있습니다. |
|
menu_name |
해당 액션이 속한 메뉴의 이름 |
|
menu_index |
이 속성이 ""true""로 설정되면 이 액션이 현재 메뉴의 초기 액션이라는 의미입니다. |
|
ruleset |
해당 액션에 적용할 룰셋 이름 |
|
action |
권한(permission)이 선언된 액션의 이름 |
|
target |
지원되는 권한은 다음과 같습니다.
|
일반적으로 액션은 XE 모듈에 속합니다. 하지만 하나의 액션이 여러 모듈에서 사용되는 경우도 있습니다. 이를 Action Forward라고 부릅니다.
가장 전형적인 예는 RSS 모듈입니다. RSS 액션은 게시판 모듈에서 정의한 액션이 아니지만 Action Forward 기능에서 호출하고 실행합니다.
?mid=board&act=rss
Action Forward를 사용해서 독립된 기능과 함께 모듈을 처리할 수 있습니다.
위의 요청에서 XE는 "board"라는 mid를 찾습니다. 이 mid가 rss 액션을 포함하지 않으면 XE는 DB에서 Action Forward 테이블을 통해 등록된 rss를 찾습니다. rss 액션은 rss 모듈의 뷰 타입으로 DB에 등록되어 있으므로 XE는 게시판을 위한 모든 mid 정보를 설정하고 rss 모듈의 뷰 객체를 생성해서 rss 메서드를 실행합니다.
이 Action Forward는 XE가 레이아웃이나 현재 요청된 모듈의 정보를 유지하면서 다른 메서드를 필요로 할 때 필요합니다. 다른 예제로는 친구 목록을 보기 위한 Communication 모듈의 dispCommunicationFriend 액션이 있습니다. 이 액션은 현재 모듈의 레이아웃을 유지하면서 해당 콘텐츠를 친구 목록으로 교체합니다.
즉, 콘텐츠 영역 출력은 지정된 액션에 의해 변경될 수 있으며, 요청된 모듈의 정보에 따라 다른 결과가 나올 수 있습니다.
- Action Forward 등록
일반적으로 Action Forward는 module.class.php에서 moduleInstall()를 처리할 때 저장됩니다. 등록 방법은 다음과 같습니다.
$oModuleController = &getController('module');
$oModuleController->insertActionForward('module', 'type(Ex:controller)', 'action_name');
- Action Forward 검증
다음과 같이 Action Forward의 등록을 확인할 수 있습니다. 보통 module.class.php의 checkUpdate() 메서드에서 사용됩니다.
$oModuleModel = &getModel('module');
if(!$oModuleModel->getActionForward('action_name')) ...
- Action Forward 삭제
Action Forward가 필요 없어지면 다음과 같이 삭제합니다.
$oModuleModel = &getModel('module');
$oModuleModel = &getController('module');
if($oModuleModel->getActionForward('Action Name'))
$oModuleController->deleteActionForward('Module Name','Type','Action Name');
액션 이름이 (disp|proc|get)+ModuleName+ActionName으로 되어 있다면 Action Forward를 등록하지 않아도 됩니다.
어떤 모듈이 다른 모듈의 특정 액션에 어떤 동작을 하고 싶을 때 트리거를 사용합니다. 단, 해당 모듈에서 트리거를 제공해야 합니다. 예를 들면, document 모듈의 triggerDisplayDocumentAdditionSetup에 이미 있는 관리자용 뷰를 포럼 모듈에서 사용하고 싶은 경우가 있는데 이때 트리거를 사용합니다.
트리거를 사용하는 방법은 다음과 같습니다.
- DB에 트리거 삽입
$oModuleController->insertTrigger('forum.dispForumCommentSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before');
- 트리거 가져오기
if(!$oModuleModel->getTrigger('forum.dispForumAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) return true;
- 트리거 호출
ModuleHandler:: triggerCall ('Trigger Name', 'call time (Called Position)', the trigger will be used as a parameter of the object);
- 트리거 삭제
$ OModuleController-> deleteTrigger ('Trigger Name', 'module name', 'call the method belongs to the type of instance', 'call the method (Called Method)' + ',' call time (Called Position) ');
룰셋은 HTML 폼의 정보를 PHP에 있는 처리 메서드로 전달할 때 클라이언트 측에서는 물론 서버 측에서도 정보의 유효성을 검증하기 위하여 사용합니다. 룰셋은 각 모듈 폴더의 ruleset 폴더에 있는 XML 파일에 저장됩니다. 다음은 룰셋의 예제입니다.
<?xml version="1.0" encoding="utf-8"?>
<ruleset version="1.5.0">
<customrules>
</customrules>
<fields>
<field name="user_id" required="true" length="3:20" />
<field name="user_name" required="true" length="2:40" />
<field name="nick_name" required="true" length="2:40" />
<field name="email_address" required="true" length="1:200" rule="email" />
</fields>
</ruleset>
룰셋에서 사용되는 요소와 속성은 다음과 같습니다.
|
요소 |
속성 |
설명 |
||
|---|---|---|---|---|
|
customrules |
사용자 정의 규칙을 정의할 수 있습니다. |
|||
|
rule |
사용자 정의 규칙 |
|||
|
name |
사용자 정의 규칙의 이름 |
|||
|
type |
사용자 정의 규칙의 유형. "regex", "enum", "expression" 중 하나를 사용할 수 있습니다.
|
|||
|
test |
사용자 정의 규칙의 테스트 코드 |
|||
|
fields |
유효성을 검사할 필드의 모임 |
|||
|
field |
유효성을 검사할 필드 |
|||
|
name |
폼 요소 이름 |
|||
|
rule |
적용할 규칙 |
|||
|
required="true" |
반드시 입력해야 합니다. |
|||
|
length |
길이 제한. "최소:최대"와 같이 작성할 수 있습니다. |
|||
|
default |
기본값. |
|||
|
equalto |
equalto에 넣은 요소의 값이 현재 요소의 값과 같아야 함을 나타냅니다(비밀번호, 비밀번호 확인 등). |
|||
|
modifier |
규칙을 사용하기 전에 입력값을 변경하거나 검사를 마친 후 결과를 변경할 수 있는 기능. |
|||
필터는 HTML 폼에서 PHP에 있는 처리 메서드로 정보를 전달하고 자바스크립트 콜백 함수를 지정하기 위해 사용합니다. 필터는 tpl/filter 폴더 내에 있는 XML 파일에 저장됩니다. 다음은 폼 필터의 예제입니다. XE 1.5 버전부터는 폼 필터보다 룰셋을 사용하기를 권장합니다.
<filter name="insert_contest" module="contest" act="procContestAdminInsertContest" confirm_msg_code="confirm_submit">
<form>
<node target="mid" required="true" maxlength="40" filter="alpha_number" />
<node target="browser_title" required="true" maxlength="250" />
</form>
<parameter>
<param name="contest_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="header_text" target="header_text" />
<param name="footer_text" target="footer_text" />
</parameter>
<response callback_func="completeInsertContest">
<tag name="error" />
<tag name="message" />
<tag name="module" />
<tag name="act" />
<tag name="page" />
<tag name="module_srl" />
</response>
</filter>
폼 필터에서 사용되는 요소와 속성은 다음과 같습니다.
|
요소 |
속성 |
설명 |
||
|---|---|---|---|---|
|
form |
입력값이 유효한지 확인하는 최상위 요소 |
|||
|
node |
HTML 폼 확인 |
|||
|
required |
입력 요소가 반드시 필요한 값인지 설정. required속성값이 true로 설정된 경우, 해당 요소에 값이 입력되지 않으면 alert가 발생합니다. |
|||
|
filter = "filter type" |
필터에 사용할 수 있는 타입은 email(email_address), userid(user_id), url(homepage), korean, korean_number, alpha, number, alpha_number입니다. |
|||
|
equalto = "target person" |
equalto에 넣은 요소의 값이 현재 요소의 값과 같아야 함을 나타냅니다(비밀번호, 비밀번호 확인 등). |
|||
|
maxlength |
최대 길이 |
|||
|
minlength |
최소 길이 |
|||
|
parameter |
서버로 전송할 때 폼 요소의 이름을 변경하거나, 폼 요소 중 개발자가 parameter에 작성한 값만을 서버에 전송하고자 할 때 사용. 기본적으로 parameter를 사용하지 않으면 모든 폼 요소를 서버에 전송합니다. |
|||
|
param |
재정의하거나 서버에 전송할 폼 요소 정보 작성 |
|||
|
name |
폼 요소 이름 |
|||
|
target |
재정의할 요소 이름 |
|||
|
response |
||||
|
callback_func |
자바스크립트 콜백 함수. 실제 구현되어야 합니다. |
|||
|
tag |
콜백 함수로 전달될 변수 정의 |
|||
|
name |
콜백 함수에 전달할 변수 이름. 이 변수들은 controller에서 액션을 실행한 후 콜백 함수에 전달할 값들을 $this->add('변수명', '값')으로 구현합니다. |
|||
XE는 커스텀 쿼리 언어를 사용해서 쿼리를 정의합니다. XML 코드는 ./classes/xml 폴더에 있는 XmlQueryParser.class.php에서 파싱합니다. 사용 예는 다음과 같습니다.
<query id="getCounterStatus" action="select">
<tables>
<table name="counter_status" />
</tables>
<columns>
<column name="sum(unique_visitor)" alias="unique_visitor" />
<column name="sum(pageview)" alias="pageview" />
</columns>
<conditions>
<condition operation="more" column="regdate" var="start_date" notnull="notnull"pipe="and" />
<condition operation="less" column="regdate" var="end_date" notnull="notnull"pipe="and" />
</conditions>
</query>