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.
		
		
		
		
			
				
					228 lines
				
				5.6 KiB
			
		
		
			
		
	
	
					228 lines
				
				5.6 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 = 'app\controllers';
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @var string list of action IDs separated by commas or spaces
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public $actions = 'index';
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function getName()
 | ||
|  | 	{
 | ||
|  | 		return 'Controller Generator';
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											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
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function rules()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		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.'],
 | ||
|  | 		]);
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											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
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											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
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function stickyAttributes()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return ['ns', 'baseClass'];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											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
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
| 
											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
										 | 	/**
 | ||
|  | 	 * @inheritdoc
 | ||
|  | 	 */
 | ||
|  | 	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
										 | }
 |