Por que um dos muitos atributos não é atualizado com o SOAPv2 WS-I?

18

Estou usando o Magento CE 1.7.0.2 com SOAPv2 e WS-I. Estou tentando atualizar produtos com o catalogProductUpdate-Method.

A descrição no exemplo de código abaixo é atualizada, mas o atributo do fabricante (= select) não. O resultado de catalogProductUpdateé bool(true).

Eu tentei algumas variações (não muito boas, mas estou desesperada ;-)) como:

  1. atribua o valor inteiro 777 para $manufacturer->valuedefinir o valor
  2. dentro / sem o campo Additional_attributes, defina o ID do produto (mas tenho certeza de que ele precisa ser definido em Additional_attributes)
  3. defina o nome do fabricante como em $manufacturer->valuevez do valor 777

Código:

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

Editar:

  • Eu testei com SOAPv2 sem WS-I - funciona bem.
  • Também criei outro atributo para testar com as mesmas configurações (Dropdown, Scope, ...) que também não são atualizadas com o SOAPv2 WS-I, mas com o SOAPv2. Portanto, esses atributos recém-criados se comportam como atributo de fabricante.
  • Tentar definir o valor de um campo de texto dentro dos atributos_ adicionais não funciona também.

Alguma idéia, links, sugestões sobre isso?

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

Anna Völkl
fonte

Respostas:

14

Finalmente encontrei o motivo do problema e a solução:

O problema: SOAPv2 com WS-I não usa o single_datae multi_dataatributos. Portanto, o check- /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpin _prepareDataForSavefalha. O método _prepareDataForSaveverifica single_datae multi_datanão faz parte da chamada SOAP, de acordo com o WSDL para SOAPv2 com WS-I.

SOAPv2 (WSDL) - catalogProductCreateEntity:

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

SOAPv2 com WS-I (WSDL) - catalogProductCreateEntity:

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

associativeArray é do tipo associativeEntity, que inclui pares de chave / valor. No SOAPv2 sem WS-I, catalogProductAdditionalAttributesEntityé usado (que consiste em valores de dados únicos e / ou dados múltiplos que incluem novamente pares de chave / valor).

Esta é a parte SOAPv2 WS-I do WSDL que descreve o formato de atributos_ adicionais:

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

A verificação de /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpatributos_ adicionais adicional está correta, mas a verificação de dados únicos ou dados múltiplos sempre retornava false.

A solução:

Encontrei outro problema SOAP aqui, onde a última resposta foi a solução para o meu problema: /programming//a/9502311/865443 ). Então, eu coloquei esse bloco no meu código no _prepareDataForSavequal resolveu o problema de definir os valores de adicional_attributes:

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

Espero que isso ajude alguém a encontrar o mesmo problema. Também gostaria de receber uma explicação para essa diferença entre SOAPv2 e SOAPv2 WS-I e / ou outras formas de solucionar esse problema.

Anna Völkl
fonte