validationyii2yii2-validation

yii2 custom validation not working


I need to compare 2 attribute value in the model and only if first value is lower than second value form can validate.I try with below code but it not worked.

controller

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

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

It's going in to the validator function but not add the error like i wanted

$this->addError($attribute, 'Credit amount should less than Bill amount');

anyone can help me with this?


Solution

  • Try this:

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

    For Validation

    You can use anonymous function :

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