Jump to content

Variation des prix en fonction des données renseigner par les clients


obaida

Recommended Posts

Bonjour,
J'aimerais permettre aux clients de ma boutique Prestashop, de saisir la taille du produit eux même et cela en proposant deux nouveaux champs (Largeur et Hauteur) près des autres attributs, chose que j'ai réussis a faire sans trop de difficulté grâce aux variables PHP existantes dans Prestashop et un petit script Javascript que j'ai écris permettant de saisir la valeur de l'autre champ dynamiquement de sorte a conserver les proportions du produit, mais ce qui me pose problème, c'est comment faire pour que les nouvelles informations saisies par le client influence sur le prix du produit de manière a ce qu'il augmente ou diminue en fonction des dimensions choisis. Je sais que ma demande n'est pas très précise, mais c’est justement par ce que je ne sais pas exactement quel fichier je doit modifier pour qu’il soit adapter a mon besoin.
Alors, je me permet de solliciter votre aide, qui je suis sûr me sera d’une grande utilité.
Merci d’avance.

Link to comment
Share on other sites

j'ai exactement le même problème. pour ma part j'ai crée deux attributs hauteur et largeur qui contiennent chacun des interval de valeur (implicitement) ex : 0 - 1000, 1000 - 2000 ...
ensuite j'ai fait deux zone text personnalisation hauteur largeur.
l'utilisateur complete ces deux champs et une comparaion est faite avec les attributs en javascript et hop ca marche il est meme possible de faire varier tout seul la selection des attributs suivant les valeur saisi dans les champs ce qui est plus simple.
sinon pour les attribut comme le prix doit varié j'ai transformé la modification du prix par une modification en pourcentage et non en ajout de tant d'euros ... si ca peut t'éclairer ...

Link to comment
Share on other sites

Je te remercie Bnito, pour ta réponse qui je suis sûr, est une solution a mon problème, sauf que je n'ai pas trop compris un ou deux truc, donc je vais profiter un peut en ta gentillesse en te demandant de m'expliquer un peut plus ta solution, d'abord comment faire pour créer des attributs avec des INTERVALLES DE VALEUR, et par ou passer pour que le prix soit modifié en pourcentage ?
Je suis vraiment blocké sur ce point, alors si tu peut m'accorder un peut plus de temps pour m'éclaircir sur ces points, je te serais énormément reconnaissant.

Link to comment
Share on other sites

En fait pour les attribut en intervalle c'est un peu mal exprimé... je crée deux groupe d'attribut "hauteur" et "largeur" dans les quels je mets mes attribut qui se nomme "0 - 1000" "1000 - 2000" et "2000 - 3000" ainsi sur la fiche produit une fois mes déclinaisons de produits créées je me retrouve avec un menu déroulant ou sont inscrit mes intervalles.

