为什么soapv2 ws-i不会更新众多属性之一?
-
16-10-2019 - |
题
我正在使用SOAPV2和WS-I的Magento CE 1.7.0.2。我正在尝试使用 catalogProductUpdate
-方法。
下面的代码示例中的描述已更新,但是制造商-Attribute(= select)却没有。的结果 catalogProductUpdate
是 bool(true)
.
我尝试了一些(不太好,但我很拼命;-))变体,例如:
- 将整数值777分配给
$manufacturer->value
设置值 - 在内部/不添加额外的_attributes字段设置产品ID(但我确定需要在附加_attributes中设置它)
- 将制造商名称设置为
$manufacturer->value
而不是价值777
代码:
$newProductData = new stdClass();
$additionalAttrs = array();
$manufacturer = new stdClass();
$manufacturer->key = "manufacturer";
$manufacturer->value = "777";
$additionalAttrs['single_data'][] = $manufacturer;
$newProductData->description = "Description Test1";
$newProductData->additional_attributes = $additionalAttrs;
$result = $client->catalogProductUpdate((object)array('sessionId' => $sessionId,
'productId' => "2110000010058 ",
'productData' => (object)$newProductData,
NULL,
'sku'
));
编辑:
- 我用没有WS -I的SOAPV2对其进行了测试 - 正常工作。
- 我还创建了另一个用于使用相同设置(下拉范围,范围,...)进行测试的属性,该设置也不会使用SOAPV2 WS-I更新,但使用SOAPV2进行了更新。因此,这些新创建的属性作为制造商 - 属性行为。
- 尝试在附加_attributes中设置文本场的值也行不通。
对此有任何想法,链接,建议吗?
关联:http://www.magentocommerce.com/api/soap/catalog/catalogproduct/catalog_product.update.html
解决方案
我终于找到了问题和解决方案的原因:
问题:带有WS-I的SOAPV2不使用 single_data
和 multi_data
属性。因此入住 /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
在 _prepareDataForSave
失败。方法 _prepareDataForSave
检查 single_data
和 multi_data
根据WS-I的WSDL,这两者都不是肥皂呼叫的一部分。
SOAPV2(WSDL) - calogproductuctucteeentity:
<element name="additional_attributes" type="typens:catalogProductAdditionalAttributesEntity" minOccurs="0"/>
带有WS -I(WSDL)的SOAPV2- calogproductuctecreateentity:
<xsd:element name="additional_attributes" type="typens:associativeArray" minOccurs="0">
</xsd:element>
AssociativeArray具有类型的关联性,其中包括密钥/值对。在soapv2中,ws-i, catalogProductAdditionalAttributesEntity
使用(由单_DATA和/或MULTI_DATA值组成,再次包括键/值对)。
这是WSDL的SOAPV2 WS-I一部分,描述了附加_attributes的格式:
<xsd:complexType name="associativeEntity">
<xsd:sequence>
<xsd:element name="key" type="xsd:string"/>
<xsd:element name="value" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="associativeArray">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" name="complexObjectArray" type="typens:associativeEntity"/>
</xsd:sequence>
</xsd:complexType>
检查附加_ATTRIBUTE的检查 /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
措辞正常,但是单_data或multi_data的检查总是返回false。
解决方案:
我发现了另一个肥皂问题 这里 最后一个答案是解决我问题的方法: https://stackoverflow.com/a/9502311/865443)。所以我将这个块放在我的代码中 _prepareDataForSave
解决了设置附加_attributes值的问题:
if (gettype($productData->additional_attributes) == 'array') {
foreach ($productData->additional_attributes as $k => $v) {
$_attrCode = $k;
$productData->$_attrCode = $v;
}
}
我希望这可以帮助其他人遇到同样的问题。我还要感谢SOAPV2和SOAPV2 WS-I和/或其他解决此问题的方法之间的差异解释。