관리자가 견적서 폼을 생성하여 사용자 화면인 견적서 목록을 구현합니다. 관리자와 같은 방법으로 module.xml을 참조하여 form.view.php와 form.controller.php에 class 및 필요한 member method를 만듭니다. 또 스킨은 sample이라는 스킨명으로 만듭니다.

form.view.php

    class formView extends form {

        /**
         * @brief 초기화
         **/
        function init() {
        }  

        /**
         * @brief 목록
         **/
        function dispFormContentList() {
        }

        /**
         * @brief 선택된 견적서 내용보기
         **/
        function dispFormContentView(){
        }

        /**
         * @brief 견적서 작성 화면 출력
         **/
        function dispFormContentWrite() {
        }
    }

생성자 formView::init()

init()는 XE_ROOT/classes/module/ModuleObject.class.php에서 보면 action이 들어오게 될때 act 값으로 action의 타입(model, view, controller)를 찾아 해당 class를 생성후 init()를 실행해 줍니다. 따라서 init() 작성은 필요한 값을 미리 설정해 주면 차후 구현하기 편하게 하기 위해서 입니다.

        function init() {

            /**
             * 스킨 경로를 미리 template_path 라는 변수로 설정함
             * 스킨이 존재하지 않는다면 sample로 변경
             **/
            $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
            if(!is_dir($template_path)||!$this->module_info->skin) {
                $this->module_info->skin = 'sample';
                $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
            }
            $this->setTemplatePath($template_path);

            // 확장 변수 사용시 미리 확장변수의 대상 키들을 가져와서 context set
            $oDocumentModel = &getModel('document');
            $extra_keys = $oDocumentModel->getExtraKeys($this->module_info->module_srl);
            Context::set('+ '+ 'extra_keys', $extra_keys);

            // 게시판 전반적으로 사용되는 javascript 추가
            Context::addJsFile($this->module_path.'tpl/js/form.js');
        }

견적서 목록 formView::dispFormContentList()

form 모듈은 기본적으로 document모듈을 이용합니다. 견적서를 가져올 때도 document모듈의 모델을 사용하여 가져오고 document의 entity 객체인 documentItem(document.item.php)의 목록을 받습니다.

        /**
         * @brief 목록
         **/
        function dispFormContentList() {
            $args->module_srl = $this->module_srl;
            $args->page = Context::get('page');

            $oDocumentModel = &getModel('document');
            $output = $oDocumentModel->getDocumentList($args,true);
            Context::set('document_list', $output->data);
            Context::set('page', $output->page);
            Context::set('page_navigation', $output->page_navigation);

            // template_file을 list.html로 지정
            $this->setTemplateFile('list');
        }

견적서 목록 skins/sample/list.html

템플릿에서는 documentItem(document.item.php)의 getTitle(), getNickName() 등을 참고하여 구현합니다.

 13 <!--@foreach($document_list as $no => $document)-->
 14     <tr class="bg{($no+1)%2+1}">
 15         <td class="num"><!--@if($document_srl == $document->document_srl)-->&raquo;<!--@else-->{$no}<!--@end--></td>
 16         <td class="title"> <a href="{getUrl('act','dispFormContentView','document_srl',$document->document_srl)}">{$document->getTitle($module_info->subject_cut_size)}</a> {$document->printExtraImages(60*60*    $module_info->duration_new)} </td>
 17         <td class="author"><a href="#popup_menu_area" class="member_{$document->get('member_srl')}" onclick="return false">{$document->getNickName()}</a></td>
 18         <td class="num">{$document->getRegdate()}</td>
 19     </tr>
 20 <!--@end-->

견적서 내용보기 formView::dispFormContentView()

        /**
         * @brief 선택된 견적서 내용보기
         **/
        function dispFormContentView(){
            $page = Context::get('page');

            // document_srl 이 없으면
            $document_srl = Context::get('document_srl');
            if(!$document_srl) return new Object(-1,'msg_invalid_request');

            // 해당 document를 가져옴
            $oDocumentModel = &getModel('document');
            $oDocument = $oDocumentModel->getDocument($document_srl);

            // 해당 문서가 존재하지 않다면
            if(!$oDocument->isExists()) return new Object(-1,'msg_invalid_request');

            // 글과 요청된 모듈이 다르다면 오류 표시
            if($oDocument->get('module_srl') != $this->module_info->module_srl ) return new Object(-1,'msg_invalid_request');

            Context::set('oDocument',$oDocument);

            // template_file을 view.html로 지정
            $this->setTemplateFile('view');
        }

* 변수의 값이 꼭 들어와야하는 안들어 왔을 경우 오류를 나타내기 위해서는 new Object(-1,lang code); 를 리턴합니다.

if(!$document_srl) return new Object(-1,'msg_invalid_request');

견적서 보기 skins/sample/view.html

  3 <div class="formRead">
  4     <div class="formReadHeader">
  5         <h3 class="title"><a href="{$oDocument->getPermanentUrl()}">{$oDocument->getTitle()}</a></h3>
  6         <em>
  7             <!--@if(!$oDocument->getMemberSrl())-->
  8                 <!--@if($oDocument->isExistsHomepage())-->
  9                     <a href="{$oDocument->getHomepageUrl()}" onclick="window.open(this.href);return false;">{$oDocument->getNickName()}</a>
 10                 <!--@else-->
 11                     {$oDocument->getNickName()}
 12                 <!--@end-->
 13             <!--@else-->
 14                 <a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}" onclick="return false">{$oDocument->getNickName()}</a>
 15             <!--@end-->
 16         </em>
 17     </div>
 18    
 19     <!--@if($oDocument->isExtraVarsExists() )-->
 20     <table border="1" cellspacing="0" summary="Extra Form" class="extraVarsList">
 21     <!--@foreach($oDocument->getExtraVars() as $key => $val)-->
 22     <tr>
 23         <th>{$val->name} :</th>
 24         <td>{$val->getValueHTML()}</td>
 25     </tr>
 26     <!--@end-->
 27     </table>
 28     <!--@end-->
 29    
 30     <div class="formReadBody">
 31             {$oDocument->getContent(false)}
 32     </div>
 33     <div class="formNavigation">
 34         <div class="buttonLeft">
 35             <a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_list}</span></a>
 36         </div>
 37     </div>
 38 </div>