summaryrefslogtreecommitdiff
path: root/framework/gii/GiiModule.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/gii/GiiModule.php')
-rw-r--r--framework/gii/GiiModule.php239
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 &copy; 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