Jump to content

[Résolu] [Webservice] ressource 'products', add/edit


Recommended Posts

Bonjour,

J'essaie de modifier un produit en utilisant les Webservices.
Je me suis basé sur le Tutoriel Webservice CRUD.
Ça marche très bien pour l'édition/création d'un client mais je n'y arrive pas pour l'édition/création d'un produit.
J'ai comme retour :

Other error : This call to PrestaShop Web Services failed and returned an HTTP status of 400. That means: Bad Request.


Comment faire pour modifier/créer un produit ?

Exemple de xml envoyé pour la création d'un produit

<?xml version="1.0" encoding="UTF-8"?>






2















0





















0
   <meta_description><language id="1"/></meta_description>
   <meta_keywords><language id="1"/></meta_keywords>
   <meta_title><language id="1"/></meta_title>
   <link_rewrite><language id="1">link_rewrite0link_rewrite1link_rewrite2link_rewrite3link_rewrite4</link_rewrite>
name0name1name2name3name4







1









1




1




1
36





Link to comment
Share on other sites

J'ai la même erreur sur les catégories :

Trace complet :

HTTP REQUEST HEADER

GET /prestashop/api/categories?schema=blank HTTP/1.1
Authorization: Basic VzhQU0JZRUFBNEFSQldaWlRRWTk2Q1YyQ09WSVk4RkU6
Host: localhost
Accept: */ *


HTTP RESPONSE HEADER

HTTP/1.1 200 OK
Date: Mon, 13 Jun 2011 10:34:26 GMT
Server: Apache/2.2.17 (Win32)
Access-Time: 1307961267
X-Powered-By: PrestaShop Webservice
PSWS-Version: 1.4.2.5
Execution-Time: 0.012
Content-Sha1: 2fb8dcb08ad578c4f3948716ea347034fcd2dddc
Content-Length: 1430
Content-Type: text/xml;charset=utf-8

RETURN HTTP BODY

<?xml version="1.0" encoding="UTF-8"?>








   <link_rewrite><language id="1"></link_rewrite>
   <meta_title><language id="1"></meta_title>
   <meta_description><language id="1"></meta_description>
   <meta_keywords><language id="1"></meta_keywords>
















HTTP REQUEST HEADER

POST /prestashop/api/categories HTTP/1.1
Authorization: Basic VzhQU0JZRUFBNEFSQldaWlRRWTk2Q1YyQ09WSVk4RkU6
Host: localhost
Accept: */ *
Content-Length: 1169
Content-Type: application/x-www-form-urlencoded


HTTP RESPONSE HEADER

HTTP/1.1 400 Bad Request
Date: Mon, 13 Jun 2011 10:34:27 GMT
Server: Apache/2.2.17 (Win32)
Access-Time: 1307961267
X-Powered-By: PrestaShop Webservice
PSWS-Version: 1.4.2.5
Execution-Time: 0.012
Content-Length: 241
Connection: close
Content-Type: text/xml;charset=utf-8

XML SENT

xml=<?xml version="1.0" encoding="UTF-8"?>






1
Category name0Category name1Category name2Category name3Category name4
   <link_rewrite><language id="1">link_rewrite0link_rewrite1link_rewrite2link_rewrite3link_rewrite4</link_rewrite>
   <meta_title><language id="1"/></meta_title>
   <meta_description><language id="1"/></meta_description>
   <meta_keywords><language id="1"/></meta_keywords>





RETURN HTTP BODY

<?xml version="1.0" encoding="UTF-8"?>



<![CDATA[internal error. To see this error please display the PHP errors.]]>




Other error : This call to PrestaShop Web Services failed and returned an HTTP status of 400. That means: Bad Request.

Link to comment
Share on other sites

J'ai trouvé un moyen d'éviter ce genre d'erreur.

Au lieu de récupérer le schema=blank de la ressources en question (ex: /api/products?schema=blank),
il vaut mieux récupérer le schema=synopsis.

