Perché uno dei tanti attributi non viene aggiornato con SOAPv2 WS-I?


18

Sto usando Magento CE 1.7.0.2 con SOAPv2 e WS-I. Sto cercando di aggiornare i prodotti con il catalogProductUpdate-Method.

La descrizione nell'esempio di codice seguente viene aggiornata, ma l'attributo produttore (= seleziona) no. Il risultato di catalogProductUpdateè bool(true).

Ho provato alcune (non troppo buone, ma sono disperate ;-)) variazioni come:

  1. assegnare il valore intero 777 per $manufacturer->valueimpostare il valore
  2. entro / senza il campo additional_attributes imposta l'id del prodotto (ma sono sicuro che deve essere impostato in additional_attributes)
  3. imposta il nome del produttore al $manufacturer->valueposto del valore 777

Codice:

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

Modificare:

  • L'ho provato con SOAPv2 senza WS-I - funziona benissimo.
  • Ho anche creato un altro attributo per i test con le stesse impostazioni (Dropdown, Scope, ...) che non viene aggiornato con SOAPv2 WS-I ma lo fa con SOAPv2. Quindi questi attributi appena creati si comportano come l'attributo del produttore.
  • Anche il tentativo di impostare il valore di un campo di testo all'interno degli attributi_attributi non funziona.

Qualche idea, link, suggerimenti su questo?

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

Risposte:


14

Alla fine ho trovato il motivo del problema e la soluzione:

Il problema: SOAPv2 con WS-I non utilizza gli attributi single_datae multi_data. Pertanto il check- /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpin _prepareDataForSavenon riesce. Il metodo _prepareDataForSavecontrolla single_datae multi_datache non fanno entrambi parte della SOAP-Call, secondo WSDL per SOAPv2 con WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 con WS-I (WSDL) - catalogProductCreateEntity:

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

associativeArray è di tipo associativeEntity che include coppie chiave / valore. In SOAPv2 withous WS-I, catalogProductAdditionalAttributesEntityviene utilizzato (che consiste in valori single_data e / o multi_data che includono nuovamente coppie chiave / valore).

Questa è la parte SOAPv2 WS-I del WSDL che descrive il formato di additional_attributes:

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

Il controllo per additional_attributes è /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpcorretto, ma il controllo per single_data o multi_data ha sempre restituito false.

La soluzione:

Ho trovato un altro problema SOAP qui dove l'ultima risposta è stata la soluzione al mio problema: /programming//a/9502311/865443 ). Quindi ho inserito questo blocco nel mio codice in _prepareDataForSavecui ho risolto il problema di impostazione dei valori additional_attributes:

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

Spero che questo aiuti qualcun altro a riscontrare lo stesso problema. Gradirei anche una spiegazione per questa differenza tra SOAPv2 e SOAPv2 WS-I e / o altri modi che hanno risolto questo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.