1

我有一个扩展Yii CFormModel的模型,我想定义一个验证规则来检查属性值是否为空,并且 - 如果是这种情况 - 将属性名称设置为空字符串,而不是更改输入值。

这种情况是否可能,或者验证规则是否仅用于警告和/或输入值的更改?

任何帮助将非常感激。

下面是我的模型的示例代码:

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

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

3 回答 3

2

不确定您的用例是否非常优雅,但以下应该可以工作:

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
}

根据 hamed 的回复,另一种方法是使用该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);
                }
            }
        }
    }

}
于 2015-03-05T13:37:03.400 回答
1

CModel 有beforeValidate()方法。此方法在 yii 自动模型验证之前调用。您应该在 LoginForm 模型中覆盖它:

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

            if($this->firstname == null)
               $this->firstname = "Some String";
            return true;
        }
        else
            return false;
    }
于 2015-03-05T13:43:05.373 回答
0

您可以使用默认规则集。

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

请注意,这将在验证时运行,通常是在提交表单之后。它不会使用默认值填充表单值。您可以使用 afterFind() 方法来做到这一点。

于 2015-03-07T11:44:06.550 回答