You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Кирилл Никулин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:48:17