ensuite avec ma petit fonction javascript sur le bouton "enregistrer" les personnalisations je fais un controle c'est à dire que je décompose le text que j'ai selectionne dans mon menu déroulant (attention le texte "text" et non la valeur "value" c'est a dire "0 - 1000" par exemple et non la valeur contenu pour ce choix ex: 3 qui correspond à l'idée de l'attribut) donc je reprends...
une fois récupéré cette valeur du text je la décompose pour récupéré 0 et 1000 c'est juste un travait sur les chaines avec les fonction de chaine de javascript. puis je compare mes deux valeurs (attention tranformé en numérique ! pour la comparaison) aux valeur saisies dans les champs texte de personnalisation.
mais je vais faire evoluer cette fonction pour ne pas avoir à sélectionner dans les liste elles se selectionnerons automatiquement à la saisie des valeurs dans les champs texte...

pour ce qui est du passage en pourcentage pour les modification de pris par attribut, j'ai modifier le fichier AdminAttributGenerator.php dans /admin/tabs à la ligne 22 et26 par :

private function addAttribute($arr, $price = 1, $weight = 0)


$price *= floatval($_POST['price_impact'][intval($attr)]);


et le fichier Product.php dans /classes à la ligne 1267 par :

$price *= $attribute_price;


et le fichier attributFront.js dans /js à la ligne 72 par :

var priceProductWR = (attribut_price * product_price_without_reduct) * currency_rate;


et le fichier product.js dans /themes/monthemes/js à la ligne 242 par :

var productPriceWithoutReduction2 = (attribut_price_tmp * productPriceWithoutReduction) * currencyRate;



(au fait mes fonctions javascript pour le controle les valeur saisit sont dans ce fichier elle retourne true si c bon et false si c pas bon. ensuite on conserve la fonction appelé par le bouton "enregistrer" des personnalisations on y ajoute juste que si les fonctions de verification retourne true alors on réalise le contenu de la fonction appelé par le bouton.)

cela permet non pas d'ajouter les valeurs au prix de base du produit mais de multiplier par un pourcentage ainsi :
si le prix ne change pas : dans la generation d'attribut la valeur sera 1 et non 0
pour une augmentation de 10% : 1.10
pour une réduction de 10% : 0.90

pour ce qui est des modification de poids rien ne change si pas changement la valeur est 0 si changement alors on ajout le poids voulu...

est ce que cela réponds à ta question ?
je crois que c'est tout ce que j'ai fait sur les modifs de code ... hésite pas s'il y a un problème. je ferais évoluer mon code de toute façon pour que nous n'ayons plus besoin des liste hauteur et largeur (enfin en les cachant quoi ..) et pour remplacer le signe "€" par "%" dans la génération des attributs pour que se soit plus clair ...

Link to comment
Share on other sites

Oui parfaitement, d'ailleurs je te remercie énormément du temps consacré pour expliqué tous ça, je suis sur que ça va aider beaucoup d'autre personne, j'avoue que je n'y ai pas pensé, j'ai même fais un script en PHP qui se connecte a la base de données et qui ajoute dynamiquement les attributs de 0 a 1000 au groupe d'attribut a l'aide d'une boucle, tellement je désespérais... mon intention étais de ne pas afficher le menu déroulant qui devait contenir 1000 choix de 0 a 1000, dans le but de faire automatiquement un choix dans ce dernier en fonction de ce que l'utilisateur vas taper dans les deux champs de texte (Largeur, Hauteur), qui a leur tour s'auto-remplisse selon la valeur de l'un d'entre eux de manière a conserver les proportions du produit. Solution qui est fonctionnel, mais pas vraiment propre !! Mais heureusement, ta solution devrait arranger tout ça. d'ailleurs est ce que tu peut publier ton script Js qui permet de faire la comparaison et le contrôle :red: ?

Link to comment
Share on other sites

le code que j'ai créé se trouve tout en bas du fichier /themes/montheme/js/product.js

function saveCustomization()
{
   if(verifLargeur() && verifHauteur())
   {
       $('#quantityBackup').val($('#quantity_wanted').val());
       $('body select[@id^="group_"]').each(function() {
           $('#customizationForm').attr('action', $('#customizationForm').attr('action') + '&' + this.id + '=' + parseInt(this.value));
       });
       $('#customizationForm').submit();
   }
   else
   {
       alert("la valeur saisie ne correspond pas.")
   }
}

function verifHauteur()
{
   var reg1=document.getElementById("group_6");
   var dep1=reg1.options[reg1.selectedIndex].text;
   var borninf1 = parseInt(dep1.substring(0,dep1.lastIndexOf(' - '))); 
   var bornsup1 = parseInt(dep1.substring(dep1.lastIndexOf(' - ')+3,dep1.length)); 

   if (parseInt(document.getElementById("textField1").value) >= borninf1 && parseInt(document.getElementById("textField1").value) <= bornsup1)
   {
       return true;
   }
   else
   {
       return false;
   }
}
function verifLargeur()
{
   var reg=document.getElementById("group_7");
   var dep=reg.options[reg.selectedIndex].text;
   var borninf = parseInt(dep.substring(0,dep.lastIndexOf(' - '))); 
   var bornsup = parseInt(dep.substring(dep.lastIndexOf(' - ')+3,dep.length)); 

   if (parseInt(document.getElementById("textField0").value) >= borninf && parseInt(document.getElementById("textField0").value) <= bornsup)
   {
       return true;
   }
   else
   {
       return false;
   }
}


a savoir que dans mes fonction la chose qui n'est pas très dynamique est le fait que group_7 group_6 textfield0 et textfield1 ne sont pas dynamique ...
mais si tu met tes fonctions dans product.tpl à la place tu peux faire un contrôle afin de mettre dynamiquement le bon group_6 et group_7 qui correspond à l'id des liste de sélection ... et pour les textfield ca ne doit pas changer normalement ...

voila voila ...
mais comme je te disais ceci est un premier jet je reprendrais le tout pour une solution propre et invisible ...

Link to comment
Share on other sites

  • 1 month later...

Salut Bnito,

Merci bcp pour ton code qui effectivement en aide plus d'un.
As-tu pu implémenter la sélection automatique de la liste des attributs en fonction de la Hauteur/Largeur rentrée par le client et de ce fait rendre ces listes invisibles ?
Si oui, ce serait super si tu pouvais partager à nouveau ton code.

Merci et à bientôt,

Rahan

Link to comment
Share on other sites

Bnito,

En fait, ma problématique est un peu différente de la tienne car tu appliques un % sur le prix initial en fonction d'un couple (hauteur, largeur) que rentre le client MAIS ton % est fixe (pour une tranche donnée, par exemple entre 0 et 1000). Mon problème est que le % de réduction est directement fonction du nombre que rentre le client. c'est un coefficient. Si le client rentre hauteur = 200 et largeur =200, ceci me donne une surface de 40000 et alors le prix calculé à la volée sera Prix_initial * 40000/100. Le prix de vente est fonction de la surface qui elle-même varie.

J'espère avoir été clair. Ca complique pas mal les chose car ça veut dire que le % de réduction qu'on définit dans le BO pour les attributs varie en fonction de ce que rentre le client comme valeurs. Et bien entendu, deux clients différents doivent pouvoir commander en même temps avec des % différents...
La 1ère idée serait de créer des réductions de prix (en %) à la volée et de les détruire après la commande mais c'est délicat si 2 clients commandent en même temps.
La 2ème idée c'est de modifier la table Cart pour lui rajouter un champ "coefficient" pour chaque article rajouté au panier.

Si vous avez des idées, je suis preneur.
Merci

Rahan

Link to comment
Share on other sites

Bonjour rahan,
Pour ton second poste je n'ai pas véritablement de réponse ...
mais si jamais je tombe sur cette problématique je posterai.
pour ma sélection automatique dans des liste caché ca va venir d'ici quelques jours je n'étais pas revenu dessus depuis quelque temps mais je vais devoir m'y pencher cette semaine ou la semaine prochaine.

Link to comment
Share on other sites

  • 2 months later...

Bonjour

Pour ce qui est de l'impact en pourcentage sur le prix, il semble que la modification des fichiers attributesfront et product.js soit fausse. (testé)

La bonne modification est là :
http://www.prestashop.com/forums/viewthread/39187/modules_tiers/modifier_le_prix_dun_produit_suivant_les_dimension_saisit_pour_celuici
(testé).

Hélàs, le problème du versement dans le panier de l'auteur de ce code ne fonctionne pas plus avec la modification des deux fichiers supplémentaires indiqués ici. Une solution?!

PS : est il prévu l'introduction d'un impact en pourcentage dans les prochaines versions de prestashop.

Link to comment
Share on other sites

Je suis l'auteur des modifications, et cela fonctionne très bien j'ai déjà un site en production avec cette solution. et le panier fonctionne également.
Il faudrait que je fasse une synthèse de tout cela. mais avec ce fil et un autre que j'ai fait aussi, le tout doit y etre.

Link to comment
Share on other sites

je prendrais le temps dans la semaine de préparer un article pour montrer les étages du changement à réaliser.
je mettrais cette article sur mon site internet perso www.benoitfievet.com, je n'ai pas eu beaucoup de temps pour y mettre mes articles mais je vais le faire.

Link to comment
Share on other sites

Merci

En attendant, je t'expose l'endroit exact de mon problème : c'est dans le calcul de la remise. En effet, le calcul est erroné et le versement dans le panier se fait avec l'erreur. Ci joint une photo qui te montre que le produit à l'origine à 79 ttc donne un chiffre négatif avec la remise de 5%

Du coup avec ton code, mon problème est dans le calcul de la remise et non dans le transfert dans le panier

Alors que quand j'utilise l'autre code (le lien que j'ai donné vers cet autre membre), le calcul donne bien 75,05 TTC ; par contre le versement dans le panier ne tient pas compte de la remise calculée et redonne 79 TTC.

Je me dis donc que la "vérité" doit être entre vos deux contributions....

22621_zTP1XdlkhSr25r3gA6MH_t

Link to comment
Share on other sites

la valeur que tu trouve avec les -15% c'est : 15*79*-1, avec ma modification de code il faut savoir que pour faire un -15% il faut entrer comme valeur d'attribut en modification de prix 0.85 qui correspond à une réduction de 15%. l'erreur viens peut-être de là.

Link to comment
Share on other sites

..............
Ah oui, effectivement......
Donc du coup cela veut dire que tu as connu le même problème que moi. Par contre le post n'est pas indiqué résolu et à priori personne n'a amené de réponse à ta dernière question. As tu au final trouvé la solution toi même?!

Link to comment
Share on other sites

Bravo. C'est effectivement la solution. Pour ceux qui passerait par là, je finalise donc l'explication de ton code pour la partie "impact en pourcentage" avec une utilisation en pourcentage de remise

si on veut un impact de 5% de remise, il faut noter une augmentation de 0.95
pour 15% de remise, une augmentation de 0.85

Résolu donc pour moi.
Encore merci et bravo pour le code

Link to comment
Share on other sites

Bonjour à vous,

je me permet de poster ici car vous pourriez bien avoir la solution à un de mes problèmes :) Avec les modifs que tu proposes bnito, est-il possible de choisir le type d'impact sur le prix d'une déclinaison ?
Dans mon exemple mes produits ont deux attributs : Taille et Matière. Le client a le choix entre 4 tailles, jusque là tout va bien, le prix s'incrémente bien. Et ensuite il faut choisir la Matière, Textile ou PVC. Pour le textile, rien ne change. Pour le PVC il faudrait augmenter le prix de 20%. Le problème c'est que l'impact sur le prix, dans le BO, ne se fait qu'en euros et pas en pourcentage. Avec votre modif, est ce que cela est possible ?

Merci par avance :)

