244 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * GiiModule 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/
 | |
|  */
 | |
| 
 | |
| Yii::import('system.gii.CCodeGenerator');
 | |
| Yii::import('system.gii.CCodeModel');
 | |
| Yii::import('system.gii.CCodeFile');
 | |
| Yii::import('system.gii.CCodeForm');
 | |
| 
 | |
| /**
 | |
|  * GiiModule is a module that provides Web-based code generation capabilities.
 | |
|  *
 | |
|  * To use GiiModule, you must include it as a module in the application configuration like the following:
 | |
|  * <pre>
 | |
|  * return array(
 | |
|  *     ......
 | |
|  *     'modules'=>array(
 | |
|  *         'gii'=>array(
 | |
|  *             'class'=>'system.gii.GiiModule',
 | |
|  *             'password'=>***choose a password***
 | |
|  *         ),
 | |
|  *     ),
 | |
|  * )
 | |
|  * </pre>
 | |
|  *
 | |
|  * Because GiiModule generates new code files on the server, you should only use it on your own
 | |
|  * development machine. To prevent other people from using this module, it is required that
 | |
|  * you specify a secret password in the configuration. Later when you access
 | |
|  * the module via browser, you will be prompted to enter the correct password.
 | |
|  *
 | |
|  * By default, GiiModule can only be accessed by localhost. You may configure its {@link ipFilters}
 | |
|  * property if you want to make it accessible on other machines.
 | |
|  *
 | |
|  * With the above configuration, you will be able to access GiiModule in your browser using
 | |
|  * the following URL:
 | |
|  *
 | |
|  * http://localhost/path/to/index.php?r=gii
 | |
|  *
 | |
|  * If your application is using path-format URLs with some customized URL rules, you may need to add
 | |
|  * the following URLs in your application configuration in order to access GiiModule:
 | |
|  * <pre>
 | |
|  * 'components'=>array(
 | |
|  *     'urlManager'=>array(
 | |
|  *         'urlFormat'=>'path',
 | |
|  *         'rules'=>array(
 | |
|  *             'gii'=>'gii',
 | |
|  *             'gii/<controller:\w+>'=>'gii/<controller>',
 | |
|  *             'gii/<controller:\w+>/<action:\w+>'=>'gii/<controller>/<action>',
 | |
|  *             ...other rules...
 | |
|  *         ),
 | |
|  *     )
 | |
|  * )
 | |
|  * </pre>
 | |
|  *
 | |
|  * You can then access GiiModule via:
 | |
|  *
 | |
|  * http://localhost/path/to/index.php/gii
 | |
|  *
 | |
|  * @property string $assetsUrl The base URL that contains all published asset files of gii.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @package system.gii
 | |
|  * @since 1.1.2
 | |
|  */
 | |
| class GiiModule extends CWebModule
 | |
