yii2条件验证是不是在服务器端?

时间:2016-12-20 06:15:03

标签: validation yii yii2 yii2-advanced-app rule

我在表单中使用用户名字段,我设置如下规则。

['username', 'required','when' => function($model) {
            return $model->pin == true;
        }],

(即)当属性引脚变为真时那时我只需要用户名字段,所有在客户端都正常工作,但是在服务器端验证falis,我的代码出了什么问题。

更新:

控制器代码

public function actionTest()
{
    $model = new Test();
    if ($model->load(Yii::$app->request->post()) && $model->customValidation()) {
        if($model->validate())
        {
            //
        }
    } 
    return $this->render('testView', [
    'model' => $model,
    ]);
}

模型

public $username;
public $pin = false;
public function rules()
{
 return [
    ['username', 'required','message' => 'You must enter username','when'      => function($model) {
        return $model->pin == true;
    }],
];
}
public function customValidation()
{
if()
{
    $this->pin = true;
    return false;
}
else
{
    return true;
}
}

视图

if($model->pin)
{
<?= $form->field($model, 'username')->textInput(); ?>
}

1 个答案:

答案 0 :(得分:3)

您需要添加whenClient才能在客户端工作:

[
    'username', 'required', 
    'when' => function ($model) {
        return $model->pin == true;
    },
    'whenClient' => "function (attribute, value) {
        // JS condition here
    }"
],

其中JS条件取决于您获得的DOM结构。例如,如果pin属性的复选框标识为pin,则可以是:

'whenClient' => "function (attribute, value) {
    return $('#pin').is(':checked');
}"

更新:
如果您只是在模型中设置pin属性,则可以修改验证规则:

public function rules()
{
    $rules = [
        // other validation rules
    ];
    if ($this->pin) {
        $rules[] = ['username', 'required'];
    }
    return $rules;
}