2016-10-01 75 views
0

我正在开发一个Yii 2.0应用程序,用户可以在其中创建订单,然后发送订单进行审阅,然后在工作流中执行多个阶段。Yii2对控制器动作的验证

一切都很好,直到昨天,客户要求在发送订单审核订单之前的可能性被视为草稿。这意味着当用户点击Send To Review按钮时,我必须关闭创建验证并验证它们。我知道Yii 2.0支持方案,但可能情况不适用于此,因为Send To Review按钮显示在只读视图中。这迫使我在控制器操作中进行验证,因为没有send_to_review视图。如何做到这一点(我的意思是控制器内部的模型验证)?

这里是控制器动作代码

public function actionSendToReview($id) 
{ 
    if (Yii::$app->user->can('Salesperson')) 
    { 
     $model = $this->findModel($id); 
     if ($model->orden_stage_id == 1 && $model->sales_person_id == Yii::$app->user->identity->id) 
     { 
      $model->orden_stage_id = 2; 
      $model->date_modified = date('Y-m-d h:m:s'); 
      $model->modified_by = Yii::$app->user->identity->username; 

      //TODO: Validation logic if is not valid show validation errors 
      //for example "For sending to review this values are required: 
      //list of attributes in bullets" 
      //A preferred way would be to auto redirect to update action but 
      //showing the validation error and setting scenario to    
      //"send_to_review". 


      $model->save(); 
      $this::insertStageHistory($model->order_id, 2); 
      return $this->redirect(['index']); 
     } 
     else 
     { 
      throw new ForbiddenHttpException(); 
     } 
    } 
    else 
    { 
     throw new ForbiddenHttpException(); 
    } 
} 

我需要解决的是TODO。 选项1:在同一视图中显示验证错误,并且用户必须点击更新按钮更改所请求的值保存,然后尝试再次发送到评论。 选项2:自动重定向更新视图,已经设置了控制器中发现的场景和验证错误。

感谢,

问候

回答

0

可以在控制器使用$model ->validate()进行验证。

public function actionSendToReview($id) 
{ 
    if (Yii::$app->user->can('Salesperson')) 
    { 
     $model = $this->findModel($id); 
     if ($model->orden_stage_id == 1 && $model->sales_person_id == Yii::$app->user->identity->id) 
     { 
      $model->orden_stage_id = 2; 
      $model->date_modified = date('Y-m-d h:m:s'); 
      $model->modified_by = Yii::$app->user->identity->username; 



      //TODO: Validation logic if is not valid show validation errors 
      //for example "For sending to review this values are required: 
      //list of attributes in bullets" 
      //A preferred way would be to auto redirect to update action but 
      //showing the validation error and setting scenario to    
      //"send_to_review". 

      //optional 
      $model->scenario=//put here the scenario for validation; 

      //if everything is validated as per scenario 
      if($model ->validate()) 
      {     
       $model->save(); 
       $this::insertStageHistory($model->order_id, 2); 
       return $this->redirect(['index']); 
      } 
      else 
      { 
       return $this->render('update', [ 
       'model' => $model, 
       ]); 
      } 


     } 
     else 
     { 
      throw new ForbiddenHttpException(); 
     } 
    } 
    else 
    { 
     throw new ForbiddenHttpException(); 
    } 
} 

如果您不需要actionCreate() .Create方案验证不验证任何领域和应用存在。

+0

它工作正常,但现在验证错误显示两次。奇怪的 –