如何通过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"]
代码说明
$name->language返回的是SimpleXMLElement对象集合,直接遍历即可逐个处理每个语言节点- 使用
(string)强制转换属性和节点值,避免保留SimpleXMLElement对象类型 - 最终得到的
$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
相关产品推荐
相关产品推荐

