module = 'install'; $this->act = Context::get('act'); return; } // Set variables from request arguments $this->module = $module?$module:Context::get('module'); $this->act = $act?$act:Context::get('act'); $this->mid = $mid?$mid:Context::get('mid'); $this->document_srl = $document_srl?(int)$document_srl:(int)Context::get('document_srl'); $this->module_srl = $module_srl?(int)$module_srl:(int)Context::get('module_srl'); $this->entry = Context::convertEncodingStr(Context::get('entry')); // Validate variables to prevent XSS if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request")); if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request")); if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request")); // execute addon (before module initialization) $called_position = 'before_module_init'; $oAddonController = &getController('addon'); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?'mobile':'pc'); @include($addon_file); } /** * @brief Initialization. It finds the target module based on module, mid, document_srl, and prepares to execute an action * @return true: OK, false: redirected **/ function init() { $oModuleModel = &getModel('module'); $site_module_info = Context::get('site_module_info'); if(!$this->document_srl && $this->mid && $this->entry) { $oDocumentModel = &getModel('document'); $this->document_srl = $oDocumentModel->getDocumentSrlByAlias($this->mid, $this->entry); if($this->document_srl) Context::set('document_srl', $this->document_srl); } // Get module's information based on document_srl, if it's specified if($this->document_srl && !$this->module) { $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); // If the document does not exist, remove document_srl if(!$module_info) { unset($this->document_srl); } else { // If it exists, compare mid based on the module information // if mids are not matching, set it as the document's mid if($this->mid != $module_info->mid) { $this->mid = $module_info->mid; Context::set('mid', $module_info->mid, true); } } // if requested module is different from one of the document, remove the module information retrieved based on the document number if($this->module && $module_info->module != $this->module) unset($module_info); } // If module_info is not set yet, and there exists mid information, get module information based on the mid if(!$module_info && $this->mid) { $module_info = $oModuleModel->getModuleInfoByMid($this->mid, $site_module_info->site_srl); //if($this->module && $module_info->module != $this->module) unset($module_info); } // redirect, if module_site_srl and site_srl are different if(!$this->module && !$module_info && $site_module_info->site_srl == 0 && $site_module_info->module_site_srl > 0) { $site_info = $oModuleModel->getSiteInfo($site_module_info->module_site_srl); header("location:".getNotEncodedSiteUrl($site_info->domain,'mid',$site_module_info->mid)); return false; } // If module_info is not set still, and $module does not exist, find the default module if(!$module_info && !$this->module) $module_info = $site_module_info; if(!$module_info && !$this->module && $site_module_info->module_site_srl) $module_info = $site_module_info; // redirect, if site_srl of module_info is different from one of site's module_info if($module_info && $module_info->site_srl != $site_module_info->site_srl && !isCrawler()) { // If the module is of virtual site if($module_info->site_srl) { $site_info = $oModuleModel->getSiteInfo($module_info->site_srl); $redirect_url = getNotEncodedSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); // If it's called from a virtual site, though it's not a module of the virtual site } else { $db_info = Context::getDBInfo(); if(!$db_info->default_url) return Context::getLang('msg_default_url_is_not_defined'); else $redirect_url = getNotEncodedSiteUrl($db_info->default_url, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); } header("location:".$redirect_url); return false; } // If module info was set, retrieve variables from the module information if($module_info) { $this->module = $module_info->module; $this->mid = $module_info->mid; $this->module_info = $module_info; Context::setBrowserTitle($module_info->browser_title); $part_config= $oModuleModel->getModulePartConfig('layout',$module_info->layout_srl); Context::addHtmlHeader($part_config->header_script); } // Set module and mid into module_info $this->module_info->module = $this->module; $this->module_info->mid = $this->mid; // Still no module? it's an error if(!$this->module) $this->error = 'msg_module_does_not_exist'; // If mid exists, set mid into context if($this->mid) Context::set('mid', $this->mid, true); // Call a trigger after moduleHandler init $output = ModuleHandler::triggerCall('moduleHandler.init', 'after', $this->module_info); if(!$output->toBool()) { $this->error = $output->getMessage(); return false; } // Set current module info into context Context::set('current_module_info', $this->module_info); return true; } /** * @brief get a module instance and execute an action * @return executed module instance **/ function procModule() { // If error occurred while preparation, return a message instance if($this->error) { $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); return $oMessageObject; } $oModuleModel = &getModel('module'); // Get action information with conf/action.xml $xml_info = $oModuleModel->getModuleActionXml($this->module); // If not installed yet, modify act if($this->module=="install") { if(!$this->act || !$xml_info->action->{$this->act}) $this->act = $xml_info->default_index_act; } // if act exists, find type of the action, if not use default index act if(!$this->act) $this->act = $xml_info->default_index_act; // still no act means error if(!$this->act) { $this->error = 'msg_module_does_not_exist'; return; } // get type, kind $type = $xml_info->action->{$this->act}->type; $kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; if(!$kind && $this->module == 'admin') $kind = 'admin'; if($this->module_info->use_mobile != "Y") Mobile::setMobile(false); // if(type == view, and case for using mobilephone) if($type == "view" && Mobile::isFromMobilePhone() && Context::isInstalled()) { $orig_type = "view"; $type = "mobile"; // create a module instance $oModule = &$this->getModuleInstance($this->module, $type, $kind); if(!is_object($oModule) || !method_exists($oModule, $this->act)) { $type = $orig_type; Mobile::setMobile(false); $oModule = &$this->getModuleInstance($this->module, $type, $kind); } } else { // create a module instance $oModule = &$this->getModuleInstance($this->module, $type, $kind); } if(!is_object($oModule)) { $this->error = 'msg_module_does_not_exist'; return; } // If there is no such action in the module object if(!isset($xml_info->action->{$this->act}) || !method_exists($oModule, $this->act)) { if(!Context::isInstalled()) { $this->error = 'msg_invalid_request'; return; } $forward = null; // 1. Look for the module with action name if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches)) { $module = strtolower($matches[2].$matches[3]); $xml_info = $oModuleModel->getModuleActionXml($module); if($xml_info->action->{$this->act}) { $forward->module = $module; $forward->type = $xml_info->action->{$this->act}->type; $forward->act = $this->act; } } if(!$forward) { $forward = $oModuleModel->getActionForward($this->act); } if($forward->module && $forward->type && $forward->act && $forward->act == $this->act) { $kind = strpos(strtolower($forward->act),'admin')!==false?'admin':''; $type = $forward->type; $tpl_path = $oModule->getTemplatePath(); $orig_module = $oModule; if($type == "view" && Mobile::isFromMobilePhone()) { $orig_type = "view"; $type = "mobile"; // create a module instance $oModule = &$this->getModuleInstance($forward->module, $type, $kind); if(!is_object($oModule) || !method_exists($oModule, $this->act)) { $type = $orig_type; Mobile::setMobile(false); $oModule = &$this->getModuleInstance($forward->module, $type, $kind); } } else { $oModule = &$this->getModuleInstance($forward->module, $type, $kind); } $xml_info = $oModuleModel->getModuleActionXml($forward->module); if($this->module == "admin" && $type == "view") { $oMemberModel = &getModel('member'); $logged_info = $oMemberModel->getLoggedInfo(); if($logged_info->is_admin=='Y') { $orig_module->loadSideBar(); $oModule->setLayoutPath("./modules/admin/tpl"); $oModule->setLayoutFile("layout.html"); } } } else if($xml_info->default_index_act && method_exists($oModule, $xml_info->default_index_act)) { $this->act = $xml_info->default_index_act; } else { $this->error = 'msg_invalid_request'; return; } } $oModule->setAct($this->act); $this->module_info->module_type = $type; $oModule->setModuleInfo($this->module_info, $xml_info); if($type == "view" && $this->module_info->use_mobile == "Y" && Mobile::isMobileCheckByAgent()) { global $lang; $footer = '
'.$lang->msg_pc_to_mobile.' '.$lang->cmd_move.'