Dlaczego jeden z wielu atrybutów nie jest aktualizowany w SOAPv2 WS-I?


18

Używam Magento CE 1.7.0.2 z SOAPv2 i WS-I. Próbuję zaktualizować produkty za pomocą opcji catalogProductUpdate-Method.

Opis w poniższym przykładzie kodu zostanie zaktualizowany, ale atrybut producenta (= wybierz) nie. Wynik catalogProductUpdatejest bool(true).

Próbowałem (nie za dobrze, ale jestem zdesperowany ;-)) odmian, takich jak:

  1. przypisz wartość całkowitą 777, aby $manufacturer->valueustawić wartość
  2. w polu / bez pola dodatkowe_ atrybuty ustaw identyfikator produktu (ale jestem pewien, że należy je ustawić w ramach dodatkowych atrybutów)
  3. ustaw nazwę producenta jako $manufacturer->valuezamiast wartości 777

Kod:

$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'
    ));

Edytować:

  • Testowałem go z SOAPv2 bez WS-I - działa dobrze.
  • Stworzyłem również inny atrybut do testowania z tymi samymi ustawieniami (Dropdown, Scope, ...), który również nie jest aktualizowany w SOAPv2 WS-I, ale robi to w SOAPv2. Te nowo utworzone atrybuty zachowują się jak atrybut producenta.
  • Próba ustawienia wartości pola tekstowego w dodatkowych atrybutach również nie działa.

Wszelkie pomysły, linki, sugestie na ten temat?

Link: http://www.magentocommerce.com/api/soap/catalog/catalogProduct/catalog_product.update.html

Odpowiedzi:


14

W końcu znalazłem przyczynę problemu i rozwiązanie:

Problem: SOAPv2 z WS-I nie używa atrybutów single_datai multi_data. Dlatego zameldowanie /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpsię w hotelu _prepareDataForSavezawodzi. Metoda _prepareDataForSavesprawdza, single_datai multi_dataktóre nie są częścią wywołania SOAP, zgodnie z WSDL dla SOAPv2 z WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 z WS-I (WSDL) - catalogProductCreateEntity:

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

AssociativeArray jest typu AssociativeEntity, który obejmuje pary klucz / wartość. W SOAPv2 z dużą liczbą WS-I, catalogProductAdditionalAttributesEntityużywana jest (która składa się z wartości single_data i / lub multi_data, które ponownie zawierają pary klucz / wartość).

Jest to część WSDL SOAPv2 WS-I, która opisuje format dodatkowych atrybutów:

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

Sprawdzanie dodatkowych /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpatrybutów brzmiało dobrze, ale sprawdzanie pojedynczych danych lub wielu danych zawsze zwracało wartość false.

Rozwiązanie:

Znalazłem inny problem SOAP , w którym ostatnia odpowiedź była rozwiązaniem mojego problemu: /programming//a/9502311/865443 ). Wstawiłem więc ten blok do mojego kodu, w _prepareDataForSavektórym rozwiązałem problem ustawiania wartości dodatkowych atrybutów:

if (gettype($productData->additional_attributes) == 'array') {
            foreach ($productData->additional_attributes as $k => $v) {
                    $_attrCode = $k;
                    $productData->$_attrCode = $v;
            }
  }

Mam nadzieję, że pomoże to komuś napotkać ten sam problem. Byłbym również wdzięczny za wyjaśnienie tej różnicy między SOAPv2 i SOAPv2 WS-I i / lub innymi sposobami, które rozwiązały ten problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.