En effet le schema=blank contient des balises qui ne doivent pas être présente lors de la soumission du xml en POST, et ces balises en question ne sont pas présentes dans le schema=synopsis.

Faire quand même attention aux 'associations', si vous laisser par exemple la balise d'exemple 'category', le produit sera associé à une catégorie d'id 0... Il faut donc bien "vider" les associations que l'on ne souhaite pas.

J'ai testé pour l'ajout de produits et de catégorie et ça fonctionne, si vous avez besoin d'exemples, n'hésitez pas !

Sinon il serait peut-être intéressant de mettre à jour ou de compléter le Tutoriel sur l'utilisation des webservices.

  • Like 1
Link to comment
Share on other sites

Salut , merci bien pour ces précisions !

Tu t'es auto répondu et c'est déja top ...


Idéalement passe ton post , celui ci , en résolu , ainsi lors des recherches sur le sujet il sera taggué comme tel et attirera plus facilement l'oeil. Il est clair que ce post a son intérêt.

Link to comment
Share on other sites

J'ai trouvé un moyen d'éviter ce genre d'erreur.

Au lieu de récupérer le schema=blank de la ressources en question (ex: /api/products?schema=blank),
il vaut mieux récupérer le schema=synopsis.

En effet le schema=blank contient des balises qui ne doivent pas être présente lors de la soumission du xml en POST, et ces balises en question ne sont pas présentes dans le schema=synopsis.

Faire quand même attention aux 'associations', si vous laisser par exemple la balise d'exemple 'category', le produit sera associé à une catégorie d'id 0... Il faut donc bien "vider" les associations que l'on ne souhaite pas.

J'ai testé pour l'ajout de produits et de catégorie et ça fonctionne, si vous avez besoin d'exemples, n'hésitez pas !

Sinon il serait peut-être intéressant de mettre à jour ou de compléter le Tutoriel sur l'utilisation des webservices.


Salut! Excusez-moi pour mauvais français - je l'ai écrit en utilisant translate.google.com.
damien13 s'il vous plaît donner des exemples de code qui fournissent des biens et des répertoires pravlno. Très, très nécessaire! Merci!
Link to comment
Share on other sites

exemple d'insertion d'une categorie basé sur le tutoriel disponible ici


require_once('PSWebserviceLibrary.php');

$webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);

$xml_category = $webService->get(array('resource' => 'categories?schema=synopsis'));
$resources_category = $xml_category->children()->children();

$resources_category->id_parent = 1;
$resources_category->active = 1;

$resources_category->name->language[0][0] = 'test';
$resources_category->link_rewrite->language[0][0] = 'test';

$xml_category = $webService->add(array('resource' => 'categories', 'postXml' => $xml_category->asXML()));

Link to comment
Share on other sites

Une erreur. Contenu XML peut me dire quelque chose?
Je vous écris dans un autre langage de programmation, et c'est probablement la façon dont elle affecte:

<?xml version="1.0" encoding="UTF-8"?>


2
1
Минеральные масла
       <link_rewrite required="true" maxSize="64" format="isLinkRewrite">Mineralnie_masla</link_rewrite>
       <meta_title maxSize="128" format="isGenericName">Минеральные масла</meta_title>
       <meta_description maxSize="255" format="isGenericName">Минеральные масла</meta_description>
       <meta_keywords maxSize="255" format="isGenericName">Минеральные масла</meta_keywords>
Минеральные масла














Link to comment
Share on other sites

Bonjour Damien,

Merci pour tes retours très utile.

Une question, comment fait-tu pour vider tes associations pour les produits (category)
Peux tu poster un exemple d'ajout de produit dans la même veine que celui que tu as posté pour les catégories ?

Merci
+

Link to comment
Share on other sites

Excusez-moi pour ma réponse tardive mais j'ai été pas mal occupé.

Exemple pour l'insertion d'un produit :

require_once('PSWebserviceLibrary.php');

$webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);

