summaryrefslogtreecommitdiff
path: root/framework/web/renderers/CViewRenderer.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/renderers/CViewRenderer.php')
-rw-r--r--framework/web/renderers/CViewRenderer.php97
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 &copy; 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';
+ }
+}