public function renderModule($templateName, $parameters = null) { $ttt = ModuleHelpers::findModuleClass($templateName); $className = $ttt[0]; $classPath = $ttt[1]; require_once $classPath; $moduleClass = new $className(); $moduleClass->setModuleChain($this->_moduleChain); $runData = $this->runData; $runData->setModuleTemplate($templateName); if (!$moduleClass->isAllowed($runData)) { throw new WDPermissionException("Not allowed."); } $pl = $runData->getParameterList(); $plOrig = clone $pl; $contextOrig = $runData->getContext(); $runData->contextDel(); // add new parameters ... $origParms = clone $runData->getParameterList(); if ($parameters !== null && $parameters !== "") { // first parse the parameters string $parameters = urldecode($parameters); $re = '/([a-zA-Z][a-zA-Z0-9\\-_]*)="([^"]*)"/'; preg_match_all($re, $parameters, $pout, PREG_SET_ORDER); for ($i = 0; $i < count($pout); $i++) { if ($pout[$i][1] == "module_body") { $pout[$i][2] = urldecode($pout[$i][2]); } $pl->addParameter($pout[$i][1], $pout[$i][2], "MODULE"); } } // the RunData object MUST be cloned at this point - to avoid context mixing between // the module and the global (screen) context. try { $out = $moduleClass->render($runData); } catch (Exception $e) { // restore old parameters ... $runData->setContext($contextOrig); $runData->setParameterList($plOrig); // recurent (for nested modules to work): $out = $this->process($out); $this->level--; throw $e; } // check if there are any javascript files for this module $js2include = array(); $file = WIKIDOT_ROOT . '/' . GlobalProperties::$MODULES_JS_PATH . '/' . $templateName . '.js'; if (file_exists($file)) { $url = GlobalProperties::$MODULES_JS_URL . '/' . $templateName . '.js'; $js2include[] = $url; } $js2include = array_merge($js2include, $moduleClass->getExtraJs()); foreach ($js2include as $jsUri) { if ($this->javascriptInline) { // and include them via <script> tags now $incl = '<script type="text/javascript" src="' . $jsUri . '"></script>'; $out .= $incl; } else { // include later $jsInclude = $runData->getTemp("jsInclude"); $jsInclude[] = $jsUri; $runData->setTemp("jsInclude", $jsInclude); } } // check if any css file exists $file = WIKIDOT_ROOT . '/' . GlobalProperties::$MODULES_CSS_PATH . '/' . $templateName . '.css'; if (file_exists($file)) { $url = GlobalProperties::$MODULES_CSS_URL . '/' . $templateName . '.css'; $this->cssInclude[] = $url; } // restore old parameters ... $runData->setContext($contextOrig); $runData->setParameterList($plOrig); $moduleChainOrig = array_copy($this->_moduleChain); $this->_moduleChain[] = $moduleClass; // recurent (for nested modules to work): $out = $this->process($out); $this->level = $this->level - 1; $this->_moduleChain = $moduleChainOrig; // check if the module wants to modify the page itself if ($moduleClass->getProcessPage()) { $this->modulesToProcessPage[] = $moduleClass; } return $out; }
/** * Finds class given the template name. */ private function findClass() { if (!$this->ajaxMode) { $classFilename = PathManager::screenClass($this->screenTemplate); if (file_exists($classFilename)) { $this->screenClassPath = $classFilename; $tmp1 = explode('/', $this->screenTemplate); $size = sizeof($tmp1); $this->screenClassName = $tmp1[$size - 1]; } else { $tmppath = PathManager::screenClassDir(); ## generate list of possible classes: $template = $this->screenTemplate; $path44 = explode('/', $template); for ($i = sizeof($path44) - 1; $i >= 0; $i--) { $tmppath2 = ""; for ($k = 0; $k < $i; $k++) { $tmppath2 .= $path44[$k] . "/"; } $tmppath2 .= "DefaultScreen.php"; $classFiles[] = $tmppath2; } foreach ($classFiles as $classFile) { if (file_exists($tmppath . $classFile)) { $this->screenClassPath = $tmppath . $classFile; $this->screenClassName = "DefaultScreen"; break; } } } } else { $ttt = ModuleHelpers::findModuleClass($this->moduleTemplate); $this->moduleClassName = $ttt[0]; $this->moduleClassPath = $ttt[1]; } }