Warum wird eines von vielen Attributen mit SOAPv2 WS-I nicht aktualisiert?

18

Ich verwende Magento CE 1.7.0.2 mit SOAPv2 und WS-I. Ich versuche, Produkte mit der catalogProductUpdate-Methode zu aktualisieren .

Die Beschreibung im folgenden Codebeispiel wird aktualisiert, das Herstellerattribut (= select) jedoch nicht. Das Ergebnis von catalogProductUpdateist bool(true).

Ich habe einige (nicht allzu gute, aber ich bin verzweifelt ;-)) Variationen ausprobiert, wie zum Beispiel:

  1. Weisen Sie den ganzzahligen Wert 777 zu, $manufacturer->valueum den Wert festzulegen
  2. innerhalb / außerhalb des Feldes additional_attributes die Produkt-ID festlegen (aber ich bin sicher, dass diese in additional_attributes festgelegt werden muss)
  3. Stellen Sie den Herstellernamen $manufacturer->valueanstelle des Wertes 777 ein

Code:

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

Bearbeiten:

  • Ich habe es mit SOAPv2 ohne WS-I getestet - funktioniert gut.
  • Ich habe auch ein weiteres Attribut zum Testen mit denselben Einstellungen (Dropdown, Scope, ...) erstellt, das mit SOAPv2 WS-I ebenfalls nicht aktualisiert wird, aber mit SOAPv2. Diese neu erstellten Attribute verhalten sich also wie das Herstellerattribut.
  • Der Versuch, den Wert eines Textfeldes innerhalb der additional_attributes festzulegen, funktioniert ebenfalls nicht.

Irgendwelche Ideen, Links, Vorschläge dazu?

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

Anna Völkl
quelle

Antworten:

14

Ich habe endlich den Grund für das Problem und die Lösung gefunden:

Das Problem: SOAPv2 mit WS-I verwendet die Attribute single_dataund nicht multi_data. Daher schlägt der Check- /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpin _prepareDataForSavefehl. Die Methode _prepareDataForSaveprüft , ob single_dataund multi_datawelche nicht Teil des SOAP-Aufrufs sind, gemäß der WSDL für SOAPv2 mit WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 mit WS-I (WSDL) - catalogProductCreateEntity:

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

associativeArray ist vom Typ associativeEntity, der Schlüssel / Wert-Paare enthält. In SOAPv2 mit WS-I wird der catalogProductAdditionalAttributesEntityverwendet (der aus Single_Data- und / oder Multi_Data-Werten besteht, die wiederum Schlüssel / Wert-Paare enthalten).

Dies ist der SOAPv2 WS-I-Teil der WSDL, der das Format von additional_attributes beschreibt:

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

Die Prüfung auf Additional_attributes hatte einen /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpguten Wortlaut, aber die Prüfung auf Single_Data oder Multi_Data gab immer false zurück.

Die Lösung:

Ich habe hier ein anderes SOAP-Problem gefunden, bei dem die letzte Antwort die Lösung meines Problems war: /programming//a/9502311/865443 ). Also habe ich diesen Block in meinen Code eingefügt, in _prepareDataForSavedem das Problem des Einstellens der additional_attributes-Werte behoben wurde:

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

Ich hoffe, dass dies jemand anderem hilft, der auf dasselbe Problem stößt. Ich würde mich auch über eine Erklärung für diesen Unterschied zwischen SOAPv2 und SOAPv2 WS-I und / oder andere Möglichkeiten freuen, die dieses Problem gelöst haben.

Anna Völkl
quelle