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

Symfony中AJAX添加购物车时动态生成表格行ID问题求助

解决动态生成购物车表格行的ID问题

看起来你遇到的核心问题是前端无法获取到新创建的Lignedecommande的真实ID,导致动态生成的表格行元素ID不符合预期。下面分步骤帮你解决:

问题根源分析

  1. 你的Symfony控制器只返回了操作状态(msg),没有把新创建/更新的Lignedecommande数据返回给前端,所以前端拿不到对应的ID。
  2. 前端JS里的var id = {{ panier.id|json_encode() }}是页面初始渲染时的旧数据,不是新增订单行的ID,自然生成的ID不对。
  3. 动态生成HTML时,ID没有加引号,可能导致浏览器解析错误,比如<div id="+id+id+id+">会变成无引号的属性,容易引发问题。

第一步:修改Symfony控制器,返回订单行数据

更新控制器,在成功创建或更新订单行后,把对应的Lignedecommande对象的关键数据(id、quantite、prixTotal、nomProduit等)返回给前端:

public function ajouterauPanierAction($id) {
    $em = $this->getDoctrine()->getManager();
    $produit = $em->getRepository(Produit::class)->find($id);
    $userId = $this->getUser()->getId();
    $test = $em->getRepository(Lignedecommande::class)->findExistant($id, $userId);
    $responseData = [];

    if($produit != null) {
        if($test == null) {
            // 创建新订单行
            $lignedecommande = new Lignedecommande();
            $lignedecommande->setProduitId($produit->getId());
            $lignedecommande->setUserId($userId);
            $lignedecommande->setNomProduit($produit->getNom());
            $lignedecommande->setImage($produit->getImage());
            $lignedecommande->setEtat(0);
            $lignedecommande->setQuantite(1);
            $lignedecommande->setPrixTotal($produit->getPrix());
            $em->persist($lignedecommande);
            $em->flush();
            $responseData['msg'] = "success";
            // 返回新订单行数据
            $responseData['ligne'] = [
                'id' => $lignedecommande->getId(),
                'nomProduit' => $lignedecommande->getNomProduit(),
                'quantite' => $lignedecommande->getQuantite(),
                'prixTotal' => $lignedecommande->getPrixTotal()
            ];
        } else {
            // 更新已有订单行
            $line = $test[0];
            $line->setQuantite($line->getQuantite()+1);
            $line->setPrixTotal($line->getPrixTotal()+$produit->getPrix());
            $em->flush();
            $responseData['msg'] = "done";
            // 返回更新后的订单行数据
            $responseData['ligne'] = [
                'id' => $line->getId(),
                'nomProduit' => $line->getNomProduit(),
                'quantite' => $line->getQuantite(),
                'prixTotal' => $line->getPrixTotal()
            ];
        }
    } else {
        $responseData['msg'] = "error";
        $responseData['message'] = "Produit non trouvé";
    }

    return new JsonResponse($responseData);
}

第二步:修改前端JS,使用返回的订单行数据生成表格行

更新你的JS代码,在AJAX成功回调中,使用控制器返回的d.ligne数据来生成正确的元素ID和内容,同时修复HTML属性的引号问题:

function ajouter(idd, prix) {
    var test = idd;
    var urlEdit = "{{ path('ajouterAuPanier', { 'id': \"id\" }) }}";
    urlEdit = urlEdit.replace("id", test);
    
    $.ajax({
        method: 'POST',
        url: urlEdit,
        success: function(d) {
            if(d.msg == "success" || d.msg == "done") {
                alert(d.msg == "success" ? "Item Added" : "Quantité mise à jour");
                
                // 更新总价
                var prixTotal = parseInt(document.getElementById('prixTotal').innerText);
                prixTotal = prixTotal + prix;
                document.getElementById('prixTotal').innerText = prixTotal;
                
                // 获取返回的订单行数据
                var ligne = d.ligne;
                var table = document.getElementById("customers");
                var row = table.insertRow();
                
                var cell1 = row.insertCell(0);
                var cell2 = row.insertCell(1);
                var cell3 = row.insertCell(2);
                
                // 产品名称单元格(可保留你原来的idd对应元素逻辑,这里用返回的产品名示例)
                cell1.innerHTML = ligne.nomProduit;
                // 原逻辑:cell1.innerHTML = document.getElementById(idd+idd).innerHTML;
                
                // 数量单元格:生成正确的ID,加引号,传入正确的订单行ID到update函数
                var quantiteId = ligne.id + ligne.id + ligne.id;
                cell2.innerHTML = `<div id="${quantiteId}">${ligne.quantite}</div>
                    <input type="submit" name="+" value="+" style="margin-top: -11%;margin-left: 10%;" onclick="updatePlus(${ligne.id})">
                    <input type="submit" name="-" value="-" style="margin-top: -19%;margin-left: 31%;" onclick="updateMinus(${ligne.id})">`;
                
                // 总价单元格:生成正确的ID
                var prixId = ligne.id + ligne.id;
                cell3.innerHTML = `<div id="${prixId}">${ligne.prixTotal}</div>`;
            }
        }
    });
}

关键修改点说明

  1. 控制器返回订单行数据:确保前端能拿到新创建/更新的Lignedecommande的真实ID,而非页面初始的旧数据。
  2. 使用模板字符串拼接HTML:用反引号(`)拼接HTML,不仅更易读,还能正确处理变量和引号,避免ID解析错误。
  3. 正确传入订单行ID到update函数:updatePlus(${ligne.id})和updateMinus(${ligne.id})确保后续增减数量操作能定位到正确的订单行。
  4. 修复ID的引号问题:id="${quantiteId}"确保HTML属性的引号正确,浏览器能正确识别元素ID。

这样修改后,动态生成的表格行元素ID就会和你期望的结构一致,比如id="123123123"(假设订单行ID是123),完全符合你的需求。

内容的提问来源于stack exchange,提问作者AOUADI Slim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:44:41