¿Por qué uno de los muchos atributos no se actualiza con SOAPv2 WS-I?
-
16-10-2019 - |
Pregunta
Estoy usando Magento CE 1.7.0.2 con SOAPv2 y WS-I.
Estoy tratando de actualizar los productos con el catalogProductUpdate
-Método.
La descripción en el ejemplo de código siguiente se actualiza, pero el fabricante de atributos (= seleccionar) no lo hace.
El resultado de catalogProductUpdate
es bool(true)
.
He intentado algunas (no demasiado bueno, pero estoy desesperada ;-)) variaciones tales como:
- asignar el valor entero 777 a
$manufacturer->value
establecer el valor - dentro / fuera del campo de la additional_attributes configurar el identificador del producto (pero estoy seguro de que la necesidad de que se creará dentro de additional_attributes)
- establece el fabricante y nombre que
$manufacturer->value
en lugar 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 he comprobado con SOAPv2 sin WS-I -. Bien funciona
- también creé otro atributo para el ensayo con la misma configuración (desplegable, Alcance, ...) que también no se actualizan con SOAPv2 WS-I, pero lo hace con SOAPv2. Por lo que estos atributos recién creados comportarse como el fabricante-atributo.
- Tratar de establecer el valor de un campo de texto dentro de los additional_attributes no funciona bien.
Todas las ideas, enlaces, sugerencias sobre esto?
Enlace: http://www.magentocommerce.com/api/soap/ catálogo / catalogProduct / catalog_product.update.html
Solución
Finalmente encontré la razón del problema y la solución:
El problema: SOAPv2 con WS-I no utiliza los atributos single_data
y multi_data
. Por lo tanto el proceso de registro en /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
_prepareDataForSave
falla.
Los controles método _prepareDataForSave
para single_data
y multi_data
que son tanto no forma parte de la de SOAP-Call, de acuerdo con el 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>
vector asociativo es de associativeEntity tipo que incluye pares de valores clave /. En SOAPv2 withous WS-I, se utiliza el catalogProductAdditionalAttributesEntity
(que consiste en single_data y / o valores multi_data que a su vez incluyen pares de valores clave /).
Esta es la parte SOAPv2 WS-I del WSDL que describe el formato de 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>
El cheque por additional_attributes /app/code/core/Mage/Catalog/Model/Product/Api/V2.php
redactado bien, pero el cheque por falsa single_data o multi_data siempre regresaba.
La solución:
he encontrado otra de SOAP Problema aquí donde la última respuesta era la solución a mi problema: https://stackoverflow.com/a/ 9502311/865443 ).
Así que puse este bloque en mi código en _prepareDataForSave
que resolvió el problema de la fijación de los valores additional_attributes:
if (gettype($productData->additional_attributes) == 'array') {
foreach ($productData->additional_attributes as $k => $v) {
$_attrCode = $k;
$productData->$_attrCode = $v;
}
}
espero que esto ayude a alguien más encontrarse con el mismo problema. También apreciaría una explicación para este differencde entre SOAPv2 y SOAPv2 WS-I y / o de otras maneras que resuelven este problema.