$xml_product = $webService->get(array('resource' => 'products?schema=synopsis'));
$resources_product = $xml_product->children()->children();

// champs requis
$resources_product->quantity = 0;
$resources_product->price = 1;
$resources_product->out_of_stock = 2;
$resources_product->name->language[0][0] = 'test';
$resources_product->link_rewrite->language[0][0] = 'test';

// par exemple pour vider les associations aux categories
unset($resources_product->associations->categories->category);

// associer a une categorie (id = 1)
$resources_product->associations->categories->addChild('category')->addChild('id', 1);

$xml_product = $webService->add(array('resource' => 'products', 'postXml' => $xml_product->asXML()));



En essayant cet exemple, vous devriez avoir un exemple de xml pour l'insertion d'un produit.

Pour ton problème Leonid Stas, je pense que ça doit venir de tes caractères grecs qui ne doivent pas passer.
Je sais pas comment faire...

En espérant vous avoir aider.

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour

J'ai aussi une erreur 400 l'ajout fonctionne bien en revanche pour la modification je bloque.

J'ai essayé en utilisant le synopsis, de filtrer uniquement les données à mettre à jour
je suis sur un prestashop 1.4.3 et j'utilise la dernière version du webservice.


$webService = new PrestaShopWebservice($webservice['url'],$webservice['key'],$webservice['debug']);

$xml_product = $webService->get(array('resource' => 'products','id' => 11,'display' => '[ean13]'));
$resources_product = $xml_product->children()->children();


$resources_product->ean13 = '10399940700';

$xml_product = $webService->edit(array('resource' => 'products', 'id'=>11, 'putXml' => $xml_product->asXML()));



Merci de votre aide

Fabrice

Link to comment
Share on other sites

Bonjour,

Je pense que quand vous utilisez 'display', le xml renvoyé ne contient que la champ demandé.

Pour modifier un produit, il faut récupérer tous les attributs du produit, modifier les valeurs souhaitées et appeler edit avec le xml modifié.

Je n'ai pas testé donc à tester.

Damien

Link to comment
Share on other sites

Bonjour

Merci de la réponse...

Justement je faisais comme ça au départ, mais j'avais aussi l'erreur 400, un peu comme avec le synopsis et le blank, d'où ma réflexion en ne mettant à jour qu'un champ, j'ai même essayé en utilisant le script de démo du site et en remplaçant customer par product, mais ça n'a rien changé ... le problème c'est que lors de l'update on ne connait pas les champs "obligatoires"

Merci encore

Fabrice

Link to comment
Share on other sites

globalement je faisais comme ça


$webService = new PrestaShopWebservice($webservice['url'],$webservice['key'],$webservice['debug']);

$xml_product = $webService->get(array('resource' => 'products','id' => 10));
$resources_product = $xml_product->children()->children();

// champs requis
$resources_product->price = 330;
$resources_product->out_of_stock = 2;
$resources_product->ean13 = 10399940700;
$resources_product->name->language[0][0] = 'test update';
$resources_product->link_rewrite->language[0][0] = 'test update';


$xml_product = $webService->edit(array('resource' => 'products', 'id'=>10, 'putXml' => $xml_product->asXML()));




et code généré était celui là :

<?xml version="1.0" encoding="UTF-8"?>


<![CDATA[10]]>



2

<![CDATA[0]]>

<![CDATA[10]]>


<![CDATA[1034]]>


10399940700




<![CDATA[0]]>
330
<![CDATA[0.00]]>
<![CDATA[275.000000]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0.000000]]>

<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[1]]>
<![CDATA[0]]>

<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
<![CDATA[0]]>
0
   <meta_description><language id="2" xlink:href="http://localhost/prestashop/api/languages/2"><![CDATA[]]></meta_description>
   <meta_keywords><language id="2" xlink:href="http://localhost/prestashop/api/languages/2"><![CDATA[]]></meta_keywords>
   <meta_title><language id="2" xlink:href="http://localhost/prestashop/api/languages/2"><![CDATA[]]></meta_title>
   <link_rewrite><language id="2" xlink:href="http://localhost/prestashop/api/languages/2">epson_tambour_laser_c13s051082</link_rewrite>
