Почему один из многих атрибутов не обновляется с помощью SOAPv2 WS-I?


Я использую Magento CE 1.7.0.2 с SOAPv2 и WS-I. Я пытаюсь обновить продукты с помощью метода catalogProductUpdate-.

Описание в приведенном ниже примере кода обновляется, но атрибут производителя (=select) не обновляется. Результатом catalogProductUpdate является bool(true).

Я попробовал некоторые (не слишком хорошие, но я в отчаянии;-)) варианты, такие как:

  1. присвойте целочисленное значение 777 $manufacturer->value установите значение
  2. в пределах/без набора полей additional_attributes идентификатор продукта (но я уверен, что его нужно установить в дополнительных атрибутах)
  3. установите имя производителя как $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

Author: Prince Patel, 2013-03-12

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 и/или другими способами, которые решили эту проблему.

 14
Author: Anna Völkl, 2017-05-23 12:37:13