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