Jump to content

Produit "sur mesure"


Recommended Posts

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 :

  1. 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.
  2. Une fois dans Prestashop sur la page du produit, je veux afficher le contenu de ma variable personnalisée
  3. 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

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

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

  • 3 months later...
  • 2 weeks later...

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

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

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

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

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 by Pierre B (see edit history)
Link to comment
Share on other sites

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

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

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 by Pierre B (see edit history)
Link to comment
Share on other sites

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 :

  1. 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
     
    .
  2. 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 by Pierre B (see edit history)
Link to comment
Share on other sites

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

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 by Pierre B (see edit history)
Link to comment
Share on other sites

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 by Pierre B (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...