Link to comment
Share on other sites

Avec ma modification, les variations de prix ne se font qu'en pourcentage. avec la solution telle qu'elle a été développer par Prestashop, on ne peut gérer les deux type de variation de prix (pourcentage et/ou euro). c'est vraiment dommage d'ailleurs. moi j'ai fait la modification en pourcentage car je n'avais besoin que d'une variation en pourcentage. mais pour vos 4 tailles vous n'avez qu'a calculer le variation de prix en euro en pourcentage comme ca tout vos variation de prix seront en pourcentage et hop l'affaire est dans le sac !, par contre il faut savoir que cette modification va influencer sur tous les produits ! il faut faire ce changement de code avant la création de tous les produits. Etant membre sénior vous devez connaitre la raison et donc je ne m'entendrais pas sur le sujet.

J'espère avoir répondu à votre demande.

Link to comment
Share on other sites

Je ne vois pas ça très pratique de calculer le prix comme ça, je risque d'avoir trop d'arrondis et je sais que presta a quelques soucis avec.
L'idéal aurai été vraiment de pouvoir cumuler les 2 options (le premier en € et un autre en %) par le biais d'un ptit module ou autre.
Dans mon cas cette solution ne va pas convenir je pense, tant pis :)

merci d'avoir répondu :)

Link to comment
Share on other sites

