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

18

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

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

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

  1. назначьте целочисленное значение 777, чтобы $manufacturer->valueустановить значение
  2. в / без поля Additional_attributes задайте идентификатор продукта (но я уверен, что его нужно установить в 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 - работает нормально.
  • Я также создал еще один атрибут для тестирования с теми же настройками (Dropdown, Scope, ...), который также не обновляется с SOAPv2 WS-I, а с SOAPv2. Таким образом, эти вновь созданные атрибуты ведут себя как производитель-атрибут.
  • Попытка установить значение текстового поля в Additional_attributes также не работает.

Есть идеи, ссылки, предложения по этому поводу?

Ссылка: http://www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.update.html

Анна Фёлькл
источник

Ответы:

14

Я наконец нашел причину проблемы и решение:

Проблема: 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) - catalogProductCreateEntity:

<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>

ассоциативный массив имеет тип ассоциативного типа, который включает пары ключ / значение. В 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 сформулированного штраф, но чек на single_data или multi_data всегда возвращаются FALSE.

Решение:

Я нашел другую SOAP Проблемы здесь , где последний ответ был решением моей проблемы: /programming//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 и / или другими способами, которые решили эту проблему.

Анна Фёлькл
источник