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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.