Используйте проверку правила 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() для этого.

Другие вопросы по тегам