summaryrefslogtreecommitdiff
path: root/framework/cli/commands/shell/ControllerCommand.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/cli/commands/shell/ControllerCommand.php')
-rw-r--r--framework/cli/commands/shell/ControllerCommand.php176
1 files changed, 176 insertions, 0 deletions
diff --git a/framework/cli/commands/shell/ControllerCommand.php b/framework/cli/commands/shell/ControllerCommand.php
new file mode 100644
index 0000000..f7447b6
--- /dev/null
+++ b/framework/cli/commands/shell/ControllerCommand.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * ControllerCommand class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ * @version $Id: ControllerCommand.php 2799 2011-01-01 19:31:13Z qiang.xue $
+ */
+
+/**
+ * ControllerCommand generates a controller class.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id: ControllerCommand.php 2799 2011-01-01 19:31:13Z qiang.xue $
+ * @package system.cli.commands.shell
+ * @since 1.0
+ */
+class ControllerCommand extends CConsoleCommand
+{
+ /**
+ * @var string the directory that contains templates for the model command.
+ * Defaults to null, meaning using 'framework/cli/views/shell/controller'.
+ * 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
+ controller <controller-ID> [action-ID] ...
+
+DESCRIPTION
+ This command generates a controller and views associated with
+ the specified actions.
+
+PARAMETERS
+ * controller-ID: required, controller ID, e.g., 'post'.
+ If the controller should be located under a subdirectory,
+ please specify the controller ID as 'path/to/ControllerID',
+ e.g., 'admin/user'.
+
+ If the controller belongs to a module, please specify
+ the controller ID as 'ModuleID/ControllerID' or
+ 'ModuleID/path/to/Controller' (assuming the controller is
+ under a subdirectory of that module).
+
+ * action-ID: optional, action ID. You may supply one or several
+ action IDs. A default 'index' action will always be generated.
+
+EXAMPLES
+ * Generates the 'post' controller:
+ controller post
+
+ * Generates the 'post' controller with additional actions 'contact'
+ and 'about':
+ controller post contact about
+
+ * Generates the 'post' controller which should be located under
+ the 'admin' subdirectory of the base controller path:
+ controller admin/post
+
+ * Generates the 'post' controller which should belong to
+ the 'admin' module:
+ controller admin/post
+
+NOTE: in the last two examples, the commands are the same, but
+the generated controller file is located under different directories.
+Yii is able to detect whether 'admin' refers to a module or a subdirectory.
+
+EOD;
+ }
+
+ /**
+ * Execute the action.
+ * @param array command line parameters specific for this command
+ */
+ public function run($args)
+ {
+ if(!isset($args[0]))
+ {
+ echo "Error: controller name is required.\n";
+ echo $this->getHelp();
+ return;
+ }
+
+ $module=Yii::app();
+ $controllerID=$args[0];
+ if(($pos=strrpos($controllerID,'/'))===false)
+ {
+ $controllerClass=ucfirst($controllerID).'Controller';
+ $controllerFile=$module->controllerPath.DIRECTORY_SEPARATOR.$controllerClass.'.php';
+ $controllerID[0]=strtolower($controllerID[0]);
+ }
+ else
+ {
+ $last=substr($controllerID,$pos+1);
+ $last[0]=strtolower($last[0]);
+ $pos2=strpos($controllerID,'/');
+ $first=substr($controllerID,0,$pos2);
+ $middle=$pos===$pos2?'':substr($controllerID,$pos2+1,$pos-$pos2);
+
+ $controllerClass=ucfirst($last).'Controller';
+ $controllerFile=($middle===''?'':$middle.'/').$controllerClass.'.php';
+ $controllerID=$middle===''?$last:$middle.'/'.$last;
+ if(($m=Yii::app()->getModule($first))!==null)
+ $module=$m;
+ else
+ {
+ $controllerFile=$first.'/'.$controllerClass.'.php';
+ $controllerID=$first.'/'.$controllerID;
+ }
+
+ $controllerFile=$module->controllerPath.DIRECTORY_SEPARATOR.str_replace('/',DIRECTORY_SEPARATOR,$controllerFile);
+ }
+
+ $args[]='index';
+ $actions=array_unique(array_splice($args,1));
+
+ $templatePath=$this->templatePath===null?YII_PATH.'/cli/views/shell/controller':$this->templatePath;
+
+ $list=array(
+ basename($controllerFile)=>array(
+ 'source'=>$templatePath.DIRECTORY_SEPARATOR.'controller.php',
+ 'target'=>$controllerFile,
+ 'callback'=>array($this,'generateController'),
+ 'params'=>array($controllerClass, $actions),
+ ),
+ );
+
+ $viewPath=$module->viewPath.DIRECTORY_SEPARATOR.str_replace('/',DIRECTORY_SEPARATOR,$controllerID);
+ foreach($actions as $name)
+ {
+ $list[$name.'.php']=array(
+ 'source'=>$templatePath.DIRECTORY_SEPARATOR.'view.php',
+ 'target'=>$viewPath.DIRECTORY_SEPARATOR.$name.'.php',
+ 'callback'=>array($this,'generateAction'),
+ 'params'=>array('controller'=>$controllerClass, 'action'=>$name),
+ );
+ }
+
+ $this->copyFiles($list);
+
+ if($module instanceof CWebModule)
+ $moduleID=$module->id.'/';
+ else
+ $moduleID='';
+
+ echo <<<EOD
+
+Controller '{$controllerID}' has been created in the following file:
+ $controllerFile
+
+You may access it in the browser using the following URL:
+ http://hostname/path/to/index.php?r={$moduleID}{$controllerID}
+
+EOD;
+ }
+
+ public function generateController($source,$params)
+ {
+ if(!is_file($source)) // fall back to default ones
+ $source=YII_PATH.'/cli/views/shell/controller/'.basename($source);
+ return $this->renderFile($source,array('className'=>$params[0],'actions'=>$params[1]),true);
+ }
+
+ public function generateAction($source,$params)
+ {
+ if(!is_file($source)) // fall back to default ones
+ $source=YII_PATH.'/cli/views/shell/controller/'.basename($source);
+ return $this->renderFile($source,$params,true);
+ }
+} \ No newline at end of file