Opencart控制器导出双语言JSON格式产品数据求助
解决方案:Opencart API导出多语言产品数据
核心思路
Opencart的产品多语言字段(如名称、描述)存储在product_description表中,关联product_id和language_id。默认getProducts()方法仅返回当前会话语言的描述数据,要实现多语言导出,需:
- 获取系统所有启用的语言
- 为每个产品单独拉取对应各语言的描述信息
- 重构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
相关产品推荐
相关产品推荐

