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.
I do not know why, but it works now.
I think that the cause for this was /tmp folder on my server. I forgot to clear it after I'd made above changes yesterday.
Sorry for being inattentive:(
Best Answer
The answer;
You can add extra attributrs to catalogProductInfo, http://devdocs.magento.com/guides/m1x/api/soap/catalog/catalogProduct/catalog_product.info.html
More information; https://lornajane.net/posts/2010/retrieving-product-attributes-from-magentos-v2-api
Example code for additional_attributes;
var attributes = new catalogProductRequestAttributes {additional_attributes = new[] {"barcode"}};
var productInfo = _magentoService.catalogProductInfo(_magentoLogin, _productId, null, attributes, null)