diff options
Diffstat (limited to 'framework/cli/commands/shell/FormCommand.php')
| -rw-r--r-- | framework/cli/commands/shell/FormCommand.php | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/framework/cli/commands/shell/FormCommand.php b/framework/cli/commands/shell/FormCommand.php new file mode 100644 index 0000000..c3f064f --- /dev/null +++ b/framework/cli/commands/shell/FormCommand.php @@ -0,0 +1,123 @@ +<?php +/** + * FormCommand class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 Yii Software LLC + * @license http://www.yiiframework.com/license/ + * @version $Id: FormCommand.php 2799 2011-01-01 19:31:13Z qiang.xue $ + */ + +/** + * FormCommand generates a form view based on a specified model. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: FormCommand.php 2799 2011-01-01 19:31:13Z qiang.xue $ + * @package system.cli.commands.shell + * @since 1.0 + */ +class FormCommand extends CConsoleCommand +{ + /** + * @var string the directory that contains templates for the form command. + * Defaults to null, meaning using 'framework/cli/views/shell/form'. + * If you set this path and some views are missing in the directory, + * the default views will be used. + */ + public $templatePath; + + public function getHelp() + { + return <<<EOD +USAGE + form <model-class> <view-name> [scenario] + +DESCRIPTION + This command generates a form view that can be used to collect inputs + for the specified model. + +PARAMETERS + * model-class: required, model class. This can be either the name of + the model class (e.g. 'ContactForm') or the path alias of the model + class file (e.g. 'application.models.ContactForm'). The former can + be used only if the class can be autoloaded. + + * view-name: required, the name of the view to be generated. This should + be the path alias of the view script (e.g. 'application.views.site.contact'). + + * scenario: optional, the name of the scenario in which the model is used + (e.g. 'update', 'login'). This determines which model attributes the + generated form view will be used to collect user inputs for. If this + is not provided, the scenario will be assumed to be '' (empty string). + +EXAMPLES + * Generates the view script for the 'ContactForm' model: + form ContactForm application.views.site.contact + +EOD; + } + + /** + * Execute the action. + * @param array command line parameters specific for this command + */ + public function run($args) + { + if(!isset($args[0],$args[1])) + { + echo "Error: both model class and view name are required.\n"; + echo $this->getHelp(); + return; + } + $scenario=isset($args[2]) ? $args[2] : ''; + $modelClass=Yii::import($args[0],true); + $model=new $modelClass($scenario); + $attributes=$model->getSafeAttributeNames(); + + $templatePath=$this->templatePath===null?YII_PATH.'/cli/views/shell/form':$this->templatePath; + $viewPath=Yii::getPathOfAlias($args[1]); + $viewName=basename($viewPath); + $viewPath.='.php'; + $params=array( + 'modelClass'=>$modelClass, + 'viewName'=>$viewName, + 'attributes'=>$attributes, + ); + $list=array( + basename($viewPath)=>array( + 'source'=>$templatePath.'/form.php', + 'target'=>$viewPath, + 'callback'=>array($this,'generateForm'), + 'params'=>$params, + ), + ); + + $this->copyFiles($list); + + $actionFile=$templatePath.'/action.php'; + if(!is_file($actionFile)) // fall back to default ones + $actionFile=YII_PATH.'/cli/views/shell/form/action.php'; + + echo "The following form view has been successfully created:\n"; + echo "\t$viewPath\n\n"; + echo "You may use the following code in your controller action:\n\n"; + echo $this->renderFile($actionFile,$params,true); + echo "\n"; + } + + public function generateForm($source,$params) + { + if(!is_file($source)) // fall back to default ones + $source=YII_PATH.'/cli/views/shell/form/'.basename($source); + + return $this->renderFile($source,$params,true); + } + + public function class2id($className) + { + if(strrpos($className,'Form')===strlen($className)-4) + $className=substr($className,0,strlen($className)-4); + return trim(strtolower(str_replace('_','-',preg_replace('/(?<![A-Z])[A-Z]/', '-\0', $className))),'-'); + } +}
\ No newline at end of file |
