You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Yii框架中显示JavaScript弹窗且不刷新页面?

解决重复产品名称检测与空白页问题

你的代码有几个关键问题导致了确认弹窗后出现空白页,同时重复名称的检测逻辑也不正确,下面是修复方案:

问题分析

  • 重复检测逻辑错误:你当前只是检查GET参数中的nombre_producto,但表单提交是POST请求,而且没有实际查询数据库验证是否存在同名产品。
  • 响应输出混乱:直接用echo输出JS弹窗会破坏Yii的响应结构——renderAjax已经准备好返回视图内容,额外的echo会让页面内容变成脚本+视图的混合,导致浏览器解析异常出现空白。
  • 未正确返回视图:当检测到重复时,你没有返回创建表单的视图,导致没有渲染页面内容。

修复后的代码

/**
 * Creates a new Producto model.
 * If creation is successful, the browser will be redirected to the 'index' page.
 * @return mixed
 */
public function actionCreate()
{
    $model = new Producto();

    if ($model->load(Yii::$app->request->post())) {
        // 查询数据库是否存在同名产品
        $existingProduct = Producto::findOne(['nombre_producto' => $model->nombre_producto]);
        
        if ($existingProduct !== null) {
            // 给模型添加错误提示,前端可直接读取显示
            $model->addError('nombre_producto', 'Producto already exists');
            // 返回创建视图,保留用户已输入的内容
            return $this->renderAjax('create', [
                'model' => $model,
            ]);
        } else {
            if ($model->save()) {
                return $this->redirect(['index']);
            }
        }
    } else {
        return $this->renderAjax('create', [
            'model' => $model,
        ]);
    }
}

额外优化(可选)

如果还是想要弹窗提示,可以在前端视图里处理:
在create.php视图中添加JS代码,检测模型错误并弹出提示:

<?php if ($model->hasErrors('nombre_producto')): ?>
<script>
    alert("<?= $model->getFirstError('nombre_producto') ?>");
</script>
<?php endif; ?>

这样既遵循了Yii的响应规范,又能正确显示提示,同时不会出现空白页。

内容的提问来源于stack exchange,提问作者Ernesto Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:18:18