Yii2:在Pjax中使用表单时显示错误消息

时间:2018-03-12 13:25:28

标签: error-handling yii2 rendering pjax

是否可以呈现包含UserException / ErrorException的普通视图?

我不能用

中断这个过程
throw new UserException('Error: you did a mistake');

因为我需要在少数人中找回一些变量。因此,我必须以正常方式呈现视图,如

return $this->render('view', [
                'model' => $model,
            ]);

是否可以创建新的UserException,如

$exception = new UserException('You did a mistake...');

并将其包含在呈现视图中?

问题是,我有一个带有pjax元素的视图和

Yii::$app->session->setFlash('error', 'You did a mistake...');

无效。所以我正在寻找一种方法来返回错误消息,同时保持视图正常呈现。

控制器的一部分是:

        if ($quantity_delivered > $ordered_product_quantity){;
            //throw new UserException('Value is not valid!');
            $exception = new UserException('Value is not valid!');
            //todo return error message with rendering the view
            return $this->render('view', [
                'error' => $exception,
                'model_suppliers_orders' => $model_suppliers_orders,
                'dataProvider_suppliers_orders_products' => $dataProvider_suppliers_orders_products,
            ]);
        }

1 个答案:

答案 0 :(得分:1)

我在开始时并没有真正了解,但您在表单上有一个PJAX包装器的视图,当您提交表单时,如果出现错误并sessionFlash,则要通知用户在这一点上不起作用。

您可以使用$this->getView()在控制器操作中注册javascript,并通过将错误转换为json然后将错误转换为模型或您喜欢该视图的任何其他部分使用for in循环javascript阅读它们我使用普通javascript alert()进行演示,您可以将其更改为您喜欢的任何内容。

Yii2有一个名为SWEET-ALERT的扩展名,可以方便地显示友好的用户友好消息。

我将使用Product模型进行演示,其中包含namedescription字段我只会在表单中呈现名称字段,然后提交表单以便向我显示验证尝试保存模型时的描述错误。

您的表格应如下所示

<?php 
use yii\widgets\Pjax;
use yii\bootstrap\Html;

?>
<?php Pjax::begin(); ?>
<?php 
$form=yii\widgets\ActiveForm::begin(['id'=>'my-form','action'=>'pjax', 'method'=>'post']);

echo $form->field($model , 'name')->textInput();
echo Html::submitButton('submit');
yii\widgets\ActiveForm::end();
?>

<?php Pjax::end(); ?>

controller/action 应如下所示

public function actionPjax() {
        $model = new \frontend\models\Product();

        if ( $model->load ( Yii::$app->request->post () )  ) {

            if (!$model->save() ) {

                $result = [];
                // The code below comes from ActiveForm::validate(). We do not need to validate the model
                // again, as it was already validated by save(). Just collect the messages.
                foreach ( $model->getErrors () as $attribute => $errors ) {
                    $result[] = $errors;
                }

                $errors=\yii\helpers\Json::encode($result );
                $script=<<<JS
                        var data=$errors;
                        var msg='';
                        for(error in data){
                            msg+=data[error]+"\\n";
                        }
                        alert(msg);
JS;
                $this->getView()->registerJs($script,\yii\web\View::POS_READY);

            }
        }

        return $this->render ( 'pjax' , [
                    'model' => $model
                ] );
    }

希望如果您不希望通过javascript显示错误消息,或者您只想显示模型错误,您可以在视图中使用$form->errorSummary($model),这可以帮助您解决上述问题它会自动显示错误,你的行动将减少到以下

public function actionPjax() {
        $model = new \frontend\models\Product();

        if ( $model->load ( Yii::$app->request->post () )  ) {

            if ($model->save() ) {
               //do something else if saved
            }
        }

        return $this->render ( 'my-form' , [
                    'model' => $model
                ] );
    }

,您的表单如下所示

<?php 
use yii\widgets\Pjax;
use yii\bootstrap\Html;

?>
<?php Pjax::begin(); ?>
<?php 
$form=yii\widgets\ActiveForm::begin(['id'=>'my-form','action'=>'pjax', 'method'=>'post']);

//display model errors
echo $form->errorSummary($model);

echo $form->field($model , 'name')->textInput();
echo Html::submitButton('submit');
yii\widgets\ActiveForm::end();
?>

<?php Pjax::end(); ?>