You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					153 lines
				
				3.9 KiB
			
		
		
			
		
	
	
					153 lines
				
				3.9 KiB
			| 
											12 years ago
										 | <?php
 | ||
|  | /**
 | ||
|  |  * @link http://www.yiiframework.com/
 | ||
|  |  * @copyright Copyright (c) 2008 Yii Software LLC
 | ||
|  |  * @license http://www.yiiframework.com/license/
 | ||
|  |  */
 | ||
|  | 
 | ||
|  | namespace yii\gii\generators\form;
 | ||
|  | 
 | ||
| 
											12 years ago
										 | use Yii;
 | ||
|  | use yii\base\Model;
 | ||
|  | use yii\gii\CodeFile;
 | ||
|  | 
 | ||
| 
											12 years ago
										 | /**
 | ||
| 
											12 years ago
										 |  * This generator will generate an action view file based on the specified model class.
 | ||
| 
											12 years ago
										 |  *
 | ||
|  |  * @author Qiang Xue <qiang.xue@gmail.com>
 | ||
|  |  * @since 2.0
 | ||
|  |  */
 | ||
|  | class Generator extends \yii\gii\Generator
 | ||
|  | {
 | ||
| 
											12 years ago
										 | 	public $modelClass;
 | ||
|  | 	public $viewPath = '@app/views';
 | ||
|  | 	public $viewName;
 | ||
| 
											12 years ago
										 | 	public $scenarioName;
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function getName()
 | ||
|  | 	{
 | ||
|  | 		return 'Form Generator';
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function getDescription()
 | ||
|  | 	{
 | ||
|  | 		return 'This generator generates a view script file that displays a form to collect input for the specified model class.';
 | ||
|  | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
|  | 	public function generate()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$files = [];
 | ||
| 
											12 years ago
										 | 		$files[] = new CodeFile(
 | ||
|  | 			Yii::getAlias($this->viewPath) . '/' . $this->viewName . '.php',
 | ||
| 
											12 years ago
										 | 			$this->render('form.php')
 | ||
| 
											12 years ago
										 | 		);
 | ||
|  | 		return $files;
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function rules()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return array_merge(parent::rules(), [
 | ||
|  | 			['modelClass, viewName, scenarioName, viewPath', 'filter', 'filter' => 'trim'],
 | ||
|  | 			['modelClass, viewName, viewPath', 'required'],
 | ||
|  | 			['modelClass', 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
 | ||
|  | 			['modelClass', 'validateClass', 'params' => ['extends' => Model::className()]],
 | ||
|  | 			['viewName', 'match', 'pattern' => '/^\w+[\\-\\/\w]*$/', 'message' => 'Only word characters, dashes and slashes are allowed.'],
 | ||
|  | 			['viewPath', 'match', 'pattern' => '/^@?\w+[\\-\\/\w]*$/', 'message' => 'Only word characters, dashes, slashes and @ are allowed.'],
 | ||
|  | 			['viewPath', 'validateViewPath'],
 | ||
|  | 			['scenarioName', 'match', 'pattern' => '/^[\w\\-]+$/', 'message' => 'Only word characters and dashes are allowed.'],
 | ||
|  | 		]);
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function attributeLabels()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return [
 | ||
| 
											12 years ago
										 | 			'modelClass' => 'Model Class',
 | ||
|  | 			'viewName' => 'View Name',
 | ||
|  | 			'viewPath' => 'View Path',
 | ||
|  | 			'scenarioName' => 'Scenario',
 | ||
| 
											12 years ago
										 | 		];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function requiredTemplates()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return ['form.php', 'action.php'];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
|  | 	public function stickyAttributes()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return ['viewPath', 'scenarioName'];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
|  | 	public function hints()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return [
 | ||
| 
											12 years ago
										 | 			'modelClass' => 'This is the model class for collecting the form input. You should provide a fully qualified class name, e.g., <code>app\models\Post</code>.',
 | ||
|  | 			'viewName' => 'This is the view name with respect to the view path. For example, <code>site/index</code> would generate a <code>site/index.php</code> view file under the view path.',
 | ||
|  | 			'viewPath' => 'This is the root view path to keep the generated view files. You may provide either a directory or a path alias, e.g., <code>@app/views</code>.',
 | ||
|  | 			'scenarioName' => 'This is the scenario to be used by the model when collecting the form input. If empty, the default scenario will be used.',
 | ||
| 
											12 years ago
										 | 		];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function successMessage()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$code = highlight_string($this->render('action.php'), true);
 | ||
| 
											12 years ago
										 | 		return <<<EOD
 | ||
| 
											12 years ago
										 | <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>
 | ||
| 
											12 years ago
										 | <pre>$code</pre>
 | ||
| 
											12 years ago
										 | EOD;
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * Validates [[viewPath]] to make sure it is a valid path or path alias and exists.
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function validateViewPath()
 | ||
|  | 	{
 | ||
|  | 		$path = Yii::getAlias($this->viewPath, false);
 | ||
|  | 		if ($path === false || !is_dir($path)) {
 | ||
|  | 			$this->addError('viewPath', 'View path does not exist.');
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @return array list of safe attributes of [[modelClass]]
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function getModelAttributes()
 | ||
|  | 	{
 | ||
|  | 		/** @var Model $model */
 | ||
|  | 		$model = new $this->modelClass;
 | ||
| 
											12 years ago
										 | 		if (!empty($this->scenarioName)) {
 | ||
|  | 			$model->setScenario($this->scenarioName);
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 		return $model->safeAttributes();
 | ||
| 
											12 years ago
										 | 	}
 | ||
| 
											12 years ago
										 | }
 |