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.
		
		
		
		
			
				
					237 lines
				
				5.8 KiB
			
		
		
			
		
	
	
					237 lines
				
				5.8 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\controller;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Yii;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								use yii\gii\CodeFile;
							 | 
						||
| 
								 | 
							
								use yii\helpers\Html;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								use yii\helpers\Inflector;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								 * This generator will generate a controller and one or a few action view files.
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @author Qiang Xue <qiang.xue@gmail.com>
							 | 
						||
| 
								 | 
							
								 * @since 2.0
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class Generator extends \yii\gii\Generator
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @var string the controller ID
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public $controller;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @var string the base class of the controller
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public $baseClass = 'yii\web\Controller';
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @var string the namespace of the controller class
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public $ns;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @var string list of action IDs separated by commas or spaces
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public $actions = 'index';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function init()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										parent::init();
							 | 
						||
| 
								 | 
							
										$this->ns = \Yii::$app->controllerNamespace;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getName()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										return 'Controller Generator';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getDescription()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										return 'This generator helps you to quickly generate a new controller class,
							 | 
						||
| 
								 | 
							
											one or several controller actions and their corresponding views.';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function rules()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return array_merge(parent::rules(), [
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											[['controller', 'actions', 'baseClass', 'ns'], 'filter', 'filter' => 'trim'],
							 | 
						||
| 
								 | 
							
											[['controller', 'baseClass'], 'required'],
							 | 
						||
| 
								 | 
							
											[['controller'], 'match', 'pattern' => '/^[a-z\\-\\/]*$/', 'message' => 'Only a-z, dashes (-) and slashes (/) are allowed.'],
							 | 
						||
| 
								 | 
							
											[['actions'], 'match', 'pattern' => '/^[a-z\\-,\\s]*$/', 'message' => 'Only a-z, dashes (-), spaces and commas are allowed.'],
							 | 
						||
| 
								 | 
							
											[['baseClass'], 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
							 | 
						||
| 
								 | 
							
											[['ns'], 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										]);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function attributeLabels()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return [
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'baseClass' => 'Base Class',
							 | 
						||
| 
								 | 
							
											'controller' => 'Controller ID',
							 | 
						||
| 
								 | 
							
											'actions' => 'Action IDs',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'ns' => 'Controller Namespace',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										];
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function requiredTemplates()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return [
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'controller.php',
							 | 
						||
| 
								 | 
							
											'view.php',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										];
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function stickyAttributes()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return ['ns', 'baseClass'];
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function hints()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return [
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'controller' => 'Controller ID should be in lower case and may contain module ID(s) separated by slashes. For example:
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
												<ul>
							 | 
						||
| 
								 | 
							
													<li><code>order</code> generates <code>OrderController.php</code></li>
							 | 
						||
| 
								 | 
							
													<li><code>order-item</code> generates <code>OrderItemController.php</code></li>
							 | 
						||
| 
								 | 
							
													<li><code>admin/user</code> generates <code>UserController.php</code> within the <code>admin</code> module.</li>
							 | 
						||
| 
								 | 
							
												</ul>',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'actions' => 'Provide one or multiple action IDs to generate empty action method(s) in the controller. Separate multiple action IDs with commas or spaces.
							 | 
						||
| 
								 | 
							
												Action IDs should be in lower case. For example:
							 | 
						||
| 
								 | 
							
												<ul>
							 | 
						||
| 
								 | 
							
													<li><code>index</code> generates <code>actionIndex()</code></li>
							 | 
						||
| 
								 | 
							
													<li><code>create-order</code> generates <code>actionCreateOrder()</code></li>
							 | 
						||
| 
								 | 
							
												</ul>',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'ns' => 'This is the namespace that the new controller class will use.',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											'baseClass' => 'This is the class that the new controller class will extend from. Please make sure the class exists and can be autoloaded.',
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										];
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function successMessage()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$actions = $this->getActionIDs();
							 | 
						||
| 
								 | 
							
										if (in_array('index', $actions)) {
							 | 
						||
| 
								 | 
							
											$route = $this->controller . '/index';
							 | 
						||
| 
								 | 
							
										} else {
							 | 
						||
| 
								 | 
							
											$route = $this->controller . '/' . reset($actions);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$link = Html::a('try it now', Yii::$app->getUrlManager()->createUrl($route), ['target' => '_blank']);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return "The controller has been generated successfully. You may $link.";
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 * @inheritdoc
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function generate()
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$files = [];
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$files[] = new CodeFile(
							 | 
						||
| 
								 | 
							
											$this->getControllerFile(),
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$this->render('controller.php')
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										foreach ($this->getActionIDs() as $action) {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$files[] = new CodeFile(
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
												$this->getViewFile($action),
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
												$this->render('view.php', ['action' => $action])
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
										return $files;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Normalizes [[actions]] into an array of action IDs.
							 | 
						||
| 
								 | 
							
									 * @return array an array of action IDs entered by the user
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getActionIDs()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$actions = array_unique(preg_split('/[\s,]+/', $this->actions, -1, PREG_SPLIT_NO_EMPTY));
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										sort($actions);
							 | 
						||
| 
								 | 
							
										return $actions;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @return string the controller class name without the namespace part.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getControllerClass()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return Inflector::id2camel($this->getControllerID()) . 'Controller';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @return string the controller ID (without the module ID prefix)
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getControllerID()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										if (($pos = strrpos($this->controller, '/')) !== false) {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											return substr($this->controller, $pos + 1);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										} else {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											return $this->controller;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @return \yii\base\Module the module that the new controller belongs to
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getModule()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										if (($pos = strrpos($this->controller, '/')) !== false) {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$id = substr($this->controller, 0, $pos);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											if (($module = Yii::$app->getModule($id)) !== null) {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
												return $module;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return Yii::$app;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @return string the controller class file path
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getControllerFile()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$module = $this->getModule();
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										return $module->getControllerPath() . '/' . $this->getControllerClass() . '.php';
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * @param string $action the action ID
							 | 
						||
| 
								 | 
							
									 * @return string the action view file path
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getViewFile($action)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$module = $this->getModule();
							 | 
						||
| 
								 | 
							
										return $module->getViewPath() . '/' . $this->getControllerID() . '/' . $action . '.php';
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									}
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								}
							 |