¿Por qué uno de los muchos atributos no se actualiza con SOAPv2 WS-I?

18

Estoy usando Magento CE 1.7.0.2 con SOAPv2 y WS-I. Estoy tratando de actualizar productos con el catalogProductUpdatemétodo.

La descripción en el ejemplo de código a continuación se actualiza, pero el atributo del fabricante (= select) no. El resultado de catalogProductUpdatees bool(true).

Intenté algunas variaciones (no demasiado buenas, pero estoy desesperada ;-)) como:

  1. asigne el valor entero 777 para $manufacturer->valueestablecer el valor
  2. dentro / sin el campo Additional_attributes establezca la identificación del producto (pero estoy seguro de que debe establecerse dentro de Additional_attributes)
  3. establecer el nombre del fabricante como en $manufacturer->valuelugar del 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:

  • Lo probé con SOAPv2 sin WS-I, funciona bien.
  • También creé otro atributo para probar con la misma configuración (Desplegable, Alcance, ...) que tampoco se actualiza con SOAPv2 WS-I pero sí con SOAPv2. Por lo tanto, estos atributos recién creados se comportan como el atributo del fabricante.
  • Intentar establecer el valor de un campo de texto dentro de los atributos adicionales no funciona tampoco.

¿Alguna idea, enlaces, sugerencias sobre esto?

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

Anna Völkl
fuente

Respuestas:

14

Finalmente encontré la razón del problema y la solución:

El problema: SOAPv2 con WS-I no utiliza los atributos single_datay multi_data. Por lo tanto, el check /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpin _prepareDataForSavefalla. El método _prepareDataForSaveverifica single_datay multi_datano forman parte de la llamada SOAP, de acuerdo con WSDL para 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 es de tipo associativeEntity que incluye pares clave / valor. En SOAPv2 withous WS-I, catalogProductAdditionalAttributesEntityse utiliza el (que consiste en valores de datos únicos y / o múltiples datos que nuevamente incluyen pares clave / valor).

Esta es la parte SOAPv2 WS-I del WSDL que describe el formato de atributos_adicionales:

<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 verificación de /app/code/core/Mage/Catalog/Model/Product/Api/V2.phpatributos adicionales está bien redactada, pero la verificación de datos únicos o datos múltiples siempre devuelve falso.

La solución:

Encontré otro problema de SOAP aquí donde la última respuesta fue la solución a mi problema: /programming//a/9502311/865443 ). Así que puse este bloque en mi código en el _prepareDataForSaveque resolvió el problema de establecer los valores de atributos_adicionales:

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

Espero que esto ayude a alguien a encontrar el mismo problema. También agradecería una explicación para esta diferencia entre SOAPv2 y SOAPv2 WS-I y / u otras formas que resolvieron este problema.

Anna Völkl
fuente