/**
* @brief 견적서 작성 화면 출력
**/
function dispFormContentWrite() {
$oDocumentModel = &getModel('document');
// GET parameter에서 document_srl을 가져옴
$document_srl = Context::get('document_srl');
$oDocument = $oDocumentModel->getDocument(0);
$oDocument->add('module_srl', $this->module_srl);
Context::set('oDocument', $oDocument);
// 확장변수처리를 위해 xml_js_filter를 직접 header에 적용
$oDocumentController = &getController('document');
$oDocumentController->addXmlJsFilter($this->module_info->module_srl);
// 사용되는 javascript 필터 추가
Context::addJsFilter($this->module_path.'tpl/filter', 'insert_content.xml');
$this->setTemplateFile('write');
}
3 <form action="./" method="post" onsubmit="return procFilter(this, insert_content)" id="fo_write" class="formWrite">
XE에서는 form을 전송할 때 직접 post/get으로 submit 하지 않고 procFilter()를 통해 Ajax로 call 한 뒤 response를 받아 작성한 "tpl/filter/insert_content.xml" 의 callback을 통해 실행됩니다.
1 <!--%import("css/form.css")-->
2
3 <form action="./" method="post" onsubmit="return procFilter(this, insert_content)" id="fo_write" class="formWrite">
4 <input type="hidden" name="mid" value="{$mid}" />
5 <input type="hidden" name="document_srl" value="{$document_srl}" />
6 <input type="hidden" name="content" value="{$oDocument->getContentText()}" />
7
8 <div class="formWriteHeader">
9 <dl class="title">
10 <dt><label class="title">{$lang->title} :</label></dt>
11 <dd>
12 <input type="text" name="title" class="inputText" value="{htmlspecialchars($oDocument->getTitleText())}" />
13 </dd>
14 </dl>
15 </div>
16
17 <!--@if(!$is_logged)-->
18 <div class="userNameAndPw">
19 <dl>
20 <dt><label for="userName">{$lang->writer}</label> :</dt>
21 <dd class="userName"><input type="text" name="nick_name" value="{$oDocument->getNickName()}" class="inputText" id="userName" title="{$lang->is_required}" /></dd>
22 </dl>
23 <dl>
24 <dt><label for="userPw">{$lang->password}</label> :</dt>
25 <dd class="userPw"><input type="password" name="password" value="" id="userPw" class="inputText" title="{$lang->is_required}" /></dd>
26 </dl>
27 <dl>
28 <dt><label for="emailAddress">{$lang->email_address}</label> :</dt>
29 <dd class="emailAddress"><input type="text" name="email_address" value="{htmlspecialchars($oDocument->get('email_address'))}" id="emailAddress" class="inputText" /></dd>
30 </dl>
31 <dl>
32 <dt><label for="homePage">{$lang->homepage}</label> :</dt>
33 <dd class="homePage"><input type="text" name="homepage" value="{htmlspecialchars($oDocument->get('homepage'))}" id="homePage" class="inputText" /></dd>
34 </dl>
35 </div>
36 <!--@end-->
37
38 <!--@if(count($extra_keys))-->
39 <table border="1" cellspacing="0" summary="Extra Form" class="extraVarsList">
40 <caption><em>*</em> : {$lang->is_required}</caption>
41 <!--@foreach($extra_keys as $key => $val)-->
42 <tr>
43 <th scope="row">{$val->name} <!--@if($val->is_required=='Y')--><em>*</em><!--@end--></th>
44 <td>{$val->getFormHTML()}</td>
45 </tr>
46 <!--@endforeach-->
47 </table>
48 <!--@endif-->
49
50 <div class="editor">{$oDocument->getEditor()}</div>
51 <div class="formNavigation">
52 <span class="button red strong"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span>
53 </div>
54
55 </form>
견적서 등록 action인 procFormContentWrite 및 form 모듈이라고 설정하고 필수 항목들과 범위를 지정 하였습니다. javascript callback함수를 completeDocumentInserted로 tag는 error,message,mid,document_srl 를 지정하였습니다.
* 지정한 tag는 controller에서 자신 객체인 $this에 add()를 해야 합니다.
1 <filter name="insert_content" module="form" act="procFormContentWrite">
2 <form>
3 <node target="nick_name" required="true" maxlength="20"/>
4 <node target="password" required="true" />
5 <node target="email_address" maxlength="250" />
6 <node target="homepage" maxlength="250"/>
7 <node target="content" required="true" />
8 </form>
9 <response callback_func="completeDocumentInserted">
10 <tag name="error" />
11 <tag name="message" />
12 <tag name="mid" />
13 <tag name="document_srl" />
14 </response>
15 </filter>
"insert_content" filter에서 지정한 callback function인 completeDocumentInserted를 구현합니다.
ajax로 견적서 작성 처리후 실행되어 tag값을 참조하고 견적서 목록으로 이동합니다.
1 /* 견적서 작성후 */
2 function completeDocumentInserted(ret_obj) {
3 var error = ret_obj'error';
4 var message = ret_obj'message';
5 var mid = ret_obj'mid';
6 var document_srl = ret_obj'document_srl';
7
8
9 var url;
10 if(document_srl) {
11 url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act','');
12 } else {
13 url = current_url.setQuery('mid',mid).setQuery('act','');
14 }
15 location.href = url;
16 }
function procFormContentWrite() {
// 글작성시 필요한 변수를 세팅
$obj = Context::getRequestVars();
$obj->module_srl = $this->module_srl;
settype($obj->title, "string");
if($obj->title == '') $obj->title = cut_str(strip_tags($obj->content),20,'...');
//그래도 없으면 Untitled
if($obj->title == '') $obj->title = 'Untitled';
// document module의 model 객체 생성
$oDocumentModel = &getModel('document');
// document module의 controller 객체 생성
$oDocumentController = &getController('document');
// 이미 존재하는 글인지 체크
$oDocument = $oDocumentModel->getDocument($obj->document_srl, true);
// 이미 존재하는 경우 수정
if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) {
$output = $oDocumentController->updateDocument($oDocument, $obj);
$msg_code = 'success_updated';
// 그렇지 않으면 신규 등록
} else {
$output = $oDocumentController->insertDocument($obj);
$msg_code = 'success_registed';
$obj->document_srl = $output->get('document_srl');
}
// 오류 발생시 멈춤
if(!$output->toBool()) return $output;
// 결과를 리턴
$this->add('mid', Context::get('mid'+
'+
'));
$this->add('document_srl', $output->get('document_srl'));
// 성공 메세지 등록
$this->setMessage($msg_code);
}