OpenCart 3:如何优化总销售报表并按子类别排序订单
优化OpenCart后台总销售报表:添加子类别、总销售额及按子类排序
1. 修改模型文件(核心数据逻辑)
找到后台模型文件 admin/model/report/sale_product.php(以OpenCart 3.x为例),修改getProducts()方法,关联分类表并计算总销售额:
public function getProducts($start = 0, $limit = 20, $sort = 'name', $order = 'ASC') { $sql = "SELECT op.name, op.model, SUM(op.quantity) AS quantity, SUM(op.total) AS total, c.name AS category_name FROM " . DB_PREFIX . "order_product op LEFT JOIN " . DB_PREFIX . "product_to_category ptc ON op.product_id = ptc.product_id LEFT JOIN " . DB_PREFIX . "category c ON ptc.category_id = c.category_id LEFT JOIN " . DB_PREFIX . "order o ON op.order_id = o.order_id WHERE o.order_status_id > 0"; if ($this->config->get('config_complete_status')) { $sql .= " AND o.order_status_id IN (" . implode(',', $this->config->get('config_complete_status')) . ")"; } $sql .= " GROUP BY op.product_id, c.category_id ORDER BY " . $sort . " " . $order . " LIMIT " . (int)$start . "," . (int)$limit; $query = $this->db->query($sql); return $query->rows; }
说明:通过LEFT JOIN关联oc_product_to_category和oc_category获取子类别名称,用SUM(op.total)计算对应子类下的产品总销售额;支持接收排序参数,为后续排序功能铺路。
2. 更新控制器文件(传递数据与排序逻辑)
找到后台控制器文件 admin/controller/report/sale_product.php,在index()方法中添加排序选项并传递参数:
// 处理排序参数 if (isset($this->request->get['sort'])) { $sort = $this->request->get['sort']; } else { $sort = 'name'; } if (isset($this->request->get['order'])) { $order = $this->request->get['order']; } else { $order = 'ASC'; } // 新增子类别排序选项到模板数据 $data['sorts'] = array( 'name' => $this->language->get('column_name'), 'model' => $this->language->get('column_model'), 'quantity' => $this->language->get('column_quantity'), 'total' => $this->language->get('column_total'), 'category_name' => $this->language->get('column_category') ); // 传递排序参数调用模型 $product_data = $this->model_report_sale_product->getProducts($start, $limit, $sort, $order);
3. 修改视图文件(前端显示新增字段)
找到后台视图文件 admin/view/template/report/sale_product.twig,添加子类别和总销售额的列:
表头部分
<th><a href="{{ sort == 'category_name' ? (order == 'ASC' ? sort_url ~ '&sort=category_name&order=DESC' : sort_url ~ '&sort=category_name&order=ASC') : sort_url ~ '&sort=category_name&order=ASC' }}">{{ column_category }}</a></th> <th><a href="{{ sort == 'total' ? (order == 'ASC' ? sort_url ~ '&sort=total&order=DESC' : sort_url ~ '&sort=total&order=ASC') : sort_url ~ '&sort=total&order=ASC' }}">{{ column_total }}</a></th>
表格内容部分
<td>{{ product.category_name }}</td> <td>{{ product.total }}</td>
4. 添加语言翻译(适配中文后台)
找到admin/language/zh-cn/report/sale_product.php,新增对应翻译:
$_['column_category'] = '子类别'; $_['column_total'] = '总销售额';
5. 按子类别排序的实现
完成上述修改后,后台报表的子类别表头会变成可点击的排序链接,点击即可切换升序/降序排列,直接实现按子类别排序订单数据的需求。
注意事项
- OpenCart 2.x版本视图文件为
.tpl格式,需调整对应语法,核心逻辑一致; - 若产品属于多个子类别,报表会按子类分组显示该产品的对应销售数据,如需合并可修改
GROUP BY字段; - 修改前请备份原文件,避免出错导致功能异常。
内容的提问来源于stack exchange,提问作者Кирилл Никулин
相关产品推荐
相关产品推荐

