public function fetch($templateFile) { if (strncmp($templateFile, "string:", strlen("string:")) === 0) { $this->parserContext->setString(substr($templateFile, strlen("string:"))); $this->compilerContext->setClassName("Template_" . md5($this->parserContext->getString())); } else { if (!is_null($this->parserContext->getBaseDirectory()) && strncmp($templateFile, $this->parserContext->getBaseDirectory(), strlen($this->parserContext->getBaseDirectory())) === 0) { $templateFile = substr($templateFile, strlen($this->parserContext->getBaseDirectory()) + 1); } // must be set before CompilerContext::getFullyQualifiedClassName() is called // FIXME: uncouple this $this->parserContext->setFile($templateFile); } $className = $this->compilerContext->getFullyQualifiedClassName(); if (!class_exists($className)) { $saveFileName = $this->classDirectory . "/" . str_replace("\\", "/", trim($className, "\\") . ".php"); if (file_exists($saveFileName)) { require_once $saveFileName; } else { $oldUmask = umask(0); $compiledTemplate = $this->compilerContext->setTemplate($this->parserContext->parse())->compile(); if (!is_dir(dirname($saveFileName))) { @mkdir(dirname($saveFileName), $this->dirPerms, true); } file_put_contents($saveFileName, $compiledTemplate); @chmod($saveFileName, $this->dirPerms); umask($oldUmask); require_once $saveFileName; } } $templateInstance = new $className(); ob_start(); $templateInstance($this->locals); $output = ob_get_clean(); foreach ($this->outputFilters as $filter) { $output = $filter($output); } return $output; }