Почему один из многих атрибутов не обновляется с помощью SOAPV2 WS-I?
-
16-10-2019 - |
Вопрос
Я использую Magento CE 1.7.0.2 с SOAPV2 и WS-I. Я пытаюсь обновить продукты с catalogProductUpdate
-Метод.
Описание в примере кода ниже обновляется, но производитель-атрибут (= SELECT) не. Результат catalogProductUpdate
является bool(true)
.
Я попробовал некоторые (не слишком хороши, но я отчаянно нуждаюсь ;-)), такие как:
- назначить целочисленное значение 777
$manufacturer->value
Установите значение - Внутри/без поля дополнительной_аттрибуты установите идентификатор продукта (но я уверен, что ему нужно быть установлено в дополнительной_аттрибутах)
- установить имени производителя как
$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
Решение
Я наконец нашел причину проблемы и решения:
Проблема: SOAPV2 с WS-I не использует single_data
а также multi_data
атрибуты. Поэтому регистрация /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
в _prepareDataForSave
терпит неудачу. Метод _prepareDataForSave
проверяет на single_data
а также multi_data
которые оба не являются частью мыла, согласно WSDL для SOAPV2 с WS-I.
SOAPV2 (WSDL) - CatalogProductCreateEentity:
<element name="additional_attributes" type="typens:catalogProductAdditionalAttributesEntity" minOccurs="0"/>
SOAPV2 с WS -I (WSDL) - CatalogProductCreateEntity:
<xsd:element name="additional_attributes" type="typens:associativeArray" minOccurs="0">
</xsd:element>
AssociativeArray имеет тип Associativeentity, которая включает в себя пары ключей/значения. В SOAPV2 утолкну catalogProductAdditionalAttributesEntity
используется (который состоит из значений single_data и/или multi_data, которые снова включают пары ключей/значения).
Это часть WS-I SOAPV2, которая описывает формат дополнительной_аттрибуты:
<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
Сформулировано штраф, но проверка на single_data или multi_data всегда возвращалась false.
Решение:
Я нашел еще одну проблему с мылом здесь Где последний ответ был решением моей проблемы: https://stackoverflow.com/a/9502311/865443) Итак, я поместил этот блок в свой код в _prepareDataForSave
которая решила проблему установления значений дополнительной_аттрибуты:
if (gettype($productData->additional_attributes) == 'array') {
foreach ($productData->additional_attributes as $k => $v) {
$_attrCode = $k;
$productData->$_attrCode = $v;
}
}
Я надеюсь, что это поможет кому -то еще столкнуться с той же проблемой. Я также был бы признателен объяснение этого различия между SOAPV2 и SOAPV2 WS-I и/или другими способами, которые решили эту проблему.