Используйте проверку правила Yii для изменения имени атрибута, если значение атрибута формы пусто
У меня есть модель, которая расширяет модель Yii CFormModel, и я хотел бы определить правило проверки, которое проверяет, является ли значение атрибута пустым, и - если это так - устанавливает имя атрибута в пустую строку вместо изменения входного значения.
Возможен ли такой сценарий или правила валидации предназначены только для предупреждений и / или изменений входных значений?
Любая помощь приветствуется.
Ниже приведен пример кода моей модели:
class LoginForm extends CFormModel
{
public $firstName;
public $lastName;
public function rules()
{
return array(
array('firstName, lastName', 'checkIfEmpty', 'changeAttributeName'),
);
}
// some functions
}
3 ответа
Не уверен, что ваш вариант использования очень элегантный, но должно работать следующее:
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() для этого.