test update
<![CDATA[]]>
<![CDATA[]]>
<![CDATA[]]>
<![CDATA[]]>
<![CDATA[2011-07-10 21:56:17]]>
<![CDATA[2011-07-10 21:56:17]]>



<![CDATA[1]]>





<![CDATA[10]]>









<![CDATA[0]]>
<![CDATA[0]]>








Merci encore

Link to comment
Share on other sites

Bonjour,

Je pense que certains champs ne doivent pas être dans le XML envoyé.

J'ai comparé le XML que vous avez posté avec le résultat de /api/products?schema=synopsis.

Il y a 6 champs en plus qu'il faudrait retirer du XML envoyé :
- id_default_image
- position_in_category
- manufacturer_name
- unity
- date_add
- date_upd

Il faut aussi peut-être retiré 'id'=>10 du tableau passé en paramètre de la méthode edit().

Tenez-moi au courant si cela fonctionne.

Damien

Link to comment
Share on other sites

Bonjour

et merci, donc ça fonctionne en retirant les champs avec un unset :
– id_default_image
– position_in_category
– manufacturer_name
– unity
– date_add
– date_upd
mais il faut bien laisser le 'id' => 10 dans l'appel de la fonction edit, mais pourquoi faut-il retirer ces champs ?? :o ils ne sont pas modifiables ?

Merci encore

Link to comment
Share on other sites

Cool !

D'après ce que j'ai compris, ces champs ne sont pas vraiment des attributs d'un produit mais plus des informations supplémentaires fournies par le Webservice et donc calculées et non stockées (je pense notament à nb_products_recursive pour les categories).
Les champs date_add et date_upd sont aussi spéciaux, ils sont logiquement mis à jour par le serveur automatiquement.
Il est donc normal qu'il soit interdit de modifier tous ces champs.

Content que ça fonctionne.

Damien

Link to comment
Share on other sites

ok pour les champs dates je m'en doutais un peu j'avais même testé en les retirant mais cela n'avait rien changé, forcément il me manquait les autres ... :P maintenant il est clair que je n'ai pas trouvé de documentation décrivant ces informations ... c'est dommage

enfin maintenant c'est écrit quelque part au moins ;-)

Merci encore

Link to comment
Share on other sites

Bonjour

Merci de la reponse…

S'il vous plaît donner un exemple de fichier XML pour créer le répertoire. La création réussie d'a.
Mon fichier ne crée pas le répertoire.

<?xml version="1.0" encoding="UTF-8"?>


<![CDATA[27]]>

<![CDATA[1]]>
Masla
<link_rewrite><language id="6" xlink:href="http://autotray.ru/api/languages/6"/>Motornye_masla</link_rewrite>
<meta_title><language id="6" xlink:href="http://autotray.ru/api/languages/6"/><![CDATA[]]></meta_title>
<meta_description><language id="6" xlink:href="http://autotray.ru/api/languages/6"/><![CDATA[]]></meta_description>
<meta_keywords><language id="6" xlink:href="http://autotray.ru/api/languages/6"/><![CDATA[]]></meta_keywords>
<![CDATA[]]>














Merci encore

Link to comment
Share on other sites

Bonjour,

Lorsque j'ajoute une catégorie avec la méthode du tuto CRUD , le 'name' de ma catégorie n'est pas ajouté. La catégorie est bien créé avec un id et une un id_parent mais pas le 'name'?

Si vous avez eu le même problème ou bien si vous savez pourquoi. :)
Merci d'avance pour votre aide ..

Link to comment
Share on other sites

Bonjour,

j'ai compris pourquoi la méthode CRUD ne marche pas.
Le formulaire envoie les valeurs récupérées dans les input type="text" vers les balises name, id etc...
Cependant pour les balises contenant du texte il faut que le formulaire envoie les données dans les balises language. Pour les balises contenant des entier le problème ne se pose pas et les valeurs apparaissent bien sur le back office de prestashop et dans la base de données.

