CCodeModel
| Пакет | system.gii |
|---|---|
| Наследование | абстрактный класс CCodeModel » CFormModel » CModel » CComponent |
| Реализует | IteratorAggregate, Traversable, ArrayAccess |
| С | 1.1.2 |
| Исходный код | framework/gii/CCodeModel.php |
Каждый генератор кода должен иметь по крайней мере один класс модели кода, расширяющий этот класс. Цель модели кода — представить параметры, введённые пользователем, и использовать их для генерации настраиваемого кода.
Производные классы должны реализовать метод prepare, основная задача которого — заполнить свойство files на основе параметров пользователя.
Свойство files должно быть заполнено набором экземпляров CCodeFile, каждый из которых представляет собой один файл кода, который будет сгенерирован.
CCodeModel реализует функцию "прилипающих атрибутов". Прилипающий атрибут — это атрибут, который может запоминать своё последнее допустимое значение, даже если пользователь закрывает окно браузера и открывает его снова. Чтобы объявить атрибут как прилипающий, просто перечислите его в правиле проверки с именем валидатора "sticky".
Общественные свойства
| Свойство | Тип | Описание | Определено |
|---|---|---|---|
| answers | массив | подтверждения пользователя о том, следует ли перезаписать существующие файлы кода новыми сгенерированными. | CCodeModel |
| attributes | массив | Возвращает все значения атрибутов. | CModel |
| errors | массив | Возвращает ошибки для всех атрибутов или одного атрибута. | CModel |
| files | массив | список объектов CCodeFile, представляющих файлы кода, которые будут сгенерированы. | CCodeModel |
| iterator | CMapIterator | Возвращает итератор для обхода атрибутов в модели. | CModel |
| keywords | CCodeModel | ||
| safeAttributeNames | массив | Возвращает имена атрибутов, которые безопасно присваивать. | CModel |
| scenario | строка | Возвращает сценарий, в котором используется эта модель. | CModel |
| status | целое число | статус этой модели. | CCodeModel |
| stickyFile | строка | путь к файлу, хранящему значения прилипающих атрибутов. | CCodeModel |
| template | строка | имя шаблона кода, выбранного пользователем. | CCodeModel |
| templatePath | строка | каталог, содержащий файлы шаблонов. | CCodeModel |
| templates | массив | Возвращает список доступных шаблонов кода (имя=>каталог). | CCodeModel |
| validatorList | CList | Возвращает все валидаторы, объявленные в модели. | CModel |
| validators | массив | Возвращает валидаторы, применимые к текущему сценарию. | CModel |
Общественные методы
| Метод | Описание | Определено в |
|---|---|---|
| __call() | Вызывает метод с указанным именем, который не является методом класса. | CComponent |
| __construct() | Конструктор. | CFormModel |
| __get() | Возвращает значение свойства, список обработчиков событий или поведение по его имени. | CComponent |
| __isset() | Проверяет, является ли значение свойства нулевым. | CComponent |
| __set() | Устанавливает значение свойства компонента. | CComponent |
| __unset() | Устанавливает свойство компонента в значение null. | CComponent |
| addError() | Добавляет новую ошибку к указанному атрибуту. | CModel |
| addErrors() | Добавляет список ошибок. | CModel |
| asa() | Возвращает объект поведения с указанным именем. | CComponent |
| attachBehavior() | Прикрепляет поведение к этому компоненту. | CComponent |
| attachBehaviors() | Прикрепляет список поведений к компоненту. | CComponent |
| attachEventHandler() | Прикрепляет обработчик событий к событию. | CComponent |
| attributeLabels() | Объявляет метки атрибутов модели. | CCodeModel |
| attributeNames() | Возвращает список имён атрибутов. | CFormModel |
| behaviors() | Возвращает список поведений, которые должна иметь эта модель. | CModel |
| canGetProperty() | Определяет, можно ли прочитать свойство. | CComponent |
| canSetProperty() | Определяет, можно ли установить свойство. | CComponent |
| class2id() | Преобразует имя класса в HTML-идентификатор. | CCodeModel |
| class2name() | Преобразует имя класса в слова, разделённые пробелами. | CCodeModel |
| class2var() | Преобразует имя класса в имя переменной с первой буквой в нижнем регистре. | CCodeModel |
| classExists() | Проверяет, существует ли класс с указанным именем (чувствительный к регистру). | CCodeModel |
| clearErrors() | Удаляет ошибки для всех атрибутов или одного атрибута. | CModel |
| confirmed() | CCodeModel | |
| createValidators() | Создаёт объекты валидаторов на основе спецификации в rules. | CModel |
| detachBehavior() | Отсоединяет поведение от компонента. | CComponent |
| detachBehaviors() | Отсоединяет все поведения от компонента. | CComponent |
| detachEventHandler() | Отсоединяет существующий обработчик событий. | CComponent |
| disableBehavior() | Отключает присоединённое поведение. | CComponent |
| disableBehaviors() | Отключает все присоединённые поведения к этому компоненту. | CComponent |
| enableBehavior() | Включает присоединённое поведение. | CComponent |
| enableBehaviors() | Включает все присоединённые поведения к этому компоненту. | CComponent |
| errorMessage() | Возвращает сообщение, которое должно отображаться при возникновении ошибки во время сохранения файла кода. | CCodeModel |
| evaluateExpression() | Вычисляет PHP выражение или обратный вызов в контексте этого компонента. | CComponent |
| generateAttributeLabel() | Генерирует удобочитаемую метку атрибута. | CModel |
| getAttributeLabel() | Возвращает текстовую метку для указанного атрибута. | CModel |
| getAttributes() | Возвращает все значения атрибутов. | CModel |
| getError() | Возвращает первую ошибку указанного атрибута. | CModel |
| getErrors() | Возвращает ошибки для всех атрибутов или одного атрибута. | CModel |
| getEventHandlers() | Возвращает список прикреплённых обработчиков событий для события. | CComponent |
| getIterator() | Возвращает итератор для обхода атрибутов в модели. | CModel |
| getSafeAttributeNames() | Возвращает имена атрибутов, которые безопасны для массового присваивания. | CModel |
| getScenario() | Возвращает сценарий, в котором используется эта модель. | CModel |
| getStickyFile() | Возвращает путь к файлу, в котором хранятся значения «липких» атрибутов. | CCodeModel |
| getTemplatePath() | Возвращает директорию, содержащую шаблоны файлов. | CCodeModel |
| getTemplates() | Возвращает список доступных шаблонов кода (имя=>директория). | CCodeModel |
| getValidatorList() | Возвращает все объявленные в модели валидаторы. | CModel |
| getValidators() | Возвращает валидаторы, применимые к текущему сценарию. | CModel |
| hasErrors() | Возвращает значение, указывающее, есть ли ошибка валидации. | CModel |
| hasEvent() | Определяет, определено ли событие. | CComponent |
| hasEventHandler() | Проверяет, есть ли присоединённые обработчики для указанного события. | CComponent |
| hasProperty() | Определяет, определено ли свойство. | CComponent |
| init() | Инициализирует эту модель. | CFormModel |
| isAttributeRequired() | Возвращает значение, указывающее, является ли атрибут обязательным. | CModel |
| isAttributeSafe() | Возвращает значение, указывающее, является ли атрибут безопасным для массового присваивания. | CModel |
| loadStickyAttributes() | Загружает «липкие» атрибуты из файла и заполняет ими модель. | CCodeModel |
| offsetExists() | Возвращает, существует ли элемент по указанному смещению. | CModel |
| offsetGet() | Возвращает элемент по указанному смещению. | CModel |
| offsetSet() | Устанавливает элемент по указанному смещению. | CModel |
| offsetUnset() | Удаляет элемент по указанному смещению. | CModel |
| onAfterConstruct() | Это событие срабатывает после создания экземпляра модели оператором new. | CModel |
| onAfterValidate() | Это событие срабатывает после выполнения валидации. | CModel |
| onBeforeValidate() | Это событие срабатывает перед выполнением валидации. | CModel |
| onUnsafeAttribute() | Этот метод вызывается, когда происходит массовое присваивание небезопасных атрибутов. | CModel |
| pluralize() | Преобразует слово в его множественную форму. | CCodeModel |
| prepare() | Подготавливает файлы кода для генерации. | CCodeModel |
| raiseEvent() | Вызывает событие. | CComponent |
| render() | Генерирует код, используя указанный шаблон файла кода. | CCodeModel |
| renderResults() | CCodeModel | |
| requiredTemplates() | Возвращает список необходимых шаблонов кода. | CCodeModel |
| rules() | Определяет правила валидации модели. | CCodeModel |
| save() | Сохраняет сгенерированный код в файлы. | CCodeModel |
| saveStickyAttributes() | Сохраняет атрибуты «sticky» в файл. | CCodeModel |
| setAttributes() | Устанавливает значения атрибутов массовым способом. | CModel |
| setScenario() | Устанавливает сценарий для модели. | CModel |
| sticky() | Валидатор «sticky». | CCodeModel |
| successMessage() | Возвращает сообщение, отображаемое при успешном сохранении сгенерированного кода. | CCodeModel |
| unsetAttributes() | Устанавливает атрибуты в null. | CModel |
| validate() | Выполняет валидацию. | CModel |
| validateReservedWord() | Проверяет атрибут на наличие PHP зарезервированного ключевого слова. | CCodeModel |
| validateTemplate() | Проверяет выбор шаблона. | CCodeModel |
Защищенные методы
| Метод | Описание | Определен в |
|---|---|---|
| afterConstruct() | Этот метод вызывается после создания экземпляра модели оператором new. | CModel |
| afterValidate() | Этот метод вызывается после завершения валидации. | CModel |
| beforeValidate() | Этот метод вызывается перед началом валидации. | CModel |
События
| Событие | Описание | Определен в |
|---|---|---|
| onAfterConstruct | Это событие срабатывает после создания экземпляра модели оператором new. | CModel |
| onBeforeValidate | Это событие срабатывает перед выполнением валидации. | CModel |
| onAfterValidate | Это событие срабатывает после выполнения валидации. | CModel |
| onUnsafeAttribute | Этот метод вызывается, когда происходит массовое присваивание небезопасных атрибутов. | CModel |
Подробное описание свойств
answers свойство
public array $answers;
подтверждения пользователя о том, следует ли перезаписывать существующие файлы кода новыми сгенерированными. Значение этого свойства управляется внутренне этим классом и CCodeGenerator.
files свойство
public array $files;
список объектов CCodeFile, представляющих файлы кода для генерации. Метод prepare() отвечает за заполнение этого свойства.
keywords свойство
public static $keywords;
status свойство
public integer $status;
состояние этой модели. Значение этого свойства управляется внутренне CCodeGenerator.
stickyFile свойство только для чтения
public string getStickyFile()
путь к файлу, хранящему значения атрибутов «sticky».
template свойство
public string $template;
имя шаблона кода, выбранного пользователем. Значение этого свойства управляется внутренне этим классом и CCodeGenerator.
templatePath свойство только для чтения
public string getTemplatePath()
каталог, содержащий файлы шаблонов.
templates свойство только для чтения
public array getTemplates()
Возвращает список доступных шаблонов кода (имя=>каталог). Этот метод просто возвращает значение свойства CCodeGenerator::templates.
Подробное описание методов
attributeLabels() метод
public array attributeLabels() | ||
| {return} | массив | метки атрибутов |
public function attributeLabels()
{
return array(
'template'=>'Code Template',
);
}
Определяет метки атрибутов модели. Дочерние классы должны переопределять этот метод в следующем формате:
return array_merge(parent::attributeLabels(), array(
...labels for the child class attributes...
));
class2id() метод
public string class2id(string $name) | ||
| $name | строка | строка для преобразования |
| {return} | строка | результирующий идентификатор |
public function class2id($name)
{
return trim(strtolower(str_replace('_','-',preg_replace('/(?<![A-Z])[A-Z]/', '-\0', $name))),'-');
}
Преобразует имя класса в HTML-идентификатор. Например, «PostTag» будет преобразовано как «post-tag».
class2name() метод
public string class2name(string $name, boolean $ucwords=true) | ||
| $name | строка | строка для преобразования |
| $ucwords | логическое значение | преобразовывать ли первую букву каждого слова в верхний регистр |
| {return} | строка | результирующие слова |
public function class2name($name,$ucwords=true)
{
$result=trim(strtolower(str_replace('_',' ',preg_replace('/(?<![A-Z])[A-Z]/', ' \0', $name))));
return $ucwords ? ucwords($result) : $result;
}
Преобразует имя класса в слова, разделенные пробелами. Например, «PostTag» будет преобразовано как «Post Tag».
class2var() метод (доступен начиная с версии 1.1.4)
public string class2var(string $name) | ||
| $name | string | имя класса |
| {return} | string | имя переменной, преобразованное из имени класса |
public function class2var($name)
{
$name[0]=strtolower($name[0]);
return $name;
}
Преобразует имя класса в имя переменной, с первой буквой в нижнем регистре. Этот метод предоставляется, поскольку функция lcfirst() PHP доступна только для PHP 5.3+.
classExists() метод
public boolean classExists(string $name) | ||
| $name | string | имя класса для проверки |
| {return} | boolean | существует ли класс |
public function classExists($name)
{
return class_exists($name,false) && in_array($name, get_declared_classes());
}
Проверяет, существует ли класс с указанным именем (с учетом регистра).
confirmed() метод
public bool confirmed(CCodeFile $file) | ||
| $file | CCodeFile | файл кода должен быть сохранён |
| {return} | bool | найдена ли информация о подтверждении в answers с соответствующей операцией |
public function confirmed($file)
{
return $this->answers===null && $file->operation===CCodeFile::OP_NEW
|| is_array($this->answers) && isset($this->answers[md5($file->path)]);
}
errorMessage() метод
public string errorMessage() | ||
| {return} | string | сообщение, отображаемое при возникновении ошибки во время сохранения файла кода. |
public function errorMessage()
{
return 'There was some error when generating the code. Please check the following messages.';
}
Возвращает сообщение, отображаемое при возникновении ошибки во время сохранения файла кода. Дочерние классы должны переопределить этот метод, если необходимо настроить сообщение.
getStickyFile() метод
public string getStickyFile() | ||
| {return} | string | путь к файлу, хранящему значения атрибутов sticky. |
public function getStickyFile()
{
return Yii::app()->runtimePath.'/gii-'.Yii::getVersion().'/'.get_class($this).'.php';
}
getTemplatePath() метод
public string getTemplatePath() | ||
| {return} | string | директория, содержащая файлы шаблонов. |
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.');
}
getTemplates() метод
public array getTemplates() | ||
| {return} | array | список доступных шаблонов кода (имя=>директория). |
public function getTemplates()
{
return Yii::app()->controller->templates;
}
Возвращает список доступных шаблонов кода (имя=>директория). Этот метод просто возвращает значение свойства CCodeGenerator::templates.
loadStickyAttributes() метод
public void loadStickyAttributes() |
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;
}
}
}
}
Загружает атрибуты sticky из файла и заполняет ими модель.
pluralize() метод
public string pluralize(string $name) | ||
| $name | string | слово, которое нужно привести к множественному числу |
| {return} | string | слово во множественном числе |
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';
}
Преобразует слово в его форму множественного числа. Обратите внимание, что это только для английского языка! Например, 'яблоко' станет 'яблоки', а 'ребёнок' станет 'дети'.
prepare() метод
abstract public void prepare() |
Подготавливает файлы кода для генерации. Это основной метод, который должны реализовывать дочерние классы. Он должен содержать логику, которая заполняет свойство files списком файлов кода, которые будут сгенерированы.
render() метод
public string render(string $templateFile, array $_params_=NULL) | ||
| $templateFile | string | путь к файлу шаблона кода |
| $_params_ | array | набор параметров, которые будут извлечены и сделаны доступными в шаблоне кода |
| {return} | string | сгенерированный код |
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();
}
Генерирует код, используя указанный файл шаблона кода. Этот метод в основном используется в generate для генерации кода.
renderResults() метод
public string renderResults() | ||
| {return} | string | журнал результатов генерации кода. |
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;
}
requiredTemplates() метод
public array requiredTemplates() | ||
| {return} | array | список необходимых шаблонов кода. Они должны быть путями к файлам, относительными к templatePath. |
public function requiredTemplates()
{
return array();
}
Возвращает список необходимых шаблонов кода. Производные классы обычно должны переопределить этот метод.
rules() метод
public array rules() | ||
| {return} | array | правила валидации |
public function rules()
{
return array(
array('template', 'required'),
array('template', 'validateTemplate', 'skipOnError'=>true),
array('template', 'sticky'),
);
}
Объявляет правила валидации модели. Дочерние классы должны переопределить этот метод в следующем формате:
return array_merge(parent::rules(), array(
...rules for the child class...
));
save() метод
public void save() |
public function save()
{
$result=true;
foreach($this->files as $file)
{
if($this->confirmed($file))
$result=$file->save() && $result;
}
return $result;
}
Сохраняет сгенерированный код в файлы.
saveStickyAttributes() метод
public void saveStickyAttributes() |
public function saveStickyAttributes()
{
$path=$this->getStickyFile();
@mkdir(dirname($path),0755,true);
file_put_contents($path,"<?php\nreturn ".var_export($this->_stickyAttributes,true).";\n");
}
Сохраняет атрибуты sticky в файл.
sticky() метод
public void sticky(string $attribute, array $params) | ||
| $attribute | строка | атрибут, подлежащий проверке |
| $params | массив | параметры проверки |
public function sticky($attribute,$params)
{
if(!$this->hasErrors())
$this->_stickyAttributes[$attribute]=$this->$attribute;
}
Валидатор «sticky». Этот валидатор фактически не проверяет атрибуты. Он сохраняет значение атрибута в файле, чтобы оно оставалось «прилипшим».
successMessage() метод
public string successMessage() | ||
| {return} | строка | сообщение, отображаемое при успешном сохранении сгенерированного кода. |
public function successMessage()
{
return 'The code has been generated successfully.';
}
Возвращает сообщение, отображаемое при успешном сохранении сгенерированного кода. Дочерние классы должны переопределять этот метод, если требуется настройка сообщения.
validateReservedWord() метод
public void validateReservedWord(string $attribute, array $params) | ||
| $attribute | строка | атрибут, подлежащий проверке |
| $params | массив | параметры проверки |
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.');
}
Проверяет атрибут, чтобы убедиться, что он не является зарезервированным ключевым словом PHP.
validateTemplate() метод
public void validateTemplate(string $attribute, array $params) | ||
| $attribute | строка | атрибут, подлежащий проверке |
| $params | массив | параметры проверки |
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'.");
}
}
}
Проверяет выбор шаблона. Этот метод проверяет, выбрал ли пользователь существующий шаблон и содержит ли шаблон все необходимые файлы шаблона, как указано в requiredTemplates.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CCodeModel