yii2自定义验证不起作用

时间:2015-12-02 11:21:24

标签: validation yii2 yii2-validation

我需要比较模型中的2个属性值,并且只有当第一个值低于第二个值时,才能验证形式。我尝试使用下面的代码但是没有用。

控制器

public function actionOpanningBalance(){

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

模型

public function rules()
{
    return [
        [['outlet_id', 'sr_id', 'bill_number', 'bill_date', 'created_at', 'created_date','bill_amount','credit_amount'], 'required'],
        [['outlet_id', 'sr_id', 'created_at', 'updated_at'], 'integer'],
        [['bill_date', 'd_slip_date', 'cheque_date', 'created_date', 'updated_date','status'], 'safe'],
        [['bill_amount', 'cash_amount', 'cheque_amount', 'credit_amount'], 'number'],
        [['comment'], 'string'],
        ['credit_amount',function compareValue($attribute,$param){
               if($this->$attribute > $this->bill_amount){
               $this->addError($attribute, 'Credit amount should less than Bill amount');
    }],           
        [['bill_number', 'd_slip_no', 'bank', 'branch'], 'string', 'max' => 225],
        [['cheque_number'], 'string', 'max' => 100],
        [['bill_number'], 'unique']
    ];
}
}

它进入验证器功能但没有像我想要的那样添加错误

  

$ this-> addError($ attribute,'信用额度应低于比尔金额');

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:2)

试试这个:

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;
            }
        }],

答案 1 :(得分:0)

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

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.');
}

答案 2 :(得分:0)

如果验证没有添加任何错误,则很可能会跳过该错误。问题很可能是因为默认规则行为导致空白或已经错误的给定值,如下所示:https://www.yiiframework.com/doc/guide/2.0/en/input-validation#inline-validators

具体做法是:

  

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

因此,您需要设置skipOnEmptyskipOnError值,具体取决于对您有用的内容:

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

答案 3 :(得分:0)

我已经使用以下第三个参数使custom_function_validation起作用了:

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;
    }
}

答案 4 :(得分:0)

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

const CACHE_VERSION = 1.01

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

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