如何在Prestashop中添加两个带不同数据/价格的‘加入购物车’按钮
嘿,我来帮你搞定这个需求!要在PrestaShop里加两个对应不同价格的「加入购物车」按钮,其实核心是让每个按钮携带专属的价格类型标识,然后在后台处理添加逻辑时,根据这个标识调用对应的价格计算。下面是针对PrestaShop 1.7+版本的具体步骤(旧版本思路一致,只是文件路径略有差异):
第一步:修改产品详情页模板,添加第二个按钮
首先找到你的主题产品详情页模板文件,路径一般是/themes/你的主题/templates/catalog/product/product.tpl(如果是自定义主题,路径可能类似)。
找到原有的「加入购物车」按钮代码,通常是被<form>标签包裹的。你可以复制一份原按钮的表单结构,然后修改按钮文字和新增价格类型标识:
<!-- 第一个按钮:以折扣价加入购物车 --> <form action="{$urls.pages.cart}" method="post" id="add-to-cart-discount" class="add-to-cart-form"> <input type="hidden" name="id_product" value="{$product.id_product}"> <input type="hidden" name="id_product_attribute" value="{$product.id_product_attribute}"> <input type="hidden" name="quantity" value="1"> <input type="hidden" name="price_type" value="discount"> <!-- 折扣价标识 --> <button type="submit" class="btn btn-primary">以折扣价加入购物车</button> </form> <!-- 第二个按钮:以原价加入购物车 --> <form action="{$urls.pages.cart}" method="post" id="add-to-cart-old" class="add-to-cart-form" style="margin-top: 10px;"> <input type="hidden" name="id_product" value="{$product.id_product}"> <input type="hidden" name="id_product_attribute" value="{$product.id_product_attribute}"> <input type="hidden" name="quantity" value="1"> <input type="hidden" name="price_type" value="old"> <!-- 原价标识 --> <button type="submit" class="btn btn-secondary">以原价加入购物车</button> </form>
提示:如果原模板里已经有一个大的form包裹所有提交内容,也可以不用单独写两个form,而是在同一个form里放两个按钮,给每个按钮设置不同的name属性,不过分开form能避免提交冲突,逻辑更清晰。
第二步:修改购物车控制器,处理价格类型逻辑
接下来需要修改购物车的核心处理逻辑,找到控制器文件/controllers/front/CartController.php,定位到postProcess()方法——这是处理添加购物车请求的关键方法。
- 先获取前端提交的
price_type参数:
$priceType = Tools::getValue('price_type');
- 找到获取产品价格的代码段(原代码类似
$productPrice = $product->getPrice(false, null, 6);),替换成根据价格类型判断的逻辑:
// 初始化产品价格为默认折扣价 $productPrice = $product->getPrice(false, null, 6); // 如果选择原价,且产品设置了原价,则替换为原价 if ($priceType === 'old' && !empty($product->old_price) && $product->old_price > 0) { $productPrice = $product->old_price; }
如果你的PrestaShop版本里$product->old_price无法直接获取,可以通过数据库查询补全:
if ($priceType === 'old') { $oldPrice = Db::getInstance()->getValue( 'SELECT old_price FROM '._DB_PREFIX_.'product WHERE id_product = '.(int)$product->id ); if ($oldPrice > 0) { $productPrice = $oldPrice; } }
第三步:保存价格类型到购物车,确保结账流程一致
为了让购物车和订单页面能正确显示用户选择的价格类型,需要给ps_cart_product表新增一个字段来存储这个标识:
- 用phpMyAdmin或数据库管理工具执行SQL语句:
ALTER TABLE `ps_cart_product` ADD `price_type` VARCHAR(20) NULL DEFAULT 'discount' AFTER `id_product_attribute`;
- 回到
CartController.php,在处理添加购物车的逻辑里(比如add()方法中),添加保存价格类型的代码:
// 保存价格类型到购物车项 if ($priceType) { Db::getInstance()->update( 'cart_product', ['price_type' => pSQL($priceType)], [ 'id_cart' => (int)$cart->id, 'id_product' => (int)$product->id, 'id_product_attribute' => (int)$idProductAttribute ] ); }
- 修改购物车页面模板(
/themes/你的主题/templates/cart/cart.tpl),添加价格类型标识,让用户清楚自己选择的价格:
<!-- 在购物车产品行的合适位置添加 --> {if $product.price_type == 'old'} <span class="badge bg-warning ms-2">以原价购买</span> {else} <span class="badge bg-success ms-2">以折扣价购买</span> {/if}
第四步:测试与验证
完成以上修改后,记得做这些操作:
- 清除PrestaShop后台缓存(路径:后台→高级参数→性能→清除缓存)
- 打开产品详情页,确认两个按钮正常显示
- 分别点击两个按钮加入购物车,检查购物车页面的价格和标识是否正确
- 走完整个结账流程,确认最终订单金额与选择的价格一致
额外注意事项
- 如果你使用的是PrestaShop 1.6版本,模板文件路径是
/themes/你的主题/product.tpl,控制器逻辑基本一致 - 修改核心文件前一定要备份!如果不想修改核心文件,也可以开发一个自定义模块来实现这个功能,这样更安全,也不会被PrestaShop更新覆盖
- 确保后台产品编辑页面已经正确设置了
old_price(原价)字段 - 如果产品有属性(颜色、尺寸等),需要额外调整属性价格的处理逻辑,确保不同属性对应的原价/折扣价都能正确调用
内容的提问来源于stack exchange,提问作者Alex Pryl
相关产品推荐
相关产品推荐

