견적서 추가화면 formView::dispFormContentWrite()

        /**
         * @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');
        }

템플릿 skins/sample/write.html

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>

필터 tpl/filter/insert_content.xml

견적서 등록 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" 필터의 callback 구현 tpl/js/form.js

"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 }  

견적서 추가부분 formController::procFormContentWrite()

        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);
      }