如何在PrestaShop 1.7中添加替代下单流程的自定义功能
PrestaShop 1.7 购物车页添加报价申请按钮实现方案
完全可以实现,推荐通过自定义模块的方式开发,不要修改核心代码,避免后续版本升级覆盖你的自定义逻辑,具体实现步骤如下:
1. 基础模块搭建
先创建一个自定义功能模块,注册购物车页面的渲染钩子和自定义控制器,用来承载报价功能的逻辑:
- 注册
displayShoppingCart或displayShoppingCartFooter钩子,用来在购物车页面渲染报价申请按钮,位置可以和默认结账按钮并列展示 - 新增自定义控制器处理报价提交请求,无需修改原生结账流程的代码,完全和现有流程解耦
2. 按钮渲染
在钩子对应的模板文件里添加按钮代码,你可以自定义按钮的样式和文案,示例代码如下:
<a href="{$link->getModuleLink('你的模块名', 'requestquote')}" class="btn btn-secondary"> 申请报价 </a>
可以加判断逻辑,仅当购物车有商品时才展示该按钮,避免无效提交。
3. 核心功能实现
在自定义控制器的处理方法里,你可以直接调用PrestaShop内置的类来获取你需要的所有数据:
- 获取购物车商品信息:通过
Context::getContext()->cart对象调用getProducts()方法,即可拿到购物车所有商品的名称、SKU、数量、单价、自定义属性、小计金额等完整信息 - 获取客户信息:通过
Context::getContext()->customer对象可直接获取当前登录客户的姓名、邮箱、联系电话、收货地址等注册信息;如果是未登录的访客,可以在报价提交页增加表单引导用户填写必要的联系信息 - 发送邮件:直接调用PrestaShop内置的
Mail::Send()方法即可,无需额外配置邮件服务,会自动复用店铺后台已经配置好的发件规则。你可以提前在模块的mails/目录下创建多语言版本的报价申请邮件模板,方便后续调整内容格式
以下是控制器处理逻辑的示例代码:
public function postProcess() { $cart = $this->context->cart; $customer = $this->context->customer; $products = $cart->getProducts(); // 组装邮件变量 $mailData = [ 'customer_name' => $customer->firstname.' '.$customer->lastname, 'customer_email' => $customer->email, 'products_list' => $products, // 其他需要展示在邮件里的字段 ]; // 发送报价申请邮件到店铺管理邮箱 Mail::Send( $this->context->language->id, 'quote_request', // 对应你自定义的邮件模板名 $this->l('New quote request from customer'), $mailData, Configuration::get('PS_SHOP_EMAIL'), Configuration::get('PS_SHOP_NAME'), null, null, null, null, _PS_MODULE_DIR_.$this->name.'/mails/' ); // 提交后跳转成功提示页 Tools::redirect($this->context->link->getModuleLink($this->name, 'quotesuccess')); }
4. 额外优化建议
- 报价提交后可以返回成功提示,或者跳转到自定义的提示页面,告知用户工作人员会尽快联系
- 可以增加提交频率限制,避免恶意用户反复提交无效请求
- 后台可以增加报价申请的记录列表,方便管理人员查看历史申请,不用完全依赖邮件通知
内容的提问来源于stack exchange,提问作者Marminoleo
相关产品推荐
相关产品推荐

