CCodeModel
CCodeModel is the base class for model classes that are used to generate code.
Each code generator should have at least one code model class that extends from this class. The purpose of a code model is to represent user-supplied parameters and use them to generate customized code.
Derived classes should implement the
prepare method whose main task is to fill up the
files property based on the user parameters.
The
files property should be filled with a set of
CCodeFile instances, each representing a single code file to be generated.
CCodeModel implements the feature of "sticky attributes". A sticky attribute is an attribute that can remember its last valid value, even if the user closes his browser window and reopen it. To declare an attribute is sticky, simply list it in a validation rule with the validator name being "sticky".
Public Properties
Property |
Type |
Description |
Defined By |
answers | array | user confirmations on whether to overwrite existing code files with the newly generated ones. | CCodeModel |
attributes | array | Returns all attribute values. | CModel |
errors | array | Returns the errors for all attribute or a single attribute. | CModel |
files | array | a list of CCodeFile objects that represent the code files to be generated. | CCodeModel |
iterator | CMapIterator | Returns an iterator for traversing the attributes in the model. | CModel |
keywords | | | CCodeModel |
safeAttributeNames | array | Returns the attribute names that are safe to be massively assigned. | CModel |
scenario | string | Returns the scenario that this model is used in. | CModel |
status | integer | the status of this model. | CCodeModel |
stickyFile | string | the file path that stores the sticky attribute values. | CCodeModel |
template | string | the name of the code template that the user has selected. | CCodeModel |
templatePath | string | the directory that contains the template files. | CCodeModel |
templates | array | Returns a list of available code templates (name=>directory). | CCodeModel |
validatorList | CList | Returns all the validators declared in the model. | CModel |
validators | array | Returns the validators applicable to the current scenario. | CModel |
Property Details
public array $answers;
user confirmations on whether to overwrite existing code files with the newly generated ones. The value of this property is internally managed by this class and CCodeGenerator.
public array $files;
a list of CCodeFile objects that represent the code files to be generated. The prepare() method is responsible to populate this property.
public static $keywords;
public integer $status;
the status of this model. T The value of this property is internally managed by CCodeGenerator.
public string getStickyFile()
the file path that stores the sticky attribute values.
public string $template;
the name of the code template that the user has selected. The value of this property is internally managed by this class and CCodeGenerator.
public string getTemplatePath()
the directory that contains the template files.
public array getTemplates()
Returns a list of available code templates (name=>directory). This method simply returns the CCodeGenerator::templates property value.
Method Details
public array attributeLabels() |
{return} | array | the attribute labels |
Declares the model attribute labels. Child classes must override this method in the following format:
return array_merge(parent::attributeLabels(), array(
...labels for the child class attributes...
));
public string class2id(string $name) |
$name | string | the string to be converted |
{return} | string | the resulting ID |
Source Code: framework/gii/CCodeModel.php#442 (
show)
public function class2id($name)
{
return trim(strtolower(str_replace('_','-',preg_replace('/(?<![A-Z])[A-Z]/', '-\0', $name))),'-');
}
Converts a class name into a HTML ID. For example, 'PostTag' will be converted as 'post-tag'.
public string class2name(string $name, boolean $ucwords=true) |
$name | string | the string to be converted |
$ucwords | boolean | whether to capitalize the first letter in each word |
{return} | string | the resulting words |
Source Code: framework/gii/CCodeModel.php#454 (
show)
public function class2name($name,$ucwords=true)
{
$result=trim(strtolower(str_replace('_',' ',preg_replace('/(?<![A-Z])[A-Z]/', ' \0', $name))));
return $ucwords ? ucwords($result) : $result;
}
Converts a class name into space-separated words. For example, 'PostTag' will be converted as 'Post Tag'.
public string class2var(string $name) |
$name | string | the class name |
{return} | string | the variable name converted from the class name |
Converts a class name into a variable name with the first letter in lower case. This method is provided because lcfirst() PHP function is only available for PHP 5.3+.
public boolean classExists(string $name) |
$name | string | class name to be checked |
{return} | boolean | whether the class exists |
Checks if the named class exists (in a case sensitive manner).
public bool confirmed(CCodeFile $file) |
$file | CCodeFile | whether the code file should be saved |
{return} | bool | whether the confirmation is found in answers with appropriate operation |
Source Code: framework/gii/CCodeModel.php#296 (
show)
public function confirmed($file)
{
return $this->answers===null && $file->operation===CCodeFile::OP_NEW
|| is_array($this->answers) && isset($this->answers[md5($file->path)]);
}
public string errorMessage() |
{return} | string | the message to be displayed when some error occurred during code file saving. |
Returns the message to be displayed when some error occurred during code file saving. Child classes should override this method if the message needs to be customized.
public string getStickyFile() |
{return} | string | the file path that stores the sticky attribute values. |
public string getTemplatePath() |
{return} | string | the directory that contains the template files. |
Source Code: framework/gii/CCodeModel.php#280 (
show)
public function getTemplatePath()
{
$templates=$this->getTemplates();
if(isset($templates[$this->template]))
return $templates[$this->template];
elseif(empty($templates))
throw new CHttpException(500,'No templates are available.');
else
throw new CHttpException(500,'Invalid template selection.');
}
public array getTemplates() |
{return} | array | a list of available code templates (name=>directory). |
Returns a list of available code templates (name=>directory). This method simply returns the CCodeGenerator::templates property value.
public void loadStickyAttributes() |
Source Code: framework/gii/CCodeModel.php#362 (
show)
public function loadStickyAttributes()
{
$this->_stickyAttributes=array();
$path=$this->getStickyFile();
if(is_file($path))
{
$result=@include($path);
if(is_array($result))
{
$this->_stickyAttributes=$result;
foreach($this->_stickyAttributes as $name=>$value)
{
if(property_exists($this,$name) || $this->canSetProperty($name))
$this->$name=$value;
}
}
}
}
Loads sticky attributes from a file and populates them into the model.
public string pluralize(string $name) |
$name | string | the word to be pluralized |
{return} | string | the pluralized word |
Source Code: framework/gii/CCodeModel.php#406 (
show)
public function pluralize($name)
{
$rules=array(
'/(m)ove$/i' => '\1oves',
'/(f)oot$/i' => '\1eet',
'/(c)hild$/i' => '\1hildren',
'/(h)uman$/i' => '\1umans',
'/(m)an$/i' => '\1en',
'/(s)taff$/i' => '\1taff',
'/(t)ooth$/i' => '\1eeth',
'/(p)erson$/i' => '\1eople',
'/([m|l])ouse$/i' => '\1ice',
'/(x|ch|ss|sh|us|as|is|os)$/i' => '\1es',
'/([^aeiouy]|qu)y$/i' => '\1ies',
'/(?:([^f])fe|([lr])f)$/i' => '\1\2ves',
'/(shea|lea|loa|thie)f$/i' => '\1ves',
'/([ti])um$/i' => '\1a',
'/(tomat|potat|ech|her|vet)o$/i' => '\1oes',
'/(bu)s$/i' => '\1ses',
'/(ax|test)is$/i' => '\1es',
'/s$/' => 's',
);
foreach($rules as $rule=>$replacement)
{
if(preg_match($rule,$name))
return preg_replace($rule,$replacement,$name);
}
return $name.'s';
}
Converts a word to its plural form. Note that this is for English only! For example, 'apple' will become 'apples', and 'child' will become 'children'.
abstract public void prepare() |
Prepares the code files to be generated. This is the main method that child classes should implement. It should contain the logic that populates the files property with a list of code files to be generated.
public string render(string $templateFile, array $_params_=NULL) |
$templateFile | string | the code template file path |
$_params_ | array | a set of parameters to be extracted and made available in the code template |
{return} | string | the generated code |
Source Code: framework/gii/CCodeModel.php#310 (
show)
public function render($templateFile,$_params_=null)
{
if(!is_file($templateFile))
throw new CException("The template file '$templateFile' does not exist.");
if(is_array($_params_))
extract($_params_,EXTR_PREFIX_SAME,'params');
else
$params=$_params_;
ob_start();
ob_implicit_flush(false);
require($templateFile);
return ob_get_clean();
}
Generates the code using the specified code template file. This method is manly used in generate to generate code.
public string renderResults() |
{return} | string | the code generation result log. |
Source Code: framework/gii/CCodeModel.php#328 (
show)
public function renderResults()
{
$output='Generating code using template "'.$this->templatePath."\"...\n";
foreach($this->files as $file)
{
if($file->error!==null)
$output.="<span class=\"error\">generating {$file->relativePath}<br/> {$file->error}</span>\n";
elseif($file->operation===CCodeFile::OP_NEW && $this->confirmed($file))
$output.=' generated '.$file->relativePath."\n";
elseif($file->operation===CCodeFile::OP_OVERWRITE && $this->confirmed($file))
$output.=' overwrote '.$file->relativePath."\n";
else
$output.=' skipped '.$file->relativePath."\n";
}
$output.="done!\n";
return $output;
}
public array requiredTemplates() |
{return} | array | list of code templates that are required. They should be file paths relative to templatePath. |
Returns a list of code templates that are required. Derived classes usually should override this method.
public array rules() |
{return} | array | validation rules |
Source Code: framework/gii/CCodeModel.php#162 (
show)
public function rules()
{
return array(
array('template', 'required'),
array('template', 'validateTemplate', 'skipOnError'=>true),
array('template', 'sticky'),
);
}
Declares the model validation rules. Child classes must override this method in the following format:
return array_merge(parent::rules(), array(
...rules for the child class...
));
Source Code: framework/gii/CCodeModel.php#235 (
show)
public function save()
{
$result=true;
foreach($this->files as $file)
{
if($this->confirmed($file))
$result=$file->save() && $result;
}
return $result;
}
Saves the generated code into files.
public void saveStickyAttributes() |
Source Code: framework/gii/CCodeModel.php#384 (
show)
public function saveStickyAttributes()
{
$path=$this->getStickyFile();
@mkdir(dirname($path),0755,true);
file_put_contents($path,"<?php\nreturn ".var_export($this->_stickyAttributes,true).";\n");
}
Saves sticky attributes into a file.
public void sticky(string $attribute, array $params) |
$attribute | string | the attribute to be validated |
$params | array | the validation parameters |
The "sticky" validator. This validator does not really validate the attributes. It actually saves the attribute value in a file to make it sticky.
public string successMessage() |
{return} | string | the message to be displayed when the newly generated code is saved successfully. |
Returns the message to be displayed when the newly generated code is saved successfully. Child classes should override this method if the message needs to be customized.
public void validateReservedWord(string $attribute, array $params) |
$attribute | string | the attribute to be validated |
$params | array | validation parameters |
Source Code: framework/gii/CCodeModel.php#478 (
show)
public function validateReservedWord($attribute,$params)
{
$value=$this->$attribute;
if(in_array(strtolower($value),self::$keywords))
$this->addError($attribute, $this->getAttributeLabel($attribute).' cannot take a reserved PHP keyword.');
}
Validates an attribute to make sure it is not taking a PHP reserved keyword.
public void validateTemplate(string $attribute, array $params) |
$attribute | string | the attribute to be validated |
$params | array | validation parameters |
Source Code: framework/gii/CCodeModel.php#178 (
show)
public function validateTemplate($attribute,$params)
{
$templates=$this->templates;
if(!isset($templates[$this->template]))
$this->addError('template', 'Invalid template selection.');
else
{
$templatePath=$this->templatePath;
foreach($this->requiredTemplates() as $template)
{
if(!is_file($templatePath.'/'.$template))
$this->addError('template', "Unable to find the required code template file '$template'.");
}
}
}
Validates the template selection. This method validates whether the user selects an existing template and the template contains all required template files as specified in requiredTemplates.