Pierre B Posted November 5, 2012 Share Posted November 5, 2012 Bonjour à tous, Je suis en train d'aider un ami à la mise en place d'une boutique Prestashop pour un produit sur mesure et je suis depuis plusieurs heure dans une impasse. Voici ce que je souhaiterais parvenir à faire fonctionner : L'internaute personnalise son produit via un programme en ligne puis clique sur un lien afin de basculer vers la boutique Prestashop. Le lien contient deux variables : - une variable correspondant à l'ID du produit - une variable contenant les données personnalisées. Une fois dans Prestashop sur la page du produit, je veux afficher le contenu de ma variable personnalisée Lors de l'ajout du produit au panier, les données personnalisées sont mentionnées dans la description du produit. La première chose sur laquelle je bute est comment récupérer ma variable personnalisée dans ma page produit. J'ai essayé d'insérer du code php dans le fichier product.tlp mais cela ne fonctionne pas. Auriez-vous quelques pistes ? Pierre Link to comment Share on other sites More sharing options...
Pierre B Posted November 6, 2012 Author Share Posted November 6, 2012 Si j'ai bien compris, j'appele ma variable dans product.tpl de la manière suivante : {$mavariable} ... après avoir déclaré cette variable de la manière suivante : <?php $mavariable = $_GET['mavariable '] $smarty->assign(array('mavariable' => '123456789')); ?> Mais où dois-je placer cette déclaration de variable ? Link to comment Share on other sites More sharing options...
Pierre B Posted November 7, 2012 Author Share Posted November 7, 2012 J'ai trouvé comment transmettre ma variable. Je post ma solution au cas où cela pourrait en aider d'autres : Dans themes/default/products/product.tpl j'affiche ma variable à l'endroit choisi : {$mavariable} Dans controllers/fron/ProductController.php je récupère ma variable en insérant le code suivant (*) : $this->context->smarty->assign(array('mavariable' => $mavariable)); (*) Code inséré ligne 155 juste après : public function initContent() { parent::initContent(); if (!$this->errors) { Link to comment Share on other sites More sharing options...
Pierre B Posted November 7, 2012 Author Share Posted November 7, 2012 Ma difficulté maintenant est de transmettre cette variable au panier. Des pistes ? Link to comment Share on other sites More sharing options...
estecile Posted February 16, 2013 Share Posted February 16, 2013 Bonjour Pierre . As-tu trouvé une solution a ton probleme? Je souhaite faire la meme chose et je ne trouve aucunes solutions adéquates. Link to comment Share on other sites More sharing options...
Pierre B Posted February 27, 2013 Author Share Posted February 27, 2013 Bonjour Estecile, Je n'ai pas trouvé de solution au problème et j'ai donc pour l'instant mis de côté la migration de notre boutrique en ligne vers prestashop. Cela dit, je vais me repencher sur le problème. Peut être qu'à deux on y arrivera ou que quelqu'un sur le forum finira pas bien vouloir nous aider un peu... Pierre Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 Vu le dynamisme de sa communauté, le choix de Prestashop me semble une solution de plus en plus risquée ... Link to comment Share on other sites More sharing options...
webpulser Posted March 6, 2013 Share Posted March 6, 2013 Bonjour, Concernant le dynamisme de la communauté, je ne ferai pas de commentaire, tu as moins de posts que moi ^^. Cependant ta demande est tout de même bien spécifique et le peu d'infos donné à fait reculer beaucoup de monde à te répondre je pense. Peux tu nous informer sur ta version de Prestashop, une url peut être aussi ? Concernant ta personnalisation, influe t elle le prix du produit ? Ensuite comment fonctionne ta variable personnalisée ? Il te faut l'enregistrer dans le panier ( override du controller Cart) et ajouter un champ dans la table 'cart_product' Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 Bonjour et désolé de mettre un peu emporté dans mes propos. La version de Prestashop est 1.5.2.0. Il s'agit de vendre un produit sur-mesure identifié par deux variables rfOT et refRK. Un fois le produit conçu, le client arrive sur la boutique avec un lien de ce type : http://www.atuacores.com/201215/40-pain-surfdesigner.html?refOT=O-JiHo9uNKcoSxz58eNUz66ULe&refRK=R-JiK9Q0EwDxfugxL0z67oz69of1l0 Je suis parvenu (cf posts précédents et exemple dans le lien ci-dessus) a afficher les variables dans la page du produit, mais je bloque sur comment transmettre ces variables dans le panier (dans le champ description, par exemple). Pierre Link to comment Share on other sites More sharing options...
webpulser Posted March 6, 2013 Share Posted March 6, 2013 Il n'existe pas de champ description spécifique par produit dans Prestashop, tu va devoir en créer un. 1. Creer le champ dans cart_product 2. Ajouter la variable dans un input type hidden dans le formulaire d'ajout produit. 3. Overrider le controller Cart au niveau de la ligne 228 pour ajouter cette variable reçu en POST $update_quantity = $this->context->cart->updateQty($this->qty, $this->id_product, $this->id_product_attribute, $this->customization_id, Tools::getValue('op', 'up'), $this->id_address_delivery); 4. Overrider la fonction updateQty de la classe Cart pour ajouter la variable dans la base. Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 (edited) Merci pour cette aide précieuse. En suivant tes consignes, j'ai fait ceci : Etape 1 : Dans shopping-cart.tpl, ligne 78, j'ai ajouté ceci : 77 {l s='Description'} 78 {l s='Ref Surfdesigner'}<!-- Ajout Pierre --> Etape 2 : Dans product.tpl, j'ai ajouté ceci : <input name="id_product" value="{$product->id|intval}" id="product_page_product_id" type="hidden"> <input name="add" value="1" type="hidden"> <input name="refSD" id="refSD" value="{$refOT} - {$refRK}" type="hidden"><!-- Ajout Pierre --> Etape 3 : Dans CartController.php, ligne 229, j'ai ajouté ceci : $update_quantity = $this->context->cart->updateQty($this->qty, $this->id_product, $this->id_product_attribute, $this->customization_id, Tools::getValue('op', 'up'), $this->id_address_delivery, $this->refSD); En rechargeant ma page, je constate que la variable hidden est bien présente dans le formulaire d'ajout au panier. En revanche, lorsque je clique sur ajouter au panier, cette variable n'est pas transmise ! Voici ce que firebug m'indique concernant les variables transmises : add : 1 ajax : true controller : cart id_product : 40 qty : 1 token : 9e573fba8bf06a53df17ed1252f09576 Edited March 6, 2013 by Pierre B (see edit history) Link to comment Share on other sites More sharing options...
webpulser Posted March 6, 2013 Share Posted March 6, 2013 Oui l'ajout de produit se fait en ajax via la fonction add du module blackcart/ajax-cart.js Ajoute ton paramètre à la fonction add() ligne 45, puis ligne 176, enfin ajoute ton paramètre dans la requête ajax de cette fonction. Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 Génial, ça fonctionne ! Merci ! Je passe à l'étape suivante. Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 Désolé de te solliciter à nouveau mais je rame toujours autant. Maintenant que j'ai réussi à envoyer la variable vers le panier, je voudrais bien entendu l'afficher. Je vois où sont les colonnes <td> dans shopping-cart.tpl mais impossible d'y ajouter quoi que ce soit ! Link to comment Share on other sites More sharing options...
webpulser Posted March 6, 2013 Share Posted March 6, 2013 Une fois la variable enregistré dans la table cart_product, il faut modifier la fonction getProducts de la classe Cart ligne 399 en ajoutant dans la requête SQL le champ que tu as ajouter ( ajoute 'cp.TAVARIABLE') Ensuite seulement tu pourra l'afficher dans le tpl. Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 OK, je vais essayer ça. Merci. Une fois fini, je vais faire un tuto récapitulatif, je crois que cela en dépannera d'autres ! Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 (edited) Une fois la variable enregistré dans la table cart_product je suppose que cela se passe au niveau de la fonction updateQty. J'ai édité ceci : public function updateQty($quantity, $id_product, $refSD, $id_product_attribute = null, $id_customization = false Puis cette ligne : $result_add = Db::getInstance()->insert('cart_product', array( 'id_product' => (int)$id_product, 'refSD' => $refSD, J'ai ensuite rajouté un champ 'refSD' dans la table cart_product. L'insertion dans la table cart_product semble se faire correctement, mais le champ refSD n'est pas renseigné... mais là je dois pouvoir arriver à solutionner ça tout seul. Edited March 6, 2013 by Pierre B (see edit history) Link to comment Share on other sites More sharing options...
Pierre B Posted March 6, 2013 Author Share Posted March 6, 2013 OK, c'est bon, la variable est stockée dans la table Link to comment Share on other sites More sharing options...
Pierre B Posted March 7, 2013 Author Share Posted March 7, 2013 (edited) Tout semble désormais bien fonctionner. Merci encore a webpulser pour m'avoir guidé étape par étape dans cette procédure. Je récapitule pour faciliter la tache de ceux qui sont confrontés à une problématique similaire : L'internaute conçoit en ligne, hors prestashop, un produit sur mesure identifié par une variable/référence unique. il s'agit ensuite de pouvoir ajouter ce produit au panier de prestashop. Pour cela, dans prestashop, je crée d'abord un produit dédié à cet usage et je relève son ID. Dans mon cas, l'ID du produit est 40. Donc, pour afficher la page du produit, il suffit d'aller sur : www.monsite.com/prestashop/40-nomdemonproduit.html . Il faut maintenant afficher la variable de personnalisation sur la page du produit. Je rajoute donc ma variable à l'url, ce qui nous donne : www.monsite.com/prestashop/40-nomdemonproduit.html?mavariable=123456789 Dans controllers/fron/ProductController.php je récupère ma variable en insérant le code suivant (*) : $this->context->smarty->assign(array('mavariable' => $mavariable)); (*) Code inséré ligne 155 juste après :public function initContent() { parent::initContent(); if (!$this->errors) { Dans themes/default/product.tpl j'affiche ma variable à l'endroit choisi : {$mavariable} Edited March 7, 2013 by Pierre B (see edit history) Link to comment Share on other sites More sharing options...
Pierre B Posted March 7, 2013 Author Share Posted March 7, 2013 3. Maintenant que la page produit est affichée avec sa variable personnalisée, il faut que lors d'un ajout au panier, la variable soit transmise au panier. Dans themes/default/product.tpl, on rajoute un champ input dans le formulaire d'ajout au panier : <!-- add to cart form--> <form id="buy_block" ... ... <input name="mavariable" id="mavariable" value="{$mavariable}" type="hidden"> Il faut également modifier la fonction add du module blockcart/ajax-cart.js : (ligne 45) ajaxCart.add( $('#product_page_product_id').val(), $('#mavariable').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null); (ligne 176) add : function(idProduct, mavariable, idCombination, addedFromProductPage, callerElement, quantity, whishlist){ (ligne 202) data: 'controller=cart&add=1&ajax=true&qty=' + ((quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&mavariable=' +mavariable+ '&token=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination): ''), Link to comment Share on other sites More sharing options...
Pierre B Posted March 7, 2013 Author Share Posted March 7, 2013 (edited) 4. Une fois la variable transmise au panier, il faut l'enregistrer dans la base de données. Dans la base de données, on rajoute à la table cart_product un champ 'mavariable'. Dans mon cas j'ai choisi un champ de type mediumtext. Cette table sert à enregistrer le contenu du panier. Pour que lors de l'ajout d'un produit, ma variable soit enregistrée dans la table cart_product , il faut modifier la fonction updateQty. Dans le fichier controllers/front/CartController.php : (ligne 56) // Get page main parameters $this->id_product = (int)Tools::getValue('id_product', null); $this->mavariable= Tools::getValue('mavariable', null); (ligne 229) $update_quantity = $this->context->cart->updateQty($this->mavariable, $this->qty, $this->id_product, $this->id_product_attribute, $this->customization_id, Tools::getValue('op', 'up'), $this->id_address_delivery); Dans le fichier class/Cart.php : public function updateQty($mavariable, $quantity, $id_product, $id_product_attribute = null, $id_customization = false, ... $result_add = Db::getInstance()->insert('cart_product', array( 'id_product' => (int)$id_product, 'mavariable' => $mavariable, 'id_product_attribute' => (int)$id_product_attribute, Toujours dans le fichier class/Cart.php, on modifie la requête mysql de mise à jour de la table. J'utilise la fonction CONCAT afin d'incrémenter les variables. Ainsi, si on a deux produits personnalisés dans le panier, on aura en fait un seul produit en quantité 2 et ayant dans sa description les deux différentes valeurs personnalisées séparées par un point virgule : Db::getInstance()->execute(' UPDATE `'._DB_PREFIX_.'cart_product` SET `quantity` = `quantity` '.$qty.', `date_add` = NOW(), `mavariable`=CONCAT(mavariable," ; '.$mavariable.' ") WHERE `id_product` = '.(int)$id_product. ... Edited March 7, 2013 by Pierre B (see edit history) Link to comment Share on other sites More sharing options...
Pierre B Posted March 7, 2013 Author Share Posted March 7, 2013 (edited) 5. Maintenant que la variable est stockée dans la table cart_product , on peut l'afficher. Pour cela, j'ai choisi de d'afficher ma variable dans la colonne "DESCRIPTION" du panier. Cette colonne existe déjà, donc je n'ai pas besoin de toucher au fichier shopping-cart.tpl Normalement celle colonne est alimentée par le champ 'name'. J'ai donc modifié la reqête sql d'affichage dans le fichier class/Cart.php : $sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`mavariable` AS name, cp.`quantity` AS cart_quantity, pl.`name`,cp.id_shop, ... Et voilà ! Edited March 7, 2013 by Pierre B (see edit history) Link to comment Share on other sites More sharing options...
webpulser Posted March 7, 2013 Share Posted March 7, 2013 Content que tu sois parvenu à apporter tes modifications, n'oublies pas de poster le lien de ton site une fois tes améliorations déployés. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now