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
模型进行演示,其中包含 name
和 description
字段 我将只在表单中呈现名称字段,然后提交表单以便它显示给我尝试保存模型时描述的验证错误。
您的表单应如下所示
<?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(); ?>
是否可以渲染包含 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
模型进行演示,其中包含 name
和 description
字段 我将只在表单中呈现名称字段,然后提交表单以便它显示给我尝试保存模型时描述的验证错误。
您的表单应如下所示
<?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(); ?>