Почему один из многих атрибутов не обновляется с помощью SOAPv2 WS-I?
Я использую Magento CE 1.7.0.2 с SOAPv2 и WS-I.
Я пытаюсь обновить продукты с помощью метода catalogProductUpdate
-.
Описание в приведенном ниже примере кода обновляется, но атрибут производителя (=select) не обновляется.
Результатом catalogProductUpdate
является bool(true)
.
Я попробовал некоторые (не слишком хорошие, но я в отчаянии;-)) варианты, такие как:
- присвойте целочисленное значение 777
$manufacturer->value
установите значение - в пределах/без набора полей additional_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'
));
Изменить:
- Я протестировал его с SOAPv2 без WS-I - работает нормально.
- Я также создал еще один атрибут для тестирования с теми же настройками (выпадающий список, область действия,...), который также не обновляется с помощью SOAPv2 WS-I, но обновляется с помощью SOAPv2. Таким образом, эти вновь созданные атрибуты ведут себя как производитель- атрибут.
- Попытка установить значение текстового поля в дополнительных атрибутах также не работает.
Есть идеи, ссылки, предложения по этому поводу?
Ссылка: http://www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.update.html
1 answers
Я, наконец, нашел причину проблемы и решение:
Проблема: SOAPv2 с WS-I не использует атрибуты single_data
и multi_data
. Поэтому проверка /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
в _prepareDataForSave
завершается неудачей.
Метод _prepareDataForSave
проверяет наличие single_data
и multi_data
, которые оба не являются частью вызова SOAP, в соответствии с WSDL для SOAPv2 с WS-I.
SOAPV2 (WSDL) - каталог productcreateentity:
<element name="additional_attributes" type="typens:catalogProductAdditionalAttributesEntity" minOccurs="0"/>
SOAPV2 с WS-I (WSDL) - каталогпродуктсоздания:
<xsd:element name="additional_attributes" type="typens:associativeArray" minOccurs="0">
</xsd:element>
Ассоциативный массив имеет тип associativeEntity, который включает пары ключ/значение. В SOAPv2 с WS-I используется catalogProductAdditionalAttributesEntity
(который состоит из значений single_data и/или multi_data, которые снова включают пары ключ/значение).
Это часть WSDL SOAPV2 WS-I, которая описывает формат дополнительных атрибутов:
<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>
Проверка дополнительных атрибутов /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
сформулирована нормально, но проверка на одно_данные или многоданные всегда возвращено значение false.
Решение:
Я нашел еще одну проблему с SOAP здесь , где последний ответ был решением моей проблемы: https://stackoverflow.com/a/9502311/865443 ).
Поэтому я поместил этот блок в свой код в _prepareDataForSave
, который решил проблему установки значений additional_attributes:
if (gettype($productData->additional_attributes) == 'array') {
foreach ($productData->additional_attributes as $k => $v) {
$_attrCode = $k;
$productData->$_attrCode = $v;
}
}
Я надеюсь, что это поможет кому-то другому, столкнувшемуся с такой же проблемой. Я также был бы признателен за объяснение этой разницы между SOAPv2 и SOAPv2 WS-I и/или другими способами, которые решили эту проблему.