| {
 | |
| 	/**
 | |
| 	 * @var string the password that can be used to access GiiModule.
 | |
| 	 * If this property is set false, then GiiModule can be accessed without password
 | |
| 	 * (DO NOT DO THIS UNLESS YOU KNOW THE CONSEQUENCE!!!)
 | |
| 	 */
 | |
| 	public $password;
 | |
| 	/**
 | |
| 	 * @var array the IP filters that specify which IP addresses are allowed to access GiiModule.
 | |
| 	 * Each array element represents a single filter. A filter can be either an IP address
 | |
| 	 * or an address with wildcard (e.g. 192.168.0.*) to represent a network segment.
 | |
| 	 * If you want to allow all IPs to access gii, you may set this property to be false
 | |
| 	 * (DO NOT DO THIS UNLESS YOU KNOW THE CONSEQUENCE!!!)
 | |
| 	 * The default value is array('127.0.0.1', '::1'), which means GiiModule can only be accessed
 | |
| 	 * on the localhost.
 | |
| 	 */
 | |
| 	public $ipFilters=array('127.0.0.1','::1');
 | |
| 	/**
 | |
| 	 * @var array a list of path aliases that refer to the directories containing code generators.
 | |
| 	 * The directory referred by a single path alias may contain multiple code generators, each stored
 | |
| 	 * under a sub-directory whose name is the generator name.
 | |
| 	 * Defaults to array('application.gii').
 | |
| 	 */
 | |
| 	public $generatorPaths=array('application.gii');
 | |
| 	/**
 | |
| 	 * @var integer the permission to be set for newly generated code files.
 | |
| 	 * This value will be used by PHP chmod function.
 | |
| 	 * Defaults to 0666, meaning the file is read-writable by all users.
 | |
| 	 */
 | |
| 	public $newFileMode=0666;
 | |
| 	/**
 | |
| 	 * @var integer the permission to be set for newly generated directories.
 | |
| 	 * This value will be used by PHP chmod function.
 | |
| 	 * Defaults to 0777, meaning the directory can be read, written and executed by all users.
 | |
| 	 */
 | |
| 	public $newDirMode=0777;
 | |
| 
 | |
| 	private $_assetsUrl;
 | |
| 
 | |
| 	/**
 | |
| 	 * Initializes the gii module.
 | |
| 	 */
 | |
| 	public function init()
 | |
| 	{
 | |
| 		parent::init();
 | |
| 		Yii::setPathOfAlias('gii',dirname(__FILE__));
 | |
| 		Yii::app()->setComponents(array(
 | |
| 			'errorHandler'=>array(
 | |
| 				'class'=>'CErrorHandler',
 | |
| 				'errorAction'=>$this->getId().'/default/error',
 | |
| 			),
 | |
| 			'user'=>array(
 | |
| 				'class'=>'CWebUser',
 | |
| 				'stateKeyPrefix'=>'gii',
 | |
| 				'loginUrl'=>Yii::app()->createUrl($this->getId().'/default/login'),
 | |
| 			),
 | |
| 			'widgetFactory' => array(
 | |
| 				'class'=>'CWidgetFactory',
 | |
| 				'widgets' => array()
 | |
| 			)
 | |
| 		), false);
 | |
| 		$this->generatorPaths[]='gii.generators';
 | |
| 		$this->controllerMap=$this->findGenerators();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return string the base URL that contains all published asset files of gii.
 | |
| 	 */
 | |
| 	public function getAssetsUrl()
 | |
| 	{
 | |
| 		if($this->_assetsUrl===null)
 | |
| 			$this->_assetsUrl=Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('gii.assets'));
 | |
| 		return $this->_assetsUrl;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param string $value the base URL that contains all published asset files of gii.
 | |
| 	 */
 | |
| 	public function setAssetsUrl($value)
 | |
| 	{
 | |
| 		$this->_assetsUrl=$value;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Performs access check to gii.
 | |
| 	 * This method will check to see if user IP and password are correct if they attempt
 | |
| 	 * to access actions other than "default/login" and "default/error".
 | |
| 	 * @param CController $controller the controller to be accessed.
 | |
| 	 * @param CAction $action the action to be accessed.
 | |
| 	 * @throws CHttpException if access denied
 | |
| 	 * @return boolean whether the action should be executed.
 | |
| 	 */
 | |
| 	public function beforeControllerAction($controller, $action)
 | |
| 	{
 | |
| 		if(parent::beforeControllerAction($controller, $action))
 | |
| 		{
 | |
| 			$route=$controller->id.'/'.$action->id;
 | |
| 			if(!$this->allowIp(Yii::app()->request->userHostAddress) && $route!=='default/error')
 | |
| 				throw new CHttpException(403,"You are not allowed to access this page.");
 | |
| 
 | |
| 			$publicPages=array(
 | |
| 				'default/login',
 | |
| 				'default/error',
 | |
| 			);
 | |
| 			if($this->password!==false && Yii::app()->user->isGuest && !in_array($route,$publicPages))
 | |
| 				Yii::app()->user->loginRequired();
 | |
| 			else
 | |
| 				return true;
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Checks to see if the user IP is allowed by {@link ipFilters}.
 | |
| 	 * @param string $ip the user IP
 | |
| 	 * @return boolean whether the user IP is allowed by {@link ipFilters}.
 | |
| 	 */
 | |
| 	protected function allowIp($ip)
 | |
| 	{
 | |
| 		if(empty($this->ipFilters))
 | |
| 			return true;
 | |
| 		foreach($this->ipFilters as $filter)
 | |
| 		{
 | |
| 			if($filter==='*' || $filter===$ip || (($pos=strpos($filter,'*'))!==false && !strncmp($ip,$filter,$pos)))
 | |
| 				return true;
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Finds all available code generators and their code templates.
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	protected function findGenerators()
 | |
| 	{
 | |
| 		$generators=array();
 | |
| 		$n=count($this->generatorPaths);
 | |
| 		for($i=$n-1;$i>=0;--$i)
 | |
| 		{
 | |
| 			$alias=$this->generatorPaths[$i];
 | |
| 			$path=Yii::getPathOfAlias($alias);
 | |
| 			if($path===false || !is_dir($path))
 | |
| 				continue;
 | |
| 
 | |
| 			$names=scandir($path);
 | |
| 			foreach($names as $name)
 | |
| 			{
 | |
| 				if($name[0]!=='.' && is_dir($path.'/'.$name))
 | |
| 				{
 | |
| 					$className=ucfirst($name).'Generator';
 | |
| 					if(is_file("$path/$name/$className.php"))
 | |
| 					{
 | |
| 						$generators[$name]=array(
 | |
| 							'class'=>"$alias.$name.$className",
 | |
| 						);
 | |
| 					}
 | |
| 
 | |
| 					if(isset($generators[$name]) && is_dir("$path/$name/templates"))
 | |
| 					{
 | |
| 						$templatePath="$path/$name/templates";
 | |
| 						$dirs=scandir($templatePath);
 | |
| 						foreach($dirs as $dir)
 | |
| 						{
 | |
| 							if($dir[0]!=='.' && is_dir($templatePath.'/'.$dir))
 | |
| 								$generators[$name]['templates'][$dir]=strtr($templatePath.'/'.$dir,array('/'=>DIRECTORY_SEPARATOR,'\\'=>DIRECTORY_SEPARATOR));
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		return $generators;
 | |
| 	}
 | |
| } |