为什么SOAPv2 WS-I无法更新许多属性之一?


18

我将Magento CE 1.7.0.2与SOAPv2和WS-I结合使用。我正在尝试使用catalogProductUpdate-Method 更新产品。

下面的代码示例中的描述已更新,但制造商属性(= select)未更新。的结果catalogProductUpdatebool(true)

我尝试了一些(不太好,但我很拼命;-)),例如:

  1. 分配整数值777来$manufacturer->value设置值
  2. 在extra_attributes字段之内/之外,设置产品ID(但我确定需要在Additional_attributes中设置)
  3. 将制造商名称设置为$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进行了测试-正常工作。
  • 我还创建了另一个用于测试的属性,它们具有相同的设置(Dropdown,Scope等),该属性也不会随SOAPv2 WS-I一起更新,但会随SOAPv2一起更新。因此,这些新创建的属性充当制造商属性。
  • 尝试在Additional_attributes中设置文本字段的值也不起作用。

有任何想法,链接,建议吗?

链接:http//www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.update.html

Answers:


14

我终于找到了问题的原因和解决方案:

问题:带有WS-I的SOAPv2不使用single_datamulti_data属性。因此,签/app/code/core/Mage/Catalog/Model/Product/Api/V2.php_prepareDataForSave失败。该方法_prepareDataForSave用于检查single_datamulti_data其是SOAP-呼叫的两个不一部分,根据的WSDL为SOAPv2与WS-I。

SOAPv2(WSDL)-catalogProductCreateEntity:

<element name="additional_attributes" type="typens:catalogProductAdditionalAttributesEntity" minOccurs="0"/>

带有WS-I(WSDL)的SOAPv2-catalogProductCreateEntity:

<xsd:element name="additional_attributes" type="typens:associativeArray" minOccurs="0">
</xsd:element>

associativeArray的类型为associativeEntity,其中包含键/值对。在带有WS-I的SOAPv2中,catalogProductAdditionalAttributesEntity使用了(由单数据和/或多数据值组成,它们又包含键/值对)。

这是WSDL的SOAPv2 WS-I部分,描述了extra_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>

在检查additional_attributes /app/code/core/Mage/Catalog/Model/Product/Api/V2.php措辞罚款,但对于single_data或multi_data总是返回false检查。

解决方案:

我在这里找到了另一个SOAP问题,最后一个答案是解决我的问题的方法:https : //stackoverflow.com/a/9502311/865443)。因此,我将此代码块放入了代码中_prepareDataForSave,该代码解决了设置extra_attributes值的问题:

if (gettype($productData->additional_attributes) == 'array') {
            foreach ($productData->additional_attributes as $k => $v) {
                    $_attrCode = $k;
                    $productData->$_attrCode = $v;
            }
  }

我希望这可以帮助其他人遇到相同的问题。对于SOAPv2和SOAPv2 WS-I和/或其他解决此问题的方式之间的区别,我也将不胜感激。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.