예제 #1
0
 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;
 }
예제 #2
0
파일: RunData.php 프로젝트: jbzdak/wikidot
 /**
  * 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];
     }
 }