如何在OpenCart Journal模板的商品网格中显示批量订购折扣价?
解决OpenCart+Journal模板商品网格显示最低折扣价的问题
嘿,正好我对OpenCart的MVC这套流程熟得很,给你一步步拆解怎么实现:
第一步:在Category控制器里把折扣数据塞进商品数组里
默认的Category控制器不会把折扣数据传递给模板,所以咱们得先修改catalog/controller/product/category.php:
找到处理商品列表的foreach ($results as $result)循环,在循环内部添加获取并处理折扣的代码:
// 获取当前商品的所有批量折扣 $discounts = $this->model_catalog_product->getProductDiscounts($result['product_id']); $lowest_discount_price = false; if (!empty($discounts)) { // 遍历折扣,找到最低的单价 $min_price = PHP_INT_MAX; foreach ($discounts as $discount) { if ($discount['price'] < $min_price) { $min_price = $discount['price']; } } // 按照站点的税费、货币设置格式化价格 $lowest_discount_price = $this->currency->format( $this->tax->calculate($min_price, $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'] ); }
然后把处理好的最低折扣价,加到要传递给模板的$product_data数组里:
$product_data[] = array( 'product_id' => $result['product_id'], 'name' => $result['name'], 'price' => $price, // 保留原有常规价格 'lowest_discount_price' => $lowest_discount_price, // 新增最低折扣价字段 // 其他原有字段... );
第二步:在商品网格模板里替换价格显示逻辑
注意Journal模板会覆盖默认的OpenCart模板,你要找对文件:
- 若用Journal 3,路径大概是
catalog/view/theme/journal3/template/product/category.tpl - 也可以直接在Journal后台的模板编辑器里,找到「商品列表/网格」对应的组件修改
找到模板里显示商品价格的代码块,替换成下面的逻辑:
<?php if ($product['lowest_discount_price']) { ?> <div class="product-price"> <!-- 显示最低折扣价 --> <span class="special-price"><?php echo $product['lowest_discount_price']; ?></span> <!-- 可选:划掉原来的常规价格 --> <?php if ($product['price']) { ?> <span class="old-price"><?php echo $product['price']; ?></span> <?php } ?> </div> <?php } else { ?> <!-- 无折扣商品正常显示常规价格 --> <div class="product-price"> <span class="price"><?php echo $product['price']; ?></span> </div> <?php } ?>
第三步:清除缓存避免踩坑
修改完控制器和模板后,一定要去OpenCart后台的「系统 → 维护 → 缓存管理」里清除所有缓存,不然可能看不到修改效果。
额外提醒
如果你的Journal模板有自定义的商品列表模块,可能需要在对应控制器文件里做类似的折扣数据处理,核心逻辑都是:从模型层获取折扣数据→筛选出最低价格→传递给模板显示。
内容的提问来源于stack exchange,提问作者Patrick




