summaryrefslogtreecommitdiff
path: root/framework/gii/generators/crud/CrudCode.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/gii/generators/crud/CrudCode.php')
-rw-r--r--framework/gii/generators/crud/CrudCode.php248
1 files changed, 248 insertions, 0 deletions
diff --git a/framework/gii/generators/crud/CrudCode.php b/framework/gii/generators/crud/CrudCode.php
new file mode 100644
index 0000000..b08eb6d
--- /dev/null
+++ b/framework/gii/generators/crud/CrudCode.php
@@ -0,0 +1,248 @@
+<?php
+
+class CrudCode extends CCodeModel
+{
+ public $model;
+ public $controller;
+ public $baseControllerClass='Controller';
+
+ private $_modelClass;
+ private $_table;
+
+ public function rules()
+ {
+ return array_merge(parent::rules(), array(
+ array('model, controller', 'filter', 'filter'=>'trim'),
+ array('model, controller, baseControllerClass', 'required'),
+ array('model', 'match', 'pattern'=>'/^\w+[\w+\\.]*$/', 'message'=>'{attribute} should only contain word characters and dots.'),
+ array('controller', 'match', 'pattern'=>'/^\w+[\w+\\/]*$/', 'message'=>'{attribute} should only contain word characters and slashes.'),
+ array('baseControllerClass', 'match', 'pattern'=>'/^[a-zA-Z_]\w*$/', 'message'=>'{attribute} should only contain word characters.'),
+ array('baseControllerClass', 'validateReservedWord', 'skipOnError'=>true),
+ array('model', 'validateModel'),
+ array('baseControllerClass', 'sticky'),
+ ));
+ }
+
+ public function attributeLabels()
+ {
+ return array_merge(parent::attributeLabels(), array(
+ 'model'=>'Model Class',
+ 'controller'=>'Controller ID',
+ 'baseControllerClass'=>'Base Controller Class',
+ ));
+ }
+
+ public function requiredTemplates()
+ {
+ return array(
+ 'controller.php',
+ );
+ }
+
+ public function init()
+ {
+ if(Yii::app()->db===null)
+ throw new CHttpException(500,'An active "db" connection is required to run this generator.');
+ parent::init();
+ }
+
+ public function successMessage()
+ {
+ $link=CHtml::link('try it now', Yii::app()->createUrl($this->controller), array('target'=>'_blank'));
+ return "The controller has been generated successfully. You may $link.";
+ }
+
+ public function validateModel($attribute,$params)
+ {
+ if($this->hasErrors('model'))
+ return;
+ $class=@Yii::import($this->model,true);
+ if(!is_string($class) || !$this->classExists($class))
+ $this->addError('model', "Class '{$this->model}' does not exist or has syntax error.");
+ else if(!is_subclass_of($class,'CActiveRecord'))
+ $this->addError('model', "'{$this->model}' must extend from CActiveRecord.");
+ else
+ {
+ $table=CActiveRecord::model($class)->tableSchema;
+ if($table->primaryKey===null)
+ $this->addError('model',"Table '{$table->name}' does not have a primary key.");
+ else if(is_array($table->primaryKey))
+ $this->addError('model',"Table '{$table->name}' has a composite primary key which is not supported by crud generator.");
+ else
+ {
+ $this->_modelClass=$class;
+ $this->_table=$table;
+ }
+ }
+ }
+
+ public function prepare()
+ {
+ $this->files=array();
+ $templatePath=$this->templatePath;
+ $controllerTemplateFile=$templatePath.DIRECTORY_SEPARATOR.'controller.php';
+
+ $this->files[]=new CCodeFile(
+ $this->controllerFile,
+ $this->render($controllerTemplateFile)
+ );
+
+ $files=scandir($templatePath);
+ foreach($files as $file)
+ {
+ if(is_file($templatePath.'/'.$file) && CFileHelper::getExtension($file)==='php' && $file!=='controller.php')
+ {
+ $this->files[]=new CCodeFile(
+ $this->viewPath.DIRECTORY_SEPARATOR.$file,
+ $this->render($templatePath.'/'.$file)
+ );
+ }
+ }
+ }
+
+ public function getModelClass()
+ {
+ return $this->_modelClass;
+ }
+
+ public function getControllerClass()
+ {
+ if(($pos=strrpos($this->controller,'/'))!==false)
+ return ucfirst(substr($this->controller,$pos+1)).'Controller';
+ else
+ return ucfirst($this->controller).'Controller';
+ }
+
+ public function getModule()
+ {
+ if(($pos=strpos($this->controller,'/'))!==false)
+ {
+ $id=substr($this->controller,0,$pos);
+ if(($module=Yii::app()->getModule($id))!==null)
+ return $module;
+ }
+ return Yii::app();
+ }
+
+ public function getControllerID()
+ {
+ if($this->getModule()!==Yii::app())
+ $id=substr($this->controller,strpos($this->controller,'/')+1);
+ else
+ $id=$this->controller;
+ if(($pos=strrpos($id,'/'))!==false)
+ $id[$pos+1]=strtolower($id[$pos+1]);
+ else
+ $id[0]=strtolower($id[0]);
+ return $id;
+ }
+
+ public function getUniqueControllerID()
+ {
+ $id=$this->controller;
+ if(($pos=strrpos($id,'/'))!==false)
+ $id[$pos+1]=strtolower($id[$pos+1]);
+ else
+ $id[0]=strtolower($id[0]);
+ return $id;
+ }
+
+ public function getControllerFile()
+ {
+ $module=$this->getModule();
+ $id=$this->getControllerID();
+ if(($pos=strrpos($id,'/'))!==false)
+ $id[$pos+1]=strtoupper($id[$pos+1]);
+ else
+ $id[0]=strtoupper($id[0]);
+ return $module->getControllerPath().'/'.$id.'Controller.php';
+ }
+
+ public function getViewPath()
+ {
+ return $this->getModule()->getViewPath().'/'.$this->getControllerID();
+ }
+
+ public function getTableSchema()
+ {
+ return $this->_table;
+ }
+
+ public function generateInputLabel($modelClass,$column)
+ {
+ return "CHtml::activeLabelEx(\$model,'{$column->name}')";
+ }
+
+ public function generateInputField($modelClass,$column)
+ {
+ if($column->type==='boolean')
+ return "CHtml::activeCheckBox(\$model,'{$column->name}')";
+ else if(stripos($column->dbType,'text')!==false)
+ return "CHtml::activeTextArea(\$model,'{$column->name}',array('rows'=>6, 'cols'=>50))";
+ else
+ {
+ if(preg_match('/^(password|pass|passwd|passcode)$/i',$column->name))
+ $inputField='activePasswordField';
+ else
+ $inputField='activeTextField';
+
+ if($column->type!=='string' || $column->size===null)
+ return "CHtml::{$inputField}(\$model,'{$column->name}')";
+ else
+ {
+ if(($size=$maxLength=$column->size)>60)
+ $size=60;
+ return "CHtml::{$inputField}(\$model,'{$column->name}',array('size'=>$size,'maxlength'=>$maxLength))";
+ }
+ }
+ }
+
+ public function generateActiveLabel($modelClass,$column)
+ {
+ return "\$form->labelEx(\$model,'{$column->name}')";
+ }
+
+ public function generateActiveField($modelClass,$column)
+ {
+ if($column->type==='boolean')
+ return "\$form->checkBox(\$model,'{$column->name}')";
+ else if(stripos($column->dbType,'text')!==false)
+ return "\$form->textArea(\$model,'{$column->name}',array('rows'=>6, 'cols'=>50))";
+ else
+ {
+ if(preg_match('/^(password|pass|passwd|passcode)$/i',$column->name))
+ $inputField='passwordField';
+ else
+ $inputField='textField';
+
+ if($column->type!=='string' || $column->size===null)
+ return "\$form->{$inputField}(\$model,'{$column->name}')";
+ else
+ {
+ if(($size=$maxLength=$column->size)>60)
+ $size=60;
+ return "\$form->{$inputField}(\$model,'{$column->name}',array('size'=>$size,'maxlength'=>$maxLength))";
+ }
+ }
+ }
+
+ public function guessNameColumn($columns)
+ {
+ foreach($columns as $column)
+ {
+ if(!strcasecmp($column->name,'name'))
+ return $column->name;
+ }
+ foreach($columns as $column)
+ {
+ if(!strcasecmp($column->name,'title'))
+ return $column->name;
+ }
+ foreach($columns as $column)
+ {
+ if($column->isPrimaryKey)
+ return $column->name;
+ }
+ return 'id';
+ }
+} \ No newline at end of file