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.
152 lines
3.9 KiB
152 lines
3.9 KiB
<?php |
|
/** |
|
* @link http://www.yiiframework.com/ |
|
* @copyright Copyright (c) 2008 Yii Software LLC |
|
* @license http://www.yiiframework.com/license/ |
|
*/ |
|
|
|
namespace yii\gii\generators\form; |
|
|
|
use Yii; |
|
use yii\base\Model; |
|
use yii\gii\CodeFile; |
|
|
|
/** |
|
* This generator will generate an action view file based on the specified model class. |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @since 2.0 |
|
*/ |
|
class Generator extends \yii\gii\Generator |
|
{ |
|
public $modelClass; |
|
public $viewPath = '@app/views'; |
|
public $viewName; |
|
public $scenarioName; |
|
|
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function getName() |
|
{ |
|
return 'Form Generator'; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function getDescription() |
|
{ |
|
return 'This generator generates a view script file that displays a form to collect input for the specified model class.'; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function generate() |
|
{ |
|
$files = []; |
|
$files[] = new CodeFile( |
|
Yii::getAlias($this->viewPath) . '/' . $this->viewName . '.php', |
|
$this->render('form.php') |
|
); |
|
return $files; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function rules() |
|
{ |
|
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.'], |
|
]); |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function attributeLabels() |
|
{ |
|
return [ |
|
'modelClass' => 'Model Class', |
|
'viewName' => 'View Name', |
|
'viewPath' => 'View Path', |
|
'scenarioName' => 'Scenario', |
|
]; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function requiredTemplates() |
|
{ |
|
return ['form.php', 'action.php']; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function stickyAttributes() |
|
{ |
|
return ['viewPath', 'scenarioName']; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function hints() |
|
{ |
|
return [ |
|
'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.', |
|
]; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function successMessage() |
|
{ |
|
$code = highlight_string($this->render('action.php'), true); |
|
return <<<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> |
|
<pre>$code</pre> |
|
EOD; |
|
} |
|
|
|
/** |
|
* Validates [[viewPath]] to make sure it is a valid path or path alias and exists. |
|
*/ |
|
public function validateViewPath() |
|
{ |
|
$path = Yii::getAlias($this->viewPath, false); |
|
if ($path === false || !is_dir($path)) { |
|
$this->addError('viewPath', 'View path does not exist.'); |
|
} |
|
} |
|
|
|
/** |
|
* @return array list of safe attributes of [[modelClass]] |
|
*/ |
|
public function getModelAttributes() |
|
{ |
|
/** @var Model $model */ |
|
$model = new $this->modelClass; |
|
if (!empty($this->scenarioName)) { |
|
$model->setScenario($this->scenarioName); |
|
} |
|
return $model->safeAttributes(); |
|
} |
|
}
|
|
|