У меня есть модель, которая расширяет Yii CFormModel и я хотел бы определить правило проверки который проверяет, является ли значение атрибута пустым, и, если это так, устанавливает имя атрибута в пустую строку вместо изменения входного значения.
Возможен ли такой сценарий или правила валидации предназначены только для предупреждений и / или изменений входных значений?
Любая помощь приветствуется.
Ниже приведен пример кода моей модели:
class LoginForm extends CFormModel
{
public $firstName;
public $lastName;
public function rules()
{
return array(
array('firstName, lastName', 'checkIfEmpty', 'changeAttributeName'),
);
}
// some functions
}
Не уверен, что ваш вариант использования очень элегантный, но должно работать следующее:
class LoginForm extends CFormModel
{
public $firstName;
public $lastName;
public function rules()
{
return array(
array('firstName, lastName', 'checkIfEmpty'),
);
}
public function checkIfEmpty($attribute, $params)
{
if(empty($this->$attribute)) {
unset($this->$attribute);
}
}
// some functions
}
Основываясь на ответе Хамеда, другим способом было бы использовать beforeValidate()
функция:
class LoginForm extends CFormModel
{
public $firstName;
public $lastName;
protected function beforeValidate()
{
if(parent::beforeValidate()) {
foreach(array('firstName, lastName') as $attribute) {
if(empty($this->$attribute)) {
unset($this->$attribute);
}
}
}
}
}
CModel имеет beforeValidate () метод. Вызов этого метода перед автоматической проверкой модели yii. Вы должны переопределить это в вашей модели LoginForm:
protected function beforeValidate()
{
if(parent::beforeValidate())
{
if($this->firstname == null)
$this->firstname = "Some String";
return true;
}
else
return false;
}
Вы можете использовать набор правил по умолчанию.
public function rules()
{
return array(
array('firstName', 'default', 'value'=>Yii::app()->getUser()->getName()),
);
}
Обратите внимание, что это будет выполняться во время проверки, обычно после отправки формы. Он не будет заполнять значение формы значением по умолчанию. Вы можете использовать метод afterFind () для этого.