Pourquoi l'un des nombreux attributs n'est-il pas mis à jour avec SOAPv2 WS-I?

18

J'utilise Magento CE 1.7.0.2 avec SOAPv2 et WS-I. J'essaie de mettre à jour les produits avec la catalogProductUpdateméthode -M.

La description dans l'exemple de code ci-dessous est mise à jour, mais pas l'attribut fabricant (= select). Le résultat de catalogProductUpdateest bool(true).

J'ai essayé des variations (pas trop bonnes, mais je suis désespéré ;-)) telles que:

  1. attribuer la valeur entière 777 pour $manufacturer->valuedéfinir la valeur
  2. dans / sans le champ additional_attributes définissez l'identifiant du produit (mais je suis sûr qu'il doit être défini dans additional_attributes)
  3. définissez le nom du fabricant au $manufacturer->valuelieu de la valeur 777

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

Éditer:

  • Je l'ai testé avec SOAPv2 sans WS-I - fonctionne très bien.
  • J'ai également créé un autre attribut pour les tests avec les mêmes paramètres (Dropdown, Scope, ...) qui n'est pas non plus mis à jour avec SOAPv2 WS-I mais le fait avec SOAPv2. Ces nouveaux attributs se comportent donc comme l'attribut fabricant.
  • Essayer de définir la valeur d'un champ de texte dans les attributs_supplémentaires ne fonctionne pas non plus.

Des idées, des liens, des suggestions à ce sujet?

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

Anna Völkl
la source

Réponses:

14

J'ai finalement trouvé la raison du problème et la solution:

Le problème: SOAPv2 avec WS-I n'utilise pas les attributs single_dataet multi_data. Par conséquent , le chèque /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpen _prepareDataForSaveéchec. La méthode _prepareDataForSavevérifie single_dataet multi_dataqui ne font pas partie de l'appel SOAP, selon le WSDL pour SOAPv2 avec WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 avec WS-I (WSDL) - catalogProductCreateEntity:

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

associativeArray est de type associativeEntity qui inclut des paires clé / valeur. Dans SOAPv2 avec WS-I, le catalogProductAdditionalAttributesEntityest utilisé (qui se compose de valeurs single_data et / ou multi_data qui incluent à nouveau des paires clé / valeur).

Il s'agit de la partie SOAPv2 WS-I du WSDL qui décrit le format des attributs_supplémentaires:

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

La vérification pour additional_attributes était /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpbien, mais la vérification pour single_data ou multi_data retournait toujours false.

La solution:

J'ai trouvé un autre problème SOAP ici où la dernière réponse était la solution à mon problème: /programming//a/9502311/865443 ). J'ai donc mis ce bloc dans mon code dans _prepareDataForSavelequel a résolu le problème de définition des valeurs additional_attributes:

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

J'espère que cela aide quelqu'un d'autre à rencontrer le même problème. J'apprécierais également une explication de cette différence entre SOAPv2 et SOAPv2 WS-I et / ou d'autres moyens qui ont résolu ce problème.

Anna Völkl
la source