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.
Best Answer
Diagnosing your actual problem:
manufacturer
attr is set for the appropriate store view! In the manage catalog product edit view, ensure that the dropdown is being set for the value of the store view, not the store/website/default view.$ php shell/indexer.php reindexall
.rm -rf var/cache
and all the destructive things. Check for the existance of a/tmp/magento
folder.Enabling an attribute for frontend/product page/collection visibility:
Why this happens:
So, there is a valid reason why Magento returns "No" when there is no data available. The method
getFrontend
returns an object that is a subclass ofMage_Eav_Model_Entity_Attribute_Frontend_Abstract
.In the method
getValue
, if there are no options available / set, it defaults to output boolean. Thus, the value of "No" - which is the frontend boolean equivalent offalse
:Once the above troubleshooting points are done - if you still receive "No" and it's an appropriate response (e.g. you have no manufacturer set on a product, and on purpose) you may want to conditionally test the output before echoing: