Symfony中AJAX添加购物车时动态生成表格行ID问题求助
解决动态生成购物车表格行的ID问题
看起来你遇到的核心问题是前端无法获取到新创建的Lignedecommande的真实ID,导致动态生成的表格行元素ID不符合预期。下面分步骤帮你解决:
问题根源分析
- 你的Symfony控制器只返回了操作状态(
msg),没有把新创建/更新的Lignedecommande数据返回给前端,所以前端拿不到对应的ID。 - 前端JS里的
var id = {{ panier.id|json_encode() }}是页面初始渲染时的旧数据,不是新增订单行的ID,自然生成的ID不对。 - 动态生成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>`; } } }); }
关键修改点说明
- 控制器返回订单行数据:确保前端能拿到新创建/更新的
Lignedecommande的真实ID,而非页面初始的旧数据。 - 使用模板字符串拼接HTML:用反引号(`)拼接HTML,不仅更易读,还能正确处理变量和引号,避免ID解析错误。
- 正确传入订单行ID到update函数:
updatePlus(${ligne.id})和updateMinus(${ligne.id})确保后续增减数量操作能定位到正确的订单行。 - 修复ID的引号问题:
id="${quantiteId}"确保HTML属性的引号正确,浏览器能正确识别元素ID。
这样修改后,动态生成的表格行元素ID就会和你期望的结构一致,比如id="123123123"(假设订单行ID是123),完全符合你的需求。
内容的提问来源于stack exchange,提问作者AOUADI Slim
相关产品推荐
相关产品推荐

