Чому один з багатьох атрибутів не оновлюється SOAPv2 WS-I?


18

Я використовую Magento CE 1.7.0.2 з SOAPv2 та WS-I. Я намагаюся оновити продукти за допомогою catalogProductUpdate-Method.

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

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

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

<element name="additional_attributes" type="typens:catalogProductAdditionalAttributesEntity" minOccurs="0"/>

SOAPv2 з WS-I (WSDL) - каталогProductCreateEntity:

<xsd:element name="additional_attributes" type="typens:associativeArray" minOccurs="0">
</xsd:element>

associativeArray має тип associativeEntity, який включає пари ключ / значення. У SOAPv2 з WS-I catalogProductAdditionalAttributesEntityвикористовується значення (яке складається з значень single_data та / або multi_data, які знову включають пари ключ / значення).

Це частина SOAPv2 WS-I WSDL, яка описує формат додаткових_абтертів:

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

Перевірка на additional_attributes /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpсформульованого штраф, але чек на single_data або multi_data завжди повертаються FALSE.

Рішення:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.