97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * CViewRenderer class file.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @link http://www.yiiframework.com/
 | |
|  * @copyright 2008-2013 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>
 | |
|  * @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';
 | |
| 	}
 | |
| }
 |