-->


<![CDATA[ 1 ]]>




<![CDATA[ Accueil ]]>





Donc la question est: comment indiquer au formulaire qu'il faut mettre les données récupérées dans les balises languages et non name directement?

J'ai essayé ce code la qui ne marche pas:

>
<?php
echo '<form method="POST" action="?Create=Creating">';
       echo '</pre>
<table border="5">'.$key.'';
                   if (isset($_GET['Create']))

                       if ($key=='active')
                       {


                       $result=1;

                       echo '<input type="text" name="'.$key.'" value="'.$result.'"/>';
                       }

                       if ($key=='id_parent')
                       {

                       $resultat=mysql_query("*************") or die(mysql_error());
                       $result=mysql_result($resultat, $id);

                       echo '<input type="text" name="'.$key.'" value="'.$result.'"/>';
                       }

                       if ($key=='id')
                       {

                       $resultat=mysql_query("***************") or die(mysql_error());
                       $result=mysql_result($resultat, $id);

                       echo '<input type="text" name="'.$key.'" value="'.$result.'"/>';
                       }

                       if ($key=='link_rewrite')
                       {

                       $resultat=mysql_query("********************") or die(mysql_error());
                       $result=mysql_result($resultat, $id);

                       echo '<input type="text" name="'.$key->language.'" value="'.$result.'"/>';
                       }

                       if ($key=='name')
                       {

                       $resultat=mysql_query("*******************") or die(mysql_error());
                       $result=mysql_result($resultat, $id);

                       echo '<input type="text" name="'.$key->language.'" value="'.$result.'"/>';
                       }



                   echo '</table>';    <br>           echo'</form>';<br><br>               }<br>?&gt



--> Je récupère des données d'une BDD pour les injecter dans le formulaire.
Pour le les valeur de 'name' et 'link_rewrite' je ne sais pas quoi mettre au name des input type="text" .
J’espère avoir été clair ..

Merci pour votre aide...

Link to comment
Share on other sites

Bonjour,

Le tutoriel ne gère pas les champs qui nécessite une traduction.
Ça marche bien pour les customers mais pour les products, problème.

