diff options
Diffstat (limited to 'framework/web/renderers/CViewRenderer.php')
| -rw-r--r-- | framework/web/renderers/CViewRenderer.php | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/framework/web/renderers/CViewRenderer.php b/framework/web/renderers/CViewRenderer.php new file mode 100644 index 0000000..093c3bb --- /dev/null +++ b/framework/web/renderers/CViewRenderer.php @@ -0,0 +1,97 @@ +<?php +/** + * CViewRenderer class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +/** + * CViewRenderer is the base class for view renderer classes. + * + * A view renderer is an application component that renders views written + * in a customized syntax. + * + * Once installing a view renderer as a 'viewRenderer' application component, + * the normal view rendering process will be intercepted by the renderer. + * The renderer will first parse the source view file and then render the + * the resulting view file. + * + * Parsing results are saved as temporary files that may be stored + * under the application runtime directory or together with the source view file. + * + * @author Steve Heyns http://customgothic.com/ + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CViewRenderer.php 3515 2011-12-28 12:29:24Z mdomba $ + * @package system.web.renderers + * @since 1.0 + */ +abstract class CViewRenderer extends CApplicationComponent implements IViewRenderer +{ + /** + * @var boolean whether to store the parsing results in the application's + * runtime directory. Defaults to true. If false, the parsing results will + * be saved as files under the same directory as the source view files and the + * file names will be the source file names appended with letter 'c'. + */ + public $useRuntimePath=true; + /** + * @var integer the chmod permission for temporary directories and files + * generated during parsing. Defaults to 0755 (owner rwx, group rx and others rx). + */ + public $filePermission=0755; + /** + * @var string the extension name of the view file. Defaults to '.php'. + */ + public $fileExtension='.php'; + + /** + * Parses the source view file and saves the results as another file. + * @param string $sourceFile the source view file path + * @param string $viewFile the resulting view file path + */ + abstract protected function generateViewFile($sourceFile,$viewFile); + + /** + * Renders a view file. + * This method is required by {@link IViewRenderer}. + * @param CBaseController $context the controller or widget who is rendering the view file. + * @param string $sourceFile the view file path + * @param mixed $data the data to be passed to the view + * @param boolean $return whether the rendering result should be returned + * @return mixed the rendering result, or null if the rendering result is not needed. + */ + public function renderFile($context,$sourceFile,$data,$return) + { + if(!is_file($sourceFile) || ($file=realpath($sourceFile))===false) + throw new CException(Yii::t('yii','View file "{file}" does not exist.',array('{file}'=>$sourceFile))); + $viewFile=$this->getViewFile($sourceFile); + if(@filemtime($sourceFile)>@filemtime($viewFile)) + { + $this->generateViewFile($sourceFile,$viewFile); + @chmod($viewFile,$this->filePermission); + } + return $context->renderInternal($viewFile,$data,$return); + } + + /** + * Generates the resulting view file path. + * @param string $file source view file path + * @return string resulting view file path + */ + protected function getViewFile($file) + { + if($this->useRuntimePath) + { + $crc=sprintf('%x', crc32(get_class($this).Yii::getVersion().dirname($file))); + $viewFile=Yii::app()->getRuntimePath().DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$crc.DIRECTORY_SEPARATOR.basename($file); + if(!is_file($viewFile)) + @mkdir(dirname($viewFile),$this->filePermission,true); + return $viewFile; + } + else + return $file.'c'; + } +} |
