167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * CCodeGenerator 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/
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * CCodeGenerator is the base class for code generator classes.
 | |
|  *
 | |
|  * CCodeGenerator is a controller that predefines several actions for code generation purpose.
 | |
|  * Derived classes mainly need to configure the {@link codeModel} property
 | |
|  * override the {@link getSuccessMessage} method. The former specifies which
 | |
|  * code model (extending {@link CCodeModel}) that this generator should use,
 | |
|  * while the latter should return a success message to be displayed when
 | |
|  * code files are successfully generated.
 | |
|  *
 | |
|  * @property string $pageTitle The page title.
 | |
|  * @property string $viewPath The view path of the generator.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @package system.gii
 | |
|  * @since 1.1.2
 | |
|  */
 | |
| class CCodeGenerator extends CController
 | |
| {
 | |
| 	/**
 | |
| 	 * @var string the layout to be used by the generator. Defaults to 'generator'.
 | |
| 	 */
 | |
| 	public $layout='generator';
 | |
| 	/**
 | |
| 	 * @var array a list of available code templates (name=>path)
 | |
| 	 */
 | |
| 	public $templates=array();
 | |
| 	/**
 | |
| 	 * @var string the code model class. This can be either a class name (if it can be autoloaded)
 | |
| 	 * or a path alias referring to the class file.
 | |
| 	 * Child classes must configure this property with a concrete value.
 | |
| 	 */
 | |
| 	public $codeModel;
 | |
| 
 | |
| 	private $_viewPath;
 | |
| 
 | |
| 	/**
 | |
| 	 * @return string the page title
 | |
| 	 */
 | |
| 	public function getPageTitle()
 | |
| 	{
 | |
| 		return 'Gii - '.ucfirst($this->id).' Generator';
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * The code generation action.
 | |
| 	 * This is the action that displays the code generation interface.
 | |
| 	 * Child classes mainly need to provide the 'index' view for collecting user parameters
 | |
| 	 * for code generation.
 | |
| 	 */
 | |
| 	public function actionIndex()
 | |
| 	{
 | |
| 		$model=$this->prepare();
 | |
| 		if($model->files!=array() && isset($_POST['generate'], $_POST['answers']))
 | |
| 		{
 | |
| 			$model->answers=$_POST['answers'];
 | |
| 			$model->status=$model->save() ? CCodeModel::STATUS_SUCCESS : CCodeModel::STATUS_ERROR;
 | |
| 		}
 | |
| 
 | |
| 		$this->render('index',array(
 | |
| 			'model'=>$model,
 | |
| 		));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * The code preview action.
 | |
| 	 * This action shows up the specified generated code.
 | |
| 	 * @throws CHttpException if unable to find code generated.
 | |
| 	 */
 | |
| 	public function actionCode()
 | |
| 	{
 | |
| 		$model=$this->prepare();
 | |
| 		if(isset($_GET['id']) && isset($model->files[$_GET['id']]))
 | |
| 		{
 | |
| 			$this->renderPartial('/common/code', array(
 | |
| 				'file'=>$model->files[$_GET['id']],
 | |
| 			));
 | |
| 		}
 | |
| 		else
 | |
| 			throw new CHttpException(404,'Unable to find the code you requested.');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * The code diff action.
 | |
| 	 * This action shows up the difference between the newly generated code and the corresponding existing code.
 | |
| 	 * @throws CHttpException if unable to find code generated.
 | |
| 	 */
 | |
| 	public function actionDiff()
 | |
| 	{
 | |
| 		Yii::import('gii.components.TextDiff');
 | |
| 
 | |
| 		$model=$this->prepare();
 | |
| 		if(isset($_GET['id']) && isset($model->files[$_GET['id']]))
 | |
| 		{
 | |
| 			$file=$model->files[$_GET['id']];
 | |
| 			if(!in_array($file->type,array('php', 'txt','js','css')))
 | |
| 				$diff=false;
 | |
| 			elseif($file->operation===CCodeFile::OP_OVERWRITE)
 | |
| 				$diff=TextDiff::compare(file_get_contents($file->path), $file->content);
 | |
| 			else
 | |
| 				$diff='';
 | |
| 
 | |
| 			$this->renderPartial('/common/diff',array(
 | |
| 				'file'=>$file,
 | |
| 				'diff'=>$diff,
 | |
| 			));
 | |
| 		}
 | |
| 		else
 | |
| 			throw new CHttpException(404,'Unable to find the code you requested.');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the view path of the generator.
 | |
| 	 * The "views" directory under the directory containing the generator class file will be returned.
 | |
| 	 * @return string the view path of the generator
 | |
| 	 */
 | |
| 	public function getViewPath()
 | |
| 	{
 | |
| 		if($this->_viewPath===null)
 | |
| 		{
 | |
| 			$class=new ReflectionClass(get_class($this));
 | |
| 			$this->_viewPath=dirname($class->getFileName()).DIRECTORY_SEPARATOR.'views';
 | |
| 		}
 | |
| 		return $this->_viewPath;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param string $value the view path of the generator.
 | |
| 	 */
 | |
| 	public function setViewPath($value)
 | |
| 	{
 | |
| 		$this->_viewPath=$value;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Prepares the code model.
 | |
| 	 */
 | |
| 	protected function prepare()
 | |
| 	{
 | |
| 		if($this->codeModel===null)
 | |
| 			throw new CException(get_class($this).'.codeModel property must be specified.');
 | |
| 		$modelClass=Yii::import($this->codeModel,true);
 | |
| 		$model=new $modelClass;
 | |
| 		$model->loadStickyAttributes();
 | |
| 		if(isset($_POST[$modelClass]))
 | |
| 		{
 | |
| 			$model->attributes=$_POST[$modelClass];
 | |
| 			$model->status=CCodeModel::STATUS_PREVIEW;
 | |
| 			if($model->validate())
 | |
| 			{
 | |
| 				$model->saveStickyAttributes();
 | |
| 				$model->prepare();
 | |
| 			}
 | |
| 		}
 | |
| 		return $model;
 | |
| 	}
 | |
| } |