94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| class FormCode extends CCodeModel
 | |
| {
 | |
| 	public $model;
 | |
| 	public $viewPath='application.views';
 | |
| 	public $viewName;
 | |
| 	public $scenario;
 | |
| 
 | |
| 	private $_modelClass;
 | |
| 
 | |
| 	public function rules()
 | |
| 	{
 | |
| 		return array_merge(parent::rules(), array(
 | |
| 			array('model, viewName, scenario', 'filter', 'filter'=>'trim'),
 | |
| 			array('model, viewName, viewPath', 'required'),
 | |
| 			array('model, viewPath', 'match', 'pattern'=>'/^\w+[\.\w+]*$/', 'message'=>'{attribute} should only contain word characters and dots.'),
 | |
| 			array('viewName', 'match', 'pattern'=>'/^\w+[\\/\w+]*$/', 'message'=>'{attribute} should only contain word characters and slashes.'),
 | |
| 			array('model', 'validateModel'),
 | |
| 			array('viewPath', 'validateViewPath'),
 | |
| 			array('scenario', 'match', 'pattern'=>'/^\w+$/', 'message'=>'{attribute} should only contain word characters.'),
 | |
| 			array('viewPath', 'sticky'),
 | |
| 		));
 | |
| 	}
 | |
| 
 | |
| 	public function attributeLabels()
 | |
| 	{
 | |
| 		return array_merge(parent::attributeLabels(), array(
 | |
| 			'model'=>'Model Class',
 | |
| 			'viewName'=>'View Name',
 | |
| 			'viewPath'=>'View Path',
 | |
| 			'scenario'=>'Scenario',
 | |
| 		));
 | |
| 	}
 | |
| 
 | |
| 	public function requiredTemplates()
 | |
| 	{
 | |
| 		return array(
 | |
| 			'form.php',
 | |
| 			'action.php',
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	public function successMessage()
 | |
| 	{
 | |
| 		$output=<<<EOD
 | |
| <p>The form has been generated successfully.</p>
 | |
| <p>You may add the following code in an appropriate controller class to invoke the view:</p>
 | |
| EOD;
 | |
| 		$code="<?php\n".$this->render($this->templatePath.'/action.php');
 | |
| 		return $output.highlight_string($code,true);
 | |
| 	}
 | |
| 
 | |
| 	public function validateModel($attribute,$params)
 | |
| 	{
 | |
| 		if($this->hasErrors('model'))
 | |
| 			return;
 | |
| 		$class=@Yii::import($this->model,true);
 | |
| 		if(!is_string($class) || !$this->classExists($class))
 | |
| 			$this->addError('model', "Class '{$this->model}' does not exist or has syntax error.");
 | |
| 		elseif(!is_subclass_of($class,'CModel'))
 | |
| 			$this->addError('model', "'{$this->model}' must extend from CModel.");
 | |
| 		else
 | |
| 			$this->_modelClass=$class;
 | |
| 	}
 | |
| 
 | |
| 	public function validateViewPath($attribute,$params)
 | |
| 	{
 | |
| 		if($this->hasErrors('viewPath'))
 | |
| 			return;
 | |
| 		if(Yii::getPathOfAlias($this->viewPath)===false)
 | |
| 			$this->addError('viewPath','View Path must be a valid path alias.');
 | |
| 	}
 | |
| 
 | |
| 	public function prepare()
 | |
| 	{
 | |
| 		$templatePath=$this->templatePath;
 | |
| 		$this->files[]=new CCodeFile(
 | |
| 			Yii::getPathOfAlias($this->viewPath).'/'.$this->viewName.'.php',
 | |
| 			$this->render($templatePath.'/form.php')
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	public function getModelClass()
 | |
| 	{
 | |
| 		return $this->_modelClass;
 | |
| 	}
 | |
| 
 | |
| 	public function getModelAttributes()
 | |
| 	{
 | |
| 		$model=new $this->_modelClass($this->scenario);
 | |
| 		return $model->getSafeAttributeNames();
 | |
| 	}
 | |
| } |