A mon sens, je pense qu'il n'y a pas de module que l'on puisse développer pour faire ce changement, car ce que j'ai changé, touche aux classes et autre fichier à la fois dans le Back et dans le Front, sinon j'aurai développé ce module car c'est très interessant ! à mon humble avis, Prestashop devrait revoir totalement cette gestion des déclinaisons, car elles sont chargées dans le front à chaque impression d'une fiche produit sous forme de fonction JS, ce qui fait qu'il ne faut pas trop de déclinaisons, arrivé a 4000 déclinaison c'est chaud. et pourtant j'ai eu a faire un produit qui avait 1240000 déclinaisons donc impossible à mettre en place j'ai donc revu la politique de ce produit. enfin c'est juste pour dire, il faudrait refondre la gestion des déclinaisons plus sur un solution AJAX comme ca pas de chargement de toute les possibilité mais une création à la volée dans le Front. enfin c'est beau de parler mais c'est pas encore pour maintenant.

Link to comment
Share on other sites

pour répondre a Anteus, non pas pour le moment, il faudrait refondre la solution actuelle de prestashop pour les declinaisons.

il faudrait donc faire un feedback vers prestashop pour cette modification très utile !

Link to comment
Share on other sites

  • 3 weeks later...
En fait pour les attribut en intervalle c'est un peu mal exprimé... je crée deux groupe d'attribut "hauteur" et "largeur" dans les quels je mets mes attribut qui se nomme "0 - 1000" "1000 - 2000" et "2000 - 3000" ainsi sur la fiche produit une fois mes déclinaisons de produits créées je me retrouve avec un menu déroulant ou sont inscrit mes intervalles.

