Yii2:条件验证器始终返回所需

时间:2015-02-27 02:13:02

标签: php validation yii2

我正在尝试使用指南中给出的Yii2条件验证器,如:

型号代码

public function rules()
{
   // $discharged = function($model) { return $this->discharged == 1; };
    return [
        [[ 'admission_date','discharge_date', 'doctor_appointment_date', 'operation_date'], 'safe'],
        [[ 'package','tpa_name', 'discharged', 'bed_type', 'room_category', 'ref_doctor', 'consultant_doctor', 'operation_name'], 'integer'],
        [['advance_amount', 'operation_charges'], 'number'],
        [['patient_name', 'ref_doctor_other'], 'string', 'max' => 50],
        [['general_regn_no', 'ipd_patient_id'], 'string', 'max' => 20],
        [['admission_date', 'discharge_date', 'doctor_appointment_date', 'operation_date'],'default','value'=>null],
        ['ipd_patient_id', 'unique'],

        [['bed_type','admission_date','room_category'],'required'],

        ['discharge_date', 'required', 'when' => function($model) {
            return $model->discharged == 1;
        }],


    ];
}

和我的控制器一样:

public function actionCreate()
    {
        $model = new PatientDetail();     

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

但是,无论我选择是否作为复选框字段的放电字段,放电日期alwasys都会根据需要返回。

我在这里做错了什么?

5 个答案:

答案 0 :(得分:28)

默认情况下,Yii2似乎会在 BOTH 服务器端和客户端进行验证。查看Yii2 docConditional Validation部分中的示例:

['state', 'required', 'when' => function ($model) {
    return $model->country == 'USA';
}, 'whenClient' => "function (attribute, value) {
    return $('#country').val() == 'USA';
}"],

您还需要一个'whenClient'代码,或者@Alexandr Bordun说,要'enableClientValidation' => false禁用客户端验证。

答案 1 :(得分:13)

尝试添加 enableClientValidation 参数,如下所示:

 ['discharge_date', 'required', 'when' => function($model) {
        return $model->discharged == 1;
 }, 'enableClientValidation' => false]

答案 2 :(得分:4)

['package_id_fk', 'required', 'when' => function($model) {return $model->type == 'PACKAGE';}, 'enableClientValidation' => false],

它对我有用。

答案 3 :(得分:2)

这仅适用于我使用型号名称(客户端验证)。



['state', 'required', 'when' => function ($model) {
  return $model->country == 'USA';
}, 'whenClient' => "function (attribute, value) {
  return $('#MODELNAMEHERE-country').val() == 'USA';
}"]




答案 4 :(得分:1)

我有类似的要求我使用以下代码解决了它

['discharge_date', 'required', 'whenClient' => function($model) {
        return $model->discharged == 1;
 }, 'enableClientValidation' => false]