Validation yii2自定义验证不起作用

Validation yii2自定义验证不起作用,validation,yii2,yii2-validation,Validation,Yii2,Yii2 Validation,我需要比较模型中的2个属性值,只有当第一个值低于第二个值时,表单才能验证。我尝试使用下面的代码,但它不起作用 控制器 模型 它将进入验证器函数,但不会像我希望的那样添加错误 $this->addError$属性,“贷方金额应小于票据金额” 有人能帮我吗?试试这个: public function actionOpanningBalance(){ $model = new Bill(); if ($model->load(Yii::$app->request->post()

我需要比较模型中的2个属性值,只有当第一个值低于第二个值时,表单才能验证。我尝试使用下面的代码,但它不起作用

控制器

模型

它将进入验证器函数,但不会像我希望的那样添加错误

$this->addError$属性,“贷方金额应小于票据金额”

有人能帮我吗?

试试这个:

public function actionOpanningBalance(){

 $model = new Bill();
 if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    $model->created_at = \Yii::$app->user->identity->id;
    $model->save();
  }else{
   return $this->render('OpanningBalance', [
        'model' => $model,
    ]);
 } 
}
验证

您可以使用匿名函数:

['credit_amount',function ($attribute, $params) {
            if ($this->$attribute > $this->bill_amount)) {
                $this->addError($attribute, 'Credit amount should less than Bill amount.');
              return false;
            }
        }],
试试这个:

public function actionOpanningBalance(){

 $model = new Bill();
 if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    $model->created_at = \Yii::$app->user->identity->id;
    $model->save();
  }else{
   return $this->render('OpanningBalance', [
        'model' => $model,
    ]);
 } 
}
验证

您可以使用匿名函数:

['credit_amount',function ($attribute, $params) {
            if ($this->$attribute > $this->bill_amount)) {
                $this->addError($attribute, 'Credit amount should less than Bill amount.');
              return false;
            }
        }],

你可以这样用下面的答案也写

public function rules(){
    return [
        ['credit_amount','custom_function_validation', 'on' =>'scenario'];
}
public function custom_function_validation($attribute){
    // add custom validation
    if ($this->$attribute < $this->cash_amount) 
        $this->addError($attribute,'Credit amount should less than Bill amount.');
}

你可以这样用下面的答案也写

public function rules(){
    return [
        ['credit_amount','custom_function_validation', 'on' =>'scenario'];
}
public function custom_function_validation($attribute){
    // add custom validation
    if ($this->$attribute < $this->cash_amount) 
        $this->addError($attribute,'Credit amount should less than Bill amount.');
}

如果验证没有添加任何错误,则很可能被跳过。该问题最有可能是由于默认规则行为,即它跳过空的或已经错误的给定值,如下所示:

具体而言:

默认情况下,如果内联验证器的关联属性接收到空输入,或者内联验证器已通过某些验证规则,则不会应用内联验证器。如果要确保始终应用规则,可以在规则声明中将skipOnEmpty和/或skipOnError属性配置为false

因此,您需要设置skipOnEmpty或skipOnError值,具体取决于您的工作方式:

[
    ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false],
]

如果验证没有添加任何错误,则很可能被跳过。该问题最有可能是由于默认规则行为,即它跳过空的或已经错误的给定值,如下所示:

具体而言:

默认情况下,如果内联验证器的关联属性接收到空输入,或者内联验证器已通过某些验证规则,则不会应用内联验证器。如果要确保始终应用规则,可以在规则声明中将skipOnEmpty和/或skipOnError属性配置为false

因此,您需要设置skipOnEmpty或skipOnError值,具体取决于您的工作方式:

[
    ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false],
]

我使用第三个参数进行了自定义函数验证,如下所示:

public function is18yo($attribute, $params, $validator)
{
    $dobDate = new DateTime($this->$attribute);
    $now = new DateTime();
    if ($now->diff($dobDate)->y < 18) {
        $validator->addError($this, $attribute, 'At least 18 years old');
        return false;
    }
}

我使用第三个参数进行了自定义函数验证,如下所示:

public function is18yo($attribute, $params, $validator)
{
    $dobDate = new DateTime($this->$attribute);
    $now = new DateTime();
    if ($now->diff($dobDate)->y < 18) {
        $validator->addError($this, $attribute, 'At least 18 years old');
        return false;
    }
}

这是一个后端验证,仅在提交时触发。因此,您可以在验证函数中尝试类似的方法

if (!$this->hasErrors()) {
  // Your validation code goes here.
}
如果检查生成的基本Yi2应用程序,可以在models/LoginForm.php文件中看到该示例,其中有一个名为validatePassword的函数


验证仅在提交表单后触发。

这是后端验证,仅在提交时触发。因此,您可以在验证函数中尝试类似的方法

if (!$this->hasErrors()) {
  // Your validation code goes here.
}
如果检查生成的基本Yi2应用程序,可以在models/LoginForm.php文件中看到该示例,其中有一个名为validatePassword的函数


只有在提交表单后才会触发验证。

您只需调用$model->validate…您的意思是添加like if$model->validate{save model}我做了但没有工作。删除函数名comparevalue。您只需调用$model->validate…您的意思是添加like if$model->validate{save model}我没有工作,但没有工作。删除函数名comparevalue。尝试使用匿名函数:我发现$this->addError$属性“信用额度应该小于账单额度”;不工作尝试添加:“skipOnError”=>规则中的false。是否删除了函数名compareValue?让我们来试试。尝试使用匿名函数:我发现$this->addError$属性,“贷方金额应小于账单金额”;无法工作请尝试在规则中添加:“skipOnError”=>false。是否删除了函数名compareValue?让我们看看。