Il faudrait, je pense, passer des inputs comme ça pour récupérer les différentes valeurs pour chaque langage (même s'il n'y en a qu'un) :

Langage 1 : <input name[]="name" value="la valeur 1" />
Langage 2 : <input name[]="name" value="la valeur 2" />
Langage 3 : <input name[]="name" value="la valeur 3" />
Langage 4 : <input name[]="name" value="la valeur 4" />
Langage 5 : <input name[]="name" value="la valeur 5" />



Puis traiter au retour le tableau POST['name'] récupéré et renseigner le XML comme il faut.

Il faut au final avoir une balise name comma ça :


la valeur 1
la valeur 2
la valeur 3
la valeur 4
la valeur 5



Le nombre de balises language dépend des langages activés.

Idem pour la balise link_rewrite.

Je n'ai pas testé, c'est juste une idée mais j'espère vous avoir mis sur la voie.

Damien

Link to comment
Share on other sites

  • 1 month later...

Bonjour,

Je pense que certains champs ne doivent pas être dans le XML envoyé.

J'ai comparé le XML que vous avez posté avec le résultat de /api/products?schema=synopsis.

Il y a 6 champs en plus qu'il faudrait retirer du XML envoyé :

- id_default_image

- position_in_category

- manufacturer_name

- unity

- date_add

- date_upd

Il faut aussi peut-être retiré 'id'=>10 du tableau passé en paramètre de la méthode edit().

Tenez-moi au courant si cela fonctionne.

Damien

 

Oui Damien13, ça marche avec :

 

unset($xml->product->id_default_image);

unset($xml->product->position_in_category);

unset($xml->product->manufacturer_name);

unset($xml->product->unity);

unset($xml->product->date_add);

unset($xml->product->date_upd);

 

Comme le remarque itself, ce n'est pas documenté.

 

Je m'étais douté pour le champ manufacturer_name car il est effectivement calculé (peut-être demeure-t-il dans la structure pour garder une compatibilité ascendante). Normalement, il ne devrait pas être en dur dans products.

 

Merci en tout cas damien13, sans votre post j'étais dans l'obscurité la plus totale.

  • Like 1
Link to comment
Share on other sites

 

Oui Damien13, ça marche avec :

 

unset($xml->product->id_default_image);

unset($xml->product->position_in_category);

unset($xml->product->manufacturer_name);

unset($xml->product->unity);

unset($xml->product->date_add);

unset($xml->product->date_upd);

 

Comme le remarque itself, ce n'est pas documenté.

 

Je m'étais douté pour le champ manufacturer_name car il est effectivement calculé (peut-être demeure-t-il dans la structure pour garder une compatibilité ascendante). Normalement, il ne devrait pas être en dur dans products.

 

Merci en tout cas damien13, sans votre post j'étais dans l'obscurité la plus totale.

 

 

Dans le XML, il semblerait que ce sont tous les champs avec l'attribut not_filterable positionné.....

<manufacturer_name not_filterable="true"></manufacturer_name>

Link to comment
Share on other sites

J'ai trouvé un moyen d'éviter ce genre d'erreur.

Au lieu de récupérer le schema=blank de la ressources en question (ex: /api/products?schema=blank),

il vaut mieux récupérer le schema=synopsis.

En effet le schema=blank contient des balises qui ne doivent pas être présente lors de la soumission du xml en POST, et ces balises en question ne sont pas présentes dans le schema=synopsis.

Faire quand même attention aux 'associations', si vous laisser par exemple la balise d'exemple 'category', le produit sera associé à une catégorie d'id 0... Il faut donc bien "vider" les associations que l'on ne souhaite pas.

J'ai testé pour l'ajout de produits et de catégorie et ça fonctionne, si vous avez besoin d'exemples, n'hésitez pas !

Sinon il serait peut-être intéressant de mettre à jour ou de compléter le Tutoriel sur l'utilisation des webservices.

En fait, les champs avec l'attribut

<id required="true"/>

doivent être renseignés.

Link to comment
Share on other sites

  • 5 months later...
  • 6 months later...

Bonjour,

 

je ne comprend pas bien la méthode, j'ai suivi le tuto et j'affiche correctement toutes les categories avec un lien qui renvoi spécifiquement sur l'une d'entre elle.

 

Si je modifie une des catégories, j'ai la même erreur que sur ce post.

 

This call to PrestaShop Web Services failed and returned an HTTP status of 400. That means: Bad Request.

 

mais si je change mon code

$opt['resource'] = 'categories';

 

et que je met ça (comme indiqué sur le post)

$opt['resource'] = 'categories?schema=synopsis';

 

Je ne vois plus la liste de toutes les categories mais ça : Id More isUnsignedInt Voir true Voir true Voir true Voir true Voir true Voir 128 Voir 255 Voir 255 Voir isCleanHtml Voir Voir

 

Que se passe t-il ?

Je ne comprend pas !!

 

Quelqu'un sait ce qu'il m'affiche ???

Link to comment
Share on other sites

  • 1 year later...

Je pense qu'il faudrait créer un nouveau topic pour plus de lisibilité sachant que celui ci est noté "résolu".

Pour les images, il faut faire des appels en curl, c'est documenté et ça marche :

 
$url = 'http://maboutique.com/api/images/products/1';

$image_path = 'C:\\mon_image.png';
$key = 'Ma clé webservice';




$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
//curl_setopt($ch, CURLOPT_PUT, true); Pour modifier une image
curl_setopt($ch, CURLOPT_USERPWD, $key.':');
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => '@'.$image_path));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
Edited by keuta (see edit history)
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...