18

I'm using Magento CE 1.7.0.2 with SOAPv2 and WS-I. I'm trying to update products with the catalogProductUpdate-Method.

The description in the code example below gets updated, but the manufacturer-attribute (=select) doesn't. The result of catalogProductUpdate is bool(true).

I tried some (not too good, but I'm desperate ;-) ) variations such as:

  1. assign the integer value 777 to $manufacturer->value set the value
  2. within/without the additional_attributes field set the product id (but I'm sure it need's to be set within additional_attributes)
  3. set the manufacturer-name as $manufacturer->value instead of the value 777

Code:

$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'
    ));

Edit:

  • I tested it with SOAPv2 without WS-I - works fine.
  • I also created another attribute for testing with the same settings (Dropdown, Scope,...) which also doesn't get updated with SOAPv2 WS-I but does with SOAPv2. So these newly created attributes behave as the manufacturer-attribute.
  • Trying to set the value of a text-field within the additional_attributes doesn't work either.

Any ideas, links, suggestions on this?

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

14

I finally found the reason for the problem and the solution:

The problem: SOAPv2 with WS-I does not use the single_data and multi_data attributes. Therefore the check in /app/code/core/Mage/Catalog/Model/Product/Api/V2.php in _prepareDataForSave fails. The method _prepareDataForSave checks for single_data and multi_data which are both not part of the SOAP-Call, according to the WSDL for SOAPv2 with WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 with WS-I (WSDL) - catalogProductCreateEntity:

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

associativeArray is of type associativeEntity which includes key/value pairs. In SOAPv2 withous WS-I, the catalogProductAdditionalAttributesEntity is used (which consists of single_data and/or multi_data values which again include key/value pairs).

This is the SOAPv2 WS-I part of the WSDL which describes the format of additional_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>

The check for additional_attributes /app/code/core/Mage/Catalog/Model/Product/Api/V2.php worded fine, but the check for single_data or multi_data always returned false.

The solution:

I found another SOAP Problem here where the last answer was the solution to my problem: https://stackoverflow.com/a/9502311/865443). So I put this block in my code in _prepareDataForSave which solved the problem of setting the additional_attributes values:

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

I hope this helps someone else encountering the same problem. I would also appreciate an explanation for this differencde between SOAPv2 and SOAPv2 WS-I and/or other ways which solved this problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.