Jump to content

Problemas actualizando productos por WebService


Recommended Posts

Hola.

Estoy utilizando el WebService de Prestashop para crear/modificar artículos, subiendo imágenes, actualizando stocks, etc... y todo me va bien salvo un detalle cuando modifico los productos; la modificación de los datos que le paso la hace correctamente, pero me borra los metadatos que ya tiene el producto, aunque en la petición que le envío al WS para modificar no le hago mención a los campos de metadatos. Alguien le ha pasado lo mismo o sabe como solucionarlo?

Gracias!

Link to comment
Share on other sites

On 2/5/2019 at 2:45 AM, Victor Casajuana Mas said:

Hola.

Estoy utilizando el WebService de Prestashop para crear/modificar artículos, subiendo imágenes, actualizando stocks, etc... y todo me va bien salvo un detalle cuando modifico los productos; la modificación de los datos que le paso la hace correctamente, pero me borra los metadatos que ya tiene el producto, aunque en la petición que le envío al WS para modificar no le hago mención a los campos de metadatos. Alguien le ha pasado lo mismo o sabe como solucionarlo?

Gracias!

como los ws de prestashop son SOAP mandas todo el esqueleto  siempre por detrás mandaras un xml entero    para asegurarte cuando  mandes el PUT imprime tu xml y veras que madas todo el cuerpo aun que solo pongas 

$resouces->id;

siempre se mandaran los demas campos y actualizaras todo entones en tu funcion PUT procura mandar esos meta datos de nuevo 

 

pero si te refieres a datos ajenos a  a las tablas de los WS  es por que  muchos datos se agregan en automático  en diferentes tablas  a pesar de que  tu no los mandes como por ejemplo cuando agregas una nueva categoría tu nomas indicas el rango pero el solo pone los id del rango de la categoría padre

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Gracias fred1roca por la explicación.

Por lo que entiendo, entonces si solo quiero modificar por ejemplo la descripción o el precio de un producto, antes tengo que descargar el xml entero, modificarlo y volverlo a subir por WS, por lo que cada modificación serían 2 peticiones al WS, o hay alguna otra forma de hacerlo más optimizada? siempre y cuando sin acceder por SQL, es lo que hacía antes pero has de saber exactamente todas las tablas que se modifican en cada campo y es un proceso poco sostenible en el tiempo.

Saludos!!

Link to comment
Share on other sites

  • 3 weeks later...
On 3/6/2019 at 2:17 AM, Victor Casajuana Mas said:

Gracias fred1roca por la explicación.

Por lo que entiendo, entonces si solo quiero modificar por ejemplo la descripción o el precio de un producto, antes tengo que descargar el xml entero, modificarlo y volverlo a subir por WS, por lo que cada modificación serían 2 peticiones al WS, o hay alguna otra forma de hacerlo más optimizada? siempre y cuando sin acceder por SQL, es lo que hacía antes pero has de saber exactamente todas las tablas que se modifican en cada campo y es un proceso poco sostenible en el tiempo.

Saludos!!

si víctor lo que puedes hacer es en un string meter todo el xml 

seria copear el xml vacio entero y entre  las etiquetas meter tus ejemplos 

<?php
$example = '
<id/>1
<deleted/>1
<is_module/>1
<id_tax_rules_group/>2
<id_reference/>5
<name/>ALFREDO
<active/>1
';
$xml_request= #webService->add($example);

puedes hacer algo así para que no tengas que primero llamar al xml  ese ya lo tendrías guardado en un string y solo remplazas valores y es incluso mas ensillo que con los hijos $resources->.....

 

Quote

 

 

  • Like 1
Link to comment
Share on other sites

  • 2 months later...

hola de nuevo fred1roca, después de una temporada liado con otros temas, retomo de nuevo esto. Al final lo voy a enfocar con 2 peticiones ya que si le envío el xml con todos los campos en blanco y solo relleno los que voy a modificar, el resto me los inicializará en el producto de prestashop y para asegurarme que esto no ocurra, me descargo el xml del producto, modifico lo que quiero y luego lo vuelvo a enviar. 
Realmente el ejemplo que me pones es lo que indicaba yo al principio de este post, que si solo le paso los campos a modificar el resto me los deja en blanco.

Cuando lo tenga listo y funcionando bien lo comento.

Link to comment
Share on other sites

20 minutes ago, Victor Casajuana Mas said:

hola de nuevo fred1roca, después de una temporada liado con otros temas, retomo de nuevo esto. Al final lo voy a enfocar con 2 peticiones ya que si le envío el xml con todos los campos en blanco y solo relleno los que voy a modificar, el resto me los inicializará en el producto de prestashop y para asegurarme que esto no ocurra, me descargo el xml del producto, modifico lo que quiero y luego lo vuelvo a enviar. 
Realmente el ejemplo que me pones es lo que indicaba yo al principio de este post, que si solo le paso los campos a modificar el resto me los deja en blanco.

Cuando lo tenga listo y funcionando bien lo comento.

que tal victor   yo volvi a hacer todas mis peticiones de manera que fuera mas rápido y la verdad logre recordar a mas de la mitad mi sincronizacion 

 

