Используйте проверку правила Yii для изменения имени атрибута, если значение атрибута формы пусто

У меня есть модель, которая расширяет Yii CFormModel и я хотел бы определить правило проверки который проверяет, является ли значение атрибута пустым, и, если это так, устанавливает имя атрибута в пустую строку вместо изменения входного значения.

Возможен ли такой сценарий или правила валидации предназначены только для предупреждений и / или изменений входных значений?

Любая помощь приветствуется.

Ниже приведен пример кода моей модели:

class LoginForm extends CFormModel
{
public $firstName;
public $lastName;

public function rules()
{
return array(
array('firstName, lastName', 'checkIfEmpty', 'changeAttributeName'),
);
}
// some functions
}

1

Решение

Не уверен, что ваш вариант использования очень элегантный, но должно работать следующее:

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);
}
}
}
}

}
2

Другие решения

CModel имеет beforeValidate () метод. Вызов этого метода перед автоматической проверкой модели yii. Вы должны переопределить это в вашей модели LoginForm:

protected function beforeValidate()
{
if(parent::beforeValidate())
{

if($this->firstname == null)
$this->firstname = "Some String";
return true;
}
else
return false;
}
1

Вы можете использовать набор правил по умолчанию.

public function rules()
{
return array(
array('firstName', 'default', 'value'=>Yii::app()->getUser()->getName()),
);
}

Обратите внимание, что это будет выполняться во время проверки, обычно после отправки формы. Он не будет заполнять значение формы значением по умолчанию. Вы можете использовать метод afterFind () для этого.

0
По вопросам рекламы [email protected]