Yii动态验证。还有另外一种方法吗?

时间:2013-02-13 15:24:55

标签: yii

我有一些模特。根据typeId的值,应该需要一些参数

typeId=1    Required:       param2  param3  param4  param5  param6  param7      param9  
typeId=2    Required:   param1      param3  param4  param5                  
typeId=3    Required:   param1      param3                  param8  param9  
typeId=4    Required:   param1      param3                          
typeId=5    Required:   param1                                  param10

所以我用这种方式解决了它:

public function rules()
{
    return array(
        array('typeId, param1, param2', 'numerical', 'integerOnly'=>true),
        array('param3, param4, param5, param6, param7, param8, param9', 'length', 'max'=>20),
        array('param10, param11', 'length', 'max'=>255),
        array('created, deleted', 'safe'),

        array('typeId', 'required', 'on'=>'insert, update'),
        array('typeId', 'exist', 'attributeName'=>'id', 'className'=>'Type', 'message'=>'Select {attribute}'),

        array('id, typeId, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, created, deleted', 'safe', 'on'=>'search'),            

        //dynamic rules

        array('param1', 'required', 'on'=>'type2, type3, type4, type5'),
        array('param1', 'exist', 'attributeName'=>'id', 'className'=>'Param1', 'message'=>'Select {attribute}', 'on'=>'type2, type3, type4, type5'),

        array('param2', 'required', 'on'=>'type1'),
        array('param2', 'exist', 'attributeName'=>'id', 'className'=>'Param2', 'message'=>'Select {attribute}', 'on'=>'type1'),
        array('param3', 'required', 'on'=>'type1, type2, type3, type4'),
        array('param4', 'required', 'on'=>'type1, type2'),
        array('param5', 'required', 'on'=>'type1, type2'),
        array('param6', 'required', 'on'=>'type1'),
        array('param7', 'required', 'on'=>'type1'),
        array('param8', 'required', 'on'=>'type3'),

        array('param9', 'required', 'on'=>'type1, type3'),
        array('param10', 'required', 'on'=>'type5'),
    );
}


public function validate($attributes=null, $clearErrors=true)
{
    if($clearErrors)
        $this->clearErrors();
    if($this->beforeValidate())
    {
        foreach($this->getValidators() as $validator)
            $validator->validate($this,$attributes);

        //validate dynamic rules
        if(!$this->hasErrors())
        {
            $scenario=$this->scenario;
            if($this->scenario=$this->getSubscenario($this->signalId))
            {
                foreach($this->getValidators() as $validator)
                    $validator->validate($this,$attributes);
            }
            $this->scenario=$scenario;
        }
        $this->afterValidate();
        return !$this->hasErrors();
    }
    else
        return false;
}

public function getSubscenario($typeId)
{
    switch($typeId)
    {
        case Signal::TYPE_1:
            return 'type1';
        case Signal::TYPE_2:
            return 'type2';
        case Signal::TYPE_3:
            return 'type3';
        case Signal::TYPE_4:
            return 'type4';
        case Signal::TYPE_5:
            return 'type5';
        default:
            return false;
    }
}    

还有其他办法吗?

0 个答案:

没有答案