123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- /**
- * FormCommand 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/
- */
- /**
- * FormCommand generates a form view based on a specified model.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @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 $args command line parameters specific for this command
- * @return integer|null non zero application exit code for help or null on success
- */
- 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 1;
- }
- $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))),'-');
- }
- }
|