묻고답하기
http://사이트.com/index.php?module=나의모듈&act=나의액션
2015.06.13 19:55
제목과 같은 방식으로 mid가 존재하지 않는 상태에서 module과 act만 가진 상태에서 본인이 선택한 레이아웃을 입히려면 어떻게 해야 하는지 조언을 구합니다.
다른 말로 하면 특정 mid가 존재하는 상태에서도 강제로 다른 레이아웃으로 바꿔서 보여주는 방식이 궁금합니다.
모듈 config을 저장하고 가져오는 방식은 rss 모듈을 참고했습니다.
approach.admin.view.php의 dispApproachAdminIndex():
본 모듈의 관리자 설정 화면을 보여주는 view 메서드 입니다.
/** * In case an administrator page has been initialized * * @return Object */ function dispApproachAdminIndex() { // 필요한 Model Import $oModuleModel = getModel('module'); $total_config = $oModuleModel->getModuleConfig('approach'); // total_config 설정 if(!$total_config) $total_config = new stdClass(); // Context를 set 한다. Context::set('total_config', $total_config); // Security 설정 $security = new Security(); $security->encodeHTML('total_config..'); // Template 설정 $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('index'); $oLayoutModel = &getModel('layout'); Context::set('layout_list', $oLayoutModel->getLayoutList()); }
approach.admin.controller.php의 procApproachAdminInsertConfig():
관리자 화면에서 받아온 값을 module의 config에 저장
/** * All module configurations * * @return void */ function procApproachAdminInsertConfig() { $oModuleModel = getModel('module'); $total_config = $oModuleModel->getModuleConfig('approach'); $config_vars = Context::getRequestVars(); // 실제적으로 Module의 Config이 저장되는 함수 $output = $this->setFeedConfig($config_vars); // 결과출력 메세지 처리 $message = Context::getLang('success_updated'); $this->setMessage($alt_message, 'info'); // Redirect 처리 $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispApproachAdminIndex'); $this->setRedirectUrl($returnUrl); }
tpl/index.html:
본 모듈의 관리자 화면 템플릿 파일
<div class="x_page-header"> <h1> {$lang->approach} <span class="path" cond="$module_info->mid"> > <a href="{getSiteUrl($module_info->domain,'','mid',$module_info->mid)}" target="_blank"|cond="$module=='admin'">{$module_info->mid}</a><block cond="$module_info->is_default=='Y'">({$lang->is_default})</block> </span> <a href="#aboutModule" class="x_icon-question-sign" data-toggle cond="!$module_info->mid"></a> </h1> </div> <p id="aboutModule" class="x_alert x_alert-info" cond="!$module_info->mid" hidden>{nl2br($lang->about_approach)}</p> <div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/approach/tpl/index/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}"> <p>{$XE_VALIDATOR_MESSAGE}</p> </div> <section class="section"> <h1>{$lang->is_default}</h1> <form ruleset="insertConfig" action="./" method="post" enctype="multipart/form-data" class="x_form-horizontal"> <input type="hidden" name="module" value="approach" /> <input type="hidden" name="act" value="procApproachAdminInsertConfig" /> <input type="hidden" name="xe_validator_id" value="modules/approach/tpl/index/1" /> <div class="x_control-group"> <label class="x_control-label" for="layout_srl">{$lang->layout}</label> <div class="x_controls"> <select name="layout_srl" id="layout_srl"> <option value="0">{$lang->notuse}</option> <option loop="$layout_list => $key, $val" value="{$val->layout_srl}" selected="selected"|cond="$total_config->layout_srl== $val->layout_srl">{$val->title} ({$val->layout})</option> </select> <a href="#layout_help" class="x_icon-question-sign" data-toggle>{$lang->help}</a> <p id="layout_help" class="x_help-block" hidden>{$lang->about_layout}</p> </div> </div> <div class="btnArea x_clearfix"> <button type="submit" class="x_btn x_btn-primary x_pull-right">{$lang->cmd_save}</button> </div> </form> </section>
approach.view.php의 init():
관리자 화면이 아닌 모듈의 일반 view의 초기화 메서드
// view 초기화 function init() { $oDocumentModel = &getModel('document'); // 스킨을 설정하는 부분. $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 = 'xe_approach_official'; $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); } $this->setTemplatePath($template_path); $this->setTemplateFile(strtolower(str_replace('dispApproach','',$this->act))); $oModuleModel = getModel('module'); $total_config = $oModuleModel->getModuleConfig('approach'); // 레이아웃의 정보를 가져옴 $layout_srl = $total_config->layout_srl; if($layout_srl) { $oLayoutModel = &getModel('layout'); $layout_info = $oLayoutModel->getLayout($layout_srl); if(!$layout_info) return; $this->setLayoutPath($layout_info->path); $this->setLayoutFile('layout.html'); } }
$total_config에 해당하는 부분이 관리자 화면에서 저장한 layout_srl 값이 들어있구요.
그걸 바탕으로 위와 같은 방식으로 시도해보았는데 아래와 같이 화면이 나옵니다. 해당 레이아웃이 커스텀 설정 값이 컴파일 된 값이 아닌 순수 레이아웃 파일 자체만 씌워주는 것 같은데요.
저와 같은 시도를 해보신 분이 없으신지 궁금합니다. 각 mid에 대한 레이아웃 셋팅이 어디에서 핸들링 되고 있는지 몰라서요. mid가 존재하지 않는 상태에서 모듈 자체에 대해서 레이아웃을 씌우고 싶은데 조언을 구합니다.
감사합니다.
제가 질문하고 제가 답변 다네요. 아래처럼 하면 되네요.
mid 값은 반드시 개념적으로 존재해야 하는 것 같네요. 그리고 레이아웃의 설정된 메뉴 등은 해당 mid를 기반으로 연동되는 것 같습니다.