<?php
            foreach ($arrayjson as $key) {
                if ($key['system'] == true) {
 
                        $webService = new PrestaShopWebservice($dominios, $serviceKey, false);
                     
                        $statts = $key['status'];
                        
                        $opt = array(
                            'resource' => 'categories',
                            'postXml' => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<prestashop xmlns:xlink=\"http://www.w3.org/1999/xlink\">
<category>
	<id/>
	<id_parent><![CDATA[" . $id_cat . "]]></id_parent>
	<active><![CDATA[" . $statts . "]]></active>
	<id_shop_default><![CDATA[1]]></id_shop_default>
	<is_root_category><![CDATA[0]]></is_root_category>
	<position><![CDATA[0]]></position>
	<date_add></date_add>
	<date_upd></date_upd>
	<name><language id='1' xlink:href='" . $dominios . "/api/languages/1'><![CDATA[" . $key['nombre'] . "]]></language><language id='2'/></name>
	<link_rewrite><language id='1' xlink:href='" . $dominios . "/api/languages/1'><![CDATA[link-rewrite]]></language><language id='2'/></link_rewrite>
	<description><![CDATA[<p><span style='font-size:10pt;font-family:Arial;font-style:normal;'></span></p>]]></description>
	<meta_title></meta_title>
	<meta_description></meta_description>
	<meta_keywords></meta_keywords>
<associations>
<categories>
	<category>
	<id/>
	</category>
</categories>
<products>
	<product>
	<id/>
	</product>
</products>
</associations>
</category>
</prestashop>"
                        );
                        $xml_request = $webService->add($opt);

de esta menera solo haces una petición post o put en tu caso después de unos cuantos cientos de artículos puedes notar una gran diferencia en tiempo o de menos así lo note yo  que es verdad que insertas todo el xml pero para mi fue mas rápido  ya que yo los datos los obtengo de otros ws externos a prestashop y los inserto en la tienda.  ami me funciono mas rapido asi

  • Like 1
Link to comment
Share on other sites

Hola Fred1roca

Gracias por los ejemplos, lo que no tengo claro es que en el ejemplo que pones te estarías cargando los campos meta ya que se los estás enviando en blanco. Este es el problema que yo tengo, que en mi aplicación esta información no existe, y al actualizar el producto a prestashop y no pasarla o pasarla en blanco, se inicializa en prestashop.

Salud!!

Link to comment
Share on other sites

6 hours ago, Victor Casajuana Mas said:

Hola Fred1roca

Gracias por los ejemplos, lo que no tengo claro es que en el ejemplo que pones te estarías cargando los campos meta ya que se los estás enviando en blanco. Este es el problema que yo tengo, que en mi aplicación esta información no existe, y al actualizar el producto a prestashop y no pasarla o pasarla en blanco, se inicializa en prestashop.

Salud!!

si por que estas asiendo un update con todo el xml  es lógico que te cargues los que mandes vacíos. cuando tu obtienes el xml con los datos  y solo actualizas  el campo que requieres y lo mandas de nuevo entonces estas haciendo un update completo  se vuelve  a actualizar toda la tabla. de las 2 maneras es valido pero si es mas rápido si solo mandas el xml sin pedir el esquema igualmente estarás haciendo un update a toda la estructura y si  @Victor Casajuana Mas la documentación e información sobre los ws de prestashop es bastante escasa la verdad si le estuve batallando un tiempo para lograr hacer ciertas cosas 

Link to comment
Share on other sites

vale, ya me queda claro. Cuando se hace un PUT del producto por el WS, los campos que no se le pasan por el XML los inicializa. Hay que mandarle el XML completo con todos los campos cumplimentados. Considero que es un fallo del WS ya que si quieres hacer un proceso por ejemplo que cambie solo un campo del artículo (nombre), te toca hacer un GET, modificar el valor y luego un PUT.
Tema resuelto.
Gracias!!!!

Link to comment
Share on other sites

On 6/1/2019 at 11:12 AM, Victor Casajuana Mas said:

vale, ya me queda claro. Cuando se hace un PUT del producto por el WS, los campos que no se le pasan por el XML los inicializa. Hay que mandarle el XML completo con todos los campos cumplimentados. Considero que es un fallo del WS ya que si quieres hacer un proceso por ejemplo que cambie solo un campo del artículo (nombre), te toca hacer un GET, modificar el valor y luego un PUT.
Tema resuelto.
Gracias!!!!

En realidad no es un fallo así funcionan generalmente todas las API (por lo menos con las que he trabajado) al momento de hacer un PUT 

  • Like 1
Link to comment
Share on other sites

  • 1 year later...

Hola,

Soy nuevo en todo el tema de API de Prestashop y de normal las integraciones las hago con .NET

Para hacer los GET no tengo problema ya que responde con los datos correctamente, pero para hacer el PUT me esta dando el clásico error:

Error en el servidor remoto: (400) Solicitud incorrecta.

 

Como he leído estoy mandando el esqueleto de la clase con xml con los datos a modificar y le paso el método PUT, pero no consigo nada.

 

¿alguien me puede ayudar?

 

Gracias

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...