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

Opencart控制器导出双语言JSON格式产品数据求助

解决方案:Opencart API导出多语言产品数据

核心思路

Opencart的产品多语言字段(如名称、描述)存储在product_description表中,关联product_id和language_id。默认getProducts()方法仅返回当前会话语言的描述数据,要实现多语言导出,需:

  1. 获取系统所有启用的语言
  2. 为每个产品单独拉取对应各语言的描述信息
  3. 重构JSON结构,整合多语言数据

修改后的完整代码

<?php
class ControllerApiProduct extends Controller
{
    public function index()
    {
        $this->load->language('api/cart');
        $this->load->model('catalog/product');
        $this->load->model('tool/image');
        // 新增:加载语言模型,用于获取系统所有启用语言
        $this->load->model('localisation/language');

        $json = array();
        $json['products'] = array();
        $filter_data = array();

        // 获取所有产品基础数据
        $results = $this->model_catalog_product->getProducts($filter_data);
        // 获取系统所有启用的语言
        $languages = $this->model_localisation_language->getLanguages();

        foreach ($results as $result) {
            // 存储当前产品的多语言信息
            $product_languages = array();
            
            foreach ($languages as $language) {
                // 根据产品ID和语言ID获取对应语言的描述
                $product_description = $this->model_catalog_product->getProductDescription($result['product_id'], $language['language_id']);
                
                $product_languages[] = array(
                    'language_id'   => $language['language_id'],
                    'language_code' => $language['code'],
                    'name'          => $product_description['name'],
                    // 可选:添加其他多语言字段,比如描述、元标题等
                    // 'description'   => $product_description['description'],
                    // 'meta_title'    => $product_description['meta_title']
                );
            }

            $json['products'][] = array(
                'product_id' => $result['product_id'],
                'sku'        => $result['sku'],
                'price'      => $result['price'],
                // 其他通用非语言字段可按需添加
                'languages'  => $product_languages // 嵌入多语言数据
            );
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }
}

关键修改点说明

  • 加载语言模型:通过model_localisation_language获取系统中所有已启用的语言列表,包含语言ID、编码等信息
  • 多语言描述获取:遍历每个语言,调用getProductDescription()方法,传入产品ID和语言ID,拉取对应语言的产品名称等字段
  • JSON结构重构:将多语言数据以数组形式嵌套在每个产品对象中,同时保留产品通用字段(如ID、价格、SKU),让输出结构更清晰

性能优化建议(可选)

如果产品数量较多,循环调用getProductDescription()会产生大量数据库查询,可在catalog/product模型中新增一个自定义方法,一次性查询所有产品的所有语言描述,减少数据库交互次数:

// 在 model/catalog/product.php 中添加
public function getProductDescriptionsAllLanguages($product_ids) {
    $query = $this->db->query("SELECT pd.product_id, pd.language_id, pd.name, pd.description FROM " . DB_PREFIX . "product_description pd WHERE pd.product_id IN (" . implode(',', $product_ids) . ")");
    
    $descriptions = array();
    foreach ($query->rows as $row) {
        $descriptions[$row['product_id']][$row['language_id']] = $row;
    }
    
    return $descriptions;
}

然后在控制器中先收集所有产品ID,调用该方法一次性拿到所有描述,再循环组装数据,可大幅提升性能。

内容的提问来源于stack exchange,提问作者Alex Smol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:10:22