diff options
Diffstat (limited to 'framework/gii/GiiModule.php')
| -rw-r--r-- | framework/gii/GiiModule.php | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/framework/gii/GiiModule.php b/framework/gii/GiiModule.php new file mode 100644 index 0000000..ebe75c0 --- /dev/null +++ b/framework/gii/GiiModule.php @@ -0,0 +1,239 @@ +<?php +/** + * GiiModule class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 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> + * @version $Id: GiiModule.php 3426 2011-10-25 00:01:09Z alexander.makarow $ + * @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::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'), + ), + ), 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. + * @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; + } +}
\ No newline at end of file |