ensuite avec ma petit fonction javascript sur le bouton "enregistrer" les personnalisations je fais un controle c'est à dire que je décompose le text que j'ai selectionne dans mon menu déroulant (attention le texte "text" et non la valeur "value" c'est a dire "0 - 1000" par exemple et non la valeur contenu pour ce choix ex: 3 qui correspond à l'idée de l'attribut) donc je reprends...
une fois récupéré cette valeur du text je la décompose pour récupéré 0 et 1000 c'est juste un travait sur les chaines avec les fonction de chaine de javascript. puis je compare mes deux valeurs (attention tranformé en numérique ! pour la comparaison) aux valeur saisies dans les champs texte de personnalisation.
mais je vais faire evoluer cette fonction pour ne pas avoir à sélectionner dans les liste elles se selectionnerons automatiquement à la saisie des valeurs dans les champs texte...

pour ce qui est du passage en pourcentage pour les modification de pris par attribut, j'ai modifier le fichier AdminAttributGenerator.php dans /admin/tabs à la ligne 22 et26 par :
private function addAttribute($arr, $price = 1, $weight = 0)


$price *= floatval($_POST['price_impact'][intval($attr)]);


et le fichier Product.php dans /classes à la ligne 1267 par :

$price *= $attribute_price;


et le fichier attributFront.js dans /js à la ligne 72 par :

var priceProductWR = (attribut_price * product_price_without_reduct) * currency_rate;


et le fichier product.js dans /themes/monthemes/js à la ligne 242 par :

var productPriceWithoutReduction2 = (attribut_price_tmp * productPriceWithoutReduction) * currencyRate;



(au fait mes fonctions javascript pour le controle les valeur saisit sont dans ce fichier elle retourne true si c bon et false si c pas bon. ensuite on conserve la fonction appelé par le bouton "enregistrer" des personnalisations on y ajoute juste que si les fonctions de verification retourne true alors on réalise le contenu de la fonction appelé par le bouton.)

cela permet non pas d'ajouter les valeurs au prix de base du produit mais de multiplier par un pourcentage ainsi :
si le prix ne change pas : dans la generation d'attribut la valeur sera 1 et non 0
pour une augmentation de 10% : 1.10
pour une réduction de 10% : 0.90

pour ce qui est des modification de poids rien ne change si pas changement la valeur est 0 si changement alors on ajout le poids voulu...

est ce que cela réponds à ta question ?
je crois que c'est tout ce que j'ai fait sur les modifs de code ... hésite pas s'il y a un problème. je ferais évoluer mon code de toute façon pour que nous n'ayons plus besoin des liste hauteur et largeur (enfin en les cachant quoi ..) et pour remplacer le signe "€" par "%" dans la génération des attributs pour que se soit plus clair ...



Afin de finaliser le tout j'ai oublié quelque chose d'important :
dans le fichier de classe Product.php à la ligne 1265 je crois, remplacez cette ligne :
$attribute_price = $usetax ? $result['attribute_price'] : ($result['attribute_price'] / (1 + (($tax ? $tax : $result['rate']) / 100)));


par :

$attribute_price = $result['attribute_price'] ;


le pourquoi du comment ? tout simplement pour éviter que le montant d'un produit hors taxes soit invalide.
car il serait en HT * 2 si je puis dire. la taxe serait appliquée deux fois.
Mais le montant TTC reste correct seul le HT était invalide.
Bonne programmation à tous.

Link to comment
Share on other sites

  • 2 years later...
  • 1 year later...

bonjour, je voudrais essayer de passer mes impacts d'attributs en pourcentages, mais je ne trouve pas les fichiers signalés et/ou les lignes ne correspondent pas :(

quelqu'un peut-il m'aider ?

je suis novice dans l'utilisation du php :(

Link to comment
Share on other sites

bon, ben, j'ai galéré ... mais je crois que j'ai réussi :D

 

j'ai pas trouvé le fichier AdminAttributGenerator.php dans /admin/tabs

 

j'ai changé comme expliqué le fichier Product.php dans /classes

 

ça modifiait bien le prix avec le pourcentage dans le panier, mais pas sur la page produit :(

 

j'ai pas trouvé le fichier attributFront.js dans /js

 

j'ai trouvé le fichier product.js dans /themes/monthemes/js mais pas le calcul indiqué ...

mais j'ai fini par repérer l'équivalent :

var taxExclPrice = (display_specific_price && display_specific_price >= 0 ? (specific_currency ? display_specific_price : display_specific_price * currencyRate) : priceTaxExclWithoutGroupReduction) * selectedCombination['price'] * currencyRate;

 

if (display_specific_price)

productPriceWithoutReduction = priceTaxExclWithoutGroupReduction * selectedCombination['price'] * currencyRate;

 

maintenant, le prix s'affiche correctement aussi en page produit ! :D

 

j'espère que ça va bien fonctionner !!!

Link to comment
Share on other sites

c'est en cherchant qu'on trouve ;)

 

le fichier AdminAttributGenerator.php

n'était pas dans /admin/tabs mais dans controllers/admin/

 

je n'ai toujours pas trouvé attributFront.js dans /js

mais ça a l'air de bien fonctionner ainsi ...

comme je l'ai modifié dans mon thème, ça suffit peut-être :)

Link to comment
Share on other sites

  • 2 months later...

bonjour :)

Plusieurs questions aux experts développeurs et utilisateurs de PS:

 

• Dans la boutique (PS 1.5.6) que j'essaie de mettre en place, j'aimerais que le prix sur la page produit s'actualise en fonction de la quantité commandée par le client, mais ce n'est pas le cas actuellement :-(
Comment faire cela ?

 

• j'ai créé des règles de livraison qui modifient le prix et ça marche bien en dynamique; en fait le prix de base est celui calculé sur le délai le plus court 48h, les prix sur les délais 5J et 10 J sont des prix remisés du 1er prix. Sur la fiche produit, la déclinaison 10J est celle qui s'affiche par défaut. J'aimerais que l'impact des autres paramètres réglables de mes produits ne soit pas un impact en euros, mais un impact en %. Cela est il possible ???

 

• Last question : est il possible de créer un prix de base pour un produit, et un prix pour les produits supplémentaires ? exemple PRIX DU PRODUIT à l'unité = 50€, prix du produit supplémentaire 10€ (donc 50€/1, 60€/2, 70€/3, 80€/4, 90€/5, 100€/6, etc...)

 

Merci infiniment pour vos éléments de réponse qui peuvent me sauver ! 

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...