Shopware6.5应用:如何在Cart脚本钩子中获取表单POST请求或设置变量
点击触发购物车清空的实现方案
针对你的需求,我们可以通过前端触发+会话(session)传递标识+钩子脚本判断的方式实现,具体步骤如下:
1. 前端添加清空触发按钮/表单
在checkout/offcanvas-cart.html.twig中嵌入一个POST表单,用于触发清空操作:
{# 嵌入清空购物车的表单,样式可根据需求调整 #} <form action="{{ path('cart_update') }}" method="POST" class="d-inline"> <input type="hidden" name="_trigger_clear" value="1"> <button type="submit" class="btn btn-sm btn-danger">清空购物车</button> </form>
注:path('cart_update')需替换为你项目中负责购物车更新的实际路由。
2. 在路由控制器中设置会话标识
找到对应cart_update路由的控制器,在其中检测前端提交的触发参数,并写入会话:
// 购物车更新控制器示例 public function updateCartAction(Request $request) { // 检测是否有清空触发请求 if ($request->request->has('_trigger_clear')) { $this->get('session')->set('need_clear_cart', true); } // 执行原有购物车更新逻辑... return $this->redirectToRoute('your_cart_route'); }
3. 修改Cart钩子脚本的清空逻辑
在scripts/cart/Cart.php的钩子方法中,通过会话判断是否需要执行清空操作,完成后移除标识避免重复执行:
public function onCartCalculate($event) { $cart = $event->getCart(); $session = $this->container->get('session'); // 检查会话中是否存在清空标识 if ($session->has('need_clear_cart') && $session->get('need_clear_cart') === true) { // 遍历移除购物车所有商品 foreach ($cart->getItems() as $item) { $cart->removeItem($item); } // 移除标识,防止后续计算重复清空 $session->remove('need_clear_cart'); } // 原有购物车计算逻辑... }
可选:AJAX异步触发方案
如果需要无刷新清空购物车,可改用AJAX提交:
<button id="clear-cart-btn" class="btn btn-sm btn-danger">清空购物车</button> <script> document.getElementById('clear-cart-btn').addEventListener('click', function() { fetch('{{ path('cart_update') }}', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRF-Token': '{{ csrf_token("cart_clear") }}' // 需根据项目CSRF规则调整 }, body: '_trigger_clear=1' }).then(response => response.text()) .then(html => { // 刷新购物车界面 document.querySelector('.offcanvas-cart').innerHTML = html; }); }); </script>
对应控制器需返回更新后的购物车HTML片段。
内容的提问来源于stack exchange,提问作者Codixio
相关产品推荐
相关产品推荐

