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

Yii2: Display Error Messages when using forms inside 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...');

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

部分控制器是:

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

一开始我并没有真正理解,但你有一个带有 PJAX 包装器的视图,当你提交表单时你想在出现错误时通知用户 sessionFlash 此时将不起作用。

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

Yii2 有一个名为 SWEET-ALERT 的扩展,可以方便地显示漂亮的 user-friendly 消息。

我将使用 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(); ?>