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

如何通过API获取PrestaShop各语言版本的客户组名称

PrestaShop Webservice 获取多语言客户组名称解决方案

在PrestaShop 1.7至8版本中,使用官方Webservice库调用API时,客户组的常规字段(如折扣、价格显示方式等)都能正常获取,但无法直接提取不同语言版本的客户组名称。API返回的XML中,name标签包含多个language子标签,期望将这些多语言名称整理为以语言ID为键、名称为值的数组(示例:$groupNames = ["1"=>"Visitatore","2"=>"Visitor","3"=>"Visiteur"])。

现有代码及问题场景

以下为当前实现代码及变量dump信息:

try {            
    $webService = new \PrestaShopWebservice($activeShop->url, $activeShop->apikey, false);        
    // 获取所有客户组
    $xml = $webService->get([
       'resource' => 'groups',
        ]);
} catch (\PrestaShopWebserviceException $ex) {
    $exception = str($ex->getMessage());
    return $exception;
}   

$resources = $xml->groups->children();
foreach ($resources as $resource) {
    $attributes = $resource->attributes();
    $resourceId = $attributes['id'];  

    try {                     
        // 获取单个客户组详情
        $xml2 = $webService->get([
           'resource' => 'groups',
           'id' => $resourceId
        ]);                
    } catch (\PrestaShopWebserviceException $ex) {
        $exception = str($ex->getMessage());                   
        return $exception;
    }

    $groupsFields = $xml2->group->children();                                 
    $name = $groupsFields->name;
    $name2 = $name->language;
    // 问题:无法正确提取多语言名称及对应语言ID
    // 尝试name2->attributes()无效
}

变量Dump信息

  • $groupsFields 输出(可正常访问常规字段):
SimpleXMLElement {#1378 ▼
  +"id": "1"
  +"reduction": "0.00"
  +"price_display_method": "1"
  +"show_prices": "1"
  +"date_add": "2020-10-07 15:20:23"
  +"date_upd": "2020-10-15 16:00:34"
  +"name": SimpleXMLElement {#1386 ▶}
}
  • $name2 输出(多语言名称节点):
SimpleXMLElement {#1379 ▼ 
  +"@attributes": array:1 [▶]
  +"0": "Visitatore"
  +"1": "Visitor"
  +"2": "Visiteur"
}

解决方法

问题出在对SimpleXMLElement的多节点遍历处理上,$name->language是一组包含语言ID属性的节点集合,需要遍历每个节点并提取属性和值:

修改后的核心代码

在原代码的$name = $groupsFields->name;之后,替换为以下逻辑:

$groupNames = [];
// 遍历所有language子节点
foreach ($name->language as $langNode) {
    // 获取语言ID属性
    $langId = (string)$langNode->attributes()['id'];
    // 获取当前语言的名称
    $langName = (string)$langNode;
    // 存入数组
    $groupNames[$langId] = $langName;
}

// 此时$groupNames即为目标格式数组
// 示例输出:["1"=>"Visitatore","2"=>"Visitor","3"=>"Visiteur"]

代码说明

  1. $name->language返回的是SimpleXMLElement对象集合,直接遍历即可逐个处理每个语言节点
  2. 使用(string)强制转换属性和节点值,避免保留SimpleXMLElement对象类型
  3. 最终得到的$groupNames数组完全符合以语言ID为键、名称为值的需求

优化建议

原代码中先获取所有客户组ID,再逐个调用详情接口,会产生大量API请求,可通过添加display参数一次性获取所有客户组的完整数据,减少请求次数:

// 获取所有客户组时直接请求完整字段
$xml = $webService->get([
   'resource' => 'groups',
   'display' => 'full' // 添加此参数返回所有字段,包括多语言名称
]);

// 后续无需再循环调用单个详情接口,直接解析$xml->groups->group即可
foreach ($xml->groups->group as $group) {
    $groupNames = [];
    foreach ($group->name->language as $langNode) {
        $langId = (string)$langNode->attributes()['id'];
        $langName = (string)$langNode;
        $groupNames[$langId] = $langName;
    }
    // 处理当前客户组数据
}

内容的提问来源于stack exchange,提问作者Luca Servile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:42:58