dwidoo Posted September 18, 2011 Share Posted September 18, 2011 Bonjour, Cela fait une demi-journée que je cherche comment afficher le prix pour chaque déclinaison sur la page produit (product.tpl). Y a-t-il une variable à inclure dans la double boucle suivante,? Ou bien, faut-il quelques lignes de JavaScript / Jquery ? Besoin de votre aide ! {foreach from=$groups key=id_attribute_group item=group} … {foreach from=$group.attributes key=id_attribute item=group_attribute name=format} {$group_attribute|escape:'htmlall':'UTF-8'} <!-- Pour afficher le nom de l'attribut --> { VARIABLE PRIX?? |escape:'htmlall':'UTF-8'} <!-- Pour afficher le prix de cette déclinaison --> {/foreach} {/foreach} Version de Prestashop : 1.4.4 !! Merci D Link to comment Share on other sites More sharing options...
Yannkee Posted September 19, 2011 Share Posted September 19, 2011 Tu as cherche du cote de la construction de la variable $group_attribute ? notamment dans Classes/Product.php et $attribute_price Link to comment Share on other sites More sharing options...
dwidoo Posted September 19, 2011 Author Share Posted September 19, 2011 Tu as cherche du cote de la construction de la variable $group_attribute ? notamment dans Classes/Product.php et $attribute_price Bonjour Yann, Merci beaucoup pour ta réponse, j'ai regardé Classes/Product.php, aucune trace de $group_attribute, mais il y a bien $attribute_price. J'ai essayé d'afficher $attribute_price dans mon product.tpl mais cela n'affiche rien. De plus, je cherche à afficher le prix du produit avec chaque attribut, et non juste le surcoût lié à l'attribut. ex: produit avec attribut 1 : afficher 50€ ; produit avec attribut 2 : afficher 60€ (et non+10€) En fait, ca semble très compliqué ce que je demande… Je laisse le post ouvert en espérant qu'un jour une bonne âme donnera la solution. D Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 20, 2011 Share Posted September 20, 2011 Hello, je viens d'avoir à faire ça pour afficher des prix selon la taille dans le select, voilà comment je m'en suis sorti (s'il y a plus propre et plus élégant, je suis preneur mais ça marche) dans le template product.tpl, à l'endroit de l'affichage des attributs <label for="group_{$id_attribute_group|intval}" class="productAttLabel">{l s='Choisissez taille'} :</label> {assign var="groupName" value="group_$id_attribute_group"} <select name="{$groupName}" id="group_{$id_attribute_group|intval}" onchange="javascript:findCombination();{if $colors|@count > 0}$('#wrapResetImages').show('slow');{/if};"> {foreach from=$group.attributes key=id_attribute item=group_attribute} {foreach from=$combinations item=combi} {if $combi.attributes.0|intval==$id_attribute|intval} {assign var=htprice value=$combi.price+$product->getPrice(false, $smarty.const.NULL, 2)} {assign var=zitax value=$htprice/100*$tax_rate|floatval} {assign var=indprice value=$htprice+$zitax} {/if} {/foreach} <option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute|escape:'htmlall':'UTF-8'}">{l s='Taille'} {$group_attribute|escape:'htmlall':'UTF-8'} - {convertPrice price=$indprice}</option> {/foreach} </select> comme tu peux voir, j'ai isolé le prix HT et la partie taxe à ajouter au cas où subitement il me serait demandé d'afficher les deux, va savoir... il se peut que tu aies des valeurs à modifier notamment $combi.attributes.0 ce n'est peut-être pas 0 dans ton cas, si jamais ça ne marchait pas, un petit print_r de $combinations et tu verrais vite la valeur de attributes à chercher have swing 2 Link to comment Share on other sites More sharing options...
dwidoo Posted September 20, 2011 Author Share Posted September 20, 2011 Merci beaucoup virtualgadjo, c'est génial ce coup de pouce !! J'arrive bien à afficher des prix de déclinaisons mais pas les bons (disons que sur chaque attribut je souhaiterais pouvoir écrire "à partir de X €"). Je pense que mon cas est un peu plus complexe que toi car j'ai 3 groupes d'attributs pour les produits, mais je pense qu'en adaptant ton code, cela est faisable, qu'en penses-tu ? En tout cas, c'est super sympa d'avoir partagé ce bout de code ! A=1er Groupe d'attributs 4 attributs (numérotés dans l'ordre croissant des prix : A1<A2<A3<A4) B=2nd Groupe d'attributs 3 attributs (numérotés de la même façon: B1<B2<B3<B4) C=3eme Groupe d'attributs 2 attributs (C1<C2) Il faudrait qu'à côté de : A1 j'affiche le prix égal à A1+B1+C1 (donc la déclinaison la moins chère) A2 j'affiche le prix égal à A2+B1+C1 (donc la déclinaison la moins chère avec l'attribut A2) A3 j'affiche le prix égal à A3+B1+C1 (donc la déclinaison la moins chère avec l'attribut A3) ... B1 j'affiche le prix égal à A_selectionné+B1+C1 (donc la déclinaison la moins chère avec l'attribut A sélectionné et l'attribut B1) B2 j'affiche le prix égal à A_selectionné+B2+C1 (donc la déclinaison la moins chère avec l'attribut A sélectionné et l'attribut B2) et ainsi de suite... Peut-être qu'avec des tests {if} et des fonctions de type min / "minimum" , cela est réalisable sans monter une usine à gaz? Merci à tous de m'avoir lu D Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 20, 2011 Share Posted September 20, 2011 hello, en fait, je pense que le plus simple pour toi serait de commencer par faire un affichage de $combinations avec un print_r <pre>{$combinations|print_r}</pre> qque part dans ta page, tu y verrais clairement comment sont ventilés les attributs dont tu as besoin dans tes calculs, ensuite, ce n'est plus qu'une question de manipuler les valeurs d'un tableau, rien que smarty/php ne fasse fingers in the nose garde juste à l'esprit que le prix de base que manipule ps est ttc là où, en générale les valeurs d'attributs sont hors taxe (d'où mon passage par $product->getPrice(false, $smarty.const.NULL, 2) qui est le prix ht du produit have swing 1 Link to comment Share on other sites More sharing options...
dwidoo Posted September 20, 2011 Author Share Posted September 20, 2011 Merci encore à toi virtualgadjo, tes indications sont très intéressantes (j'ai beaucoup appris avec cet exercice) mais malheureusement cette méthode n'est pas applicable telle quelle dans mon cas car on a plusieurs groupes d'attributs interdépendants via les prix... Je veux dire que si on a 2 groupes d'attributs A et B, le prix de l'attribut B1 n'est pas le même, selon que j'ai choisi A1 ou A2 dans le premier groupe d'attributs. Il faudrait donc que je mémorise le choix de l'utilisateur dans le premier groupe d'attributs A dans une variable pour distinguer le prix de l'attribut B1 et l'afficher "dynamiquement" Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 21, 2011 Share Posted September 21, 2011 hello, ce que tu décris n'est en réalité pas si complexe à réaliser, ça suppose juste l'intervention de javascript comme il s'agit juste de valeurs informatives, ps se chargeant de changer le prix final à la volée (en js aussi d'ailleurs) en gros le principe consisterait a mettre les valeurs de prix des select dans des span chacun son id incrémenté ou une classe pour tous mais là, en tenant bien compte de leur ordre. ensuite, dans le js tu fais soit un tableau, soit une liste de variables (le tableau étant plus élégant, ou trois tableaux, un par attribut) et sur le change des selects, tu recalcules les valeurs de prix et réecris à la volée les span décoratifs c'est jouable, ce ne serait pas dans ps, ce serait même piece of cake... le petit truc dans ce cher ps étant de comprendre où aller les valeurs à manuipuler mais là, entre $combinations et $product on a à peu près tout ce dont tu as besoin à voir si le jeu en vaut la migraine have swing 1 Link to comment Share on other sites More sharing options...
dwidoo Posted September 21, 2011 Author Share Posted September 21, 2011 Salut virtualgadjo, Merci encore pour ton aide . Tu avais raison, la migraine est assurée . Je crois que je n'ai pas très bien compris l'algorithme que tu suggères. De plus, selon moi, -dans les select, ou plutôt dans les value des option il n'y a pas de valeur de prix mais $id_attribute _ créer le tableau n'est pas si facile dans mon cas (3 dimensions), et je doute que faire 3 tableaux soit une solution à mon problème car chez moi, le choix de l'attribut de type A va conditionner la disponibilité et le prix de chaque attribut B et C ; j'ai 3 groupes d'attributs : A1 à A4, B1 à B3, C1 et C2 et ; choisir A1 et A2 ne permettent pas de choisir B3 ; choisir A4 ne permet pas de choisir B1. Aussi, par exemple, B2 n'a pas le même prix en fonction du choix de A1 ou A3. C2 a un prix différent en fonction du choix de A. Ce que je comprends de ton idée adaptée à mon cas, c'est qu'il faut inclure des <span id="attr_a1"> <span id="attr_a2"> , la même chose pour les attributs de type b et c créer un tableau à 3 dimensions du style (attention, la migraine arrive ) [ [ [ prix_a1_b1_c1 , prix_a1_b1_c2 ] , [ prix_a1_b2_c1 , prix_a1_b2_c2 ] , [ NULL ,NULL ] ] , [ [ prix_a2_b1_c1 , prix_a2_b1_c2 ],.. Mais comment remplir un tel tableau en parcourant $combinaisons ? Un vrai casse-tête, quoi ensuite, en fonction des $id_attribute dans les value des options des select, on va chercher les prix dans le tableau et on les inscrit dans les span correspondant à la déclinaison en question ensuite à chaque "change" d'un select, on recommence l'étape 3 Suis-je sur la bonne piste ? Accessoirement, une question de néophyte : comment j'accède aux variables smarty $product et $combinaisons avec javascript ? En espérant ne pas t'avoir transmis ma migraine virtualgadjo, ni aux lecteurs… D Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 22, 2011 Share Posted September 22, 2011 hello, yes, la value des select se fait avec des id d'attributs, id que tu retrouves comme attributes dans l'array combinations et comme list aussi c'est pour ça que le plus simple consiste au départ à visualiser les tableaux de valeurs disponibles avec des print_r (dans des pre, plus lisible), ça permet de voir comment on peut les rendre relationnels pour ensuite faire les combinaisons possibles fais gaffe à un truc avec les id de tes spans, vérifie bien qu'il ne risque pas d'y avoir plusieurs fois le même, avant de les nommer mieux vaudrait faire tes combinaisons de variables have swing Link to comment Share on other sites More sharing options...
dwidoo Posted September 22, 2011 Author Share Posted September 22, 2011 Merci virtualgadjo, As tu lu mon message en entier ? Je demande car tu n'as pas réagi sur certains points… ;-) Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 23, 2011 Share Posted September 23, 2011 hello, ah yes, désolé, je n'ai pas répondu à la partie javascript de l'histoire de ce côté là, ouf rien de vraiment sorcier, les variables smarty sont présentes partout dans le template et donc, y compris entre des balises script. Jette-un oeil au source d'une page produit une fois servie par le navigateur, tu y verras la tripotée de variables js instanciée et qui sont en fait récupérées dans le template par smarty. Prestashop a une gestion assez crappy de la partie templates, du coup, on retrouve ces variables un peu partout dans la page mais bon, esthétique et lecture du source mises à part, dans la mesure où on y accède sur des évènements post load et domready, elle sont dispo et ça fonctionne pour ce qui est de remplir le tableau multidimensionnel, ce n'est en réalité pas si difficile une fois qu'en regardant $combinations tu as repéré où snt les valeurs des attributs Ceci dit, je serais toi, je n'exclurais pas totalement l'idée des trois tableaux de valeurs, un par attribut en fait, ça peut être plus lisible et js va très vite à combiner et/ou calculer des valeurs ce n'est peut-être pas nécessaire de remplir un tableau complexe de toutes les valeurs pré calculées là où un bon petit algo dans une fonction fera le boulot à la volée rapidement sur les onchange have swing Link to comment Share on other sites More sharing options...
dwidoo Posted September 23, 2011 Author Share Posted September 23, 2011 Salut! Grâce à tes conseils, je pense être pas trop mal du côté de l'algorithme. Je parviens à placer le prix de chaque attribut dans une liste de variables (on verra plus tard pour le tableau), mais j'ai du mal à débugguer mon code pour afficher le prix calculé dans le div correspondant. Ca doit être simple et devant mon nez, mais je ne vois pas encore ce qui cloche... Il n'y a rien qui s'affiche et le code source HTML est : Voici mon code, si jamais mon(mes) erreur(s) te saute(nt) aux yeux pour chaque attribut j'ai <div id="attr_{$id_attribute|intval}"></div> <script type="text/javascript"> //remplissage tableau avec prix de chaque attribut {foreach from=$combinations item=combi} prix_{$combi.attributes.0}_{$combi.attributes.1}_{$combi.attributes.2} = {$combi.price|intval}; {/foreach} //Prix mini par format: plusieurs tests pour calculer la somme et l'afficher $('attr_21').html(prix_21_25_29+{$product->getPrice(true, $smarty.const.NULL)|intval}); $('attr_22').html(parseFloat(prix_23_25_29)+{$product->getPrice(true, $smarty.const.NULL)|intval}); $('attr_23').html('prix_23_25_29+{$product->getPrice(true, $smarty.const.NULL)|intval}'); ... </script> Les prix ne s'affichent pas et voici le code source HTML que j'obtiens : <script type="text/javascript"> prix_21_25_29 = 0; prix_21_25_28 = 20; prix_21_26_29 = 20; prix_21_26_28 = 40; prix_22_25_29 = 15; prix_22_25_28 = 35; prix_22_26_29 = 35; prix_22_26_28 = 55; prix_23_25_29 = 45; ... //Prix min par format $('attr_21').html(prix_21_25_29+75); $('attr_22').html(parseFloat(prix_23_25_29)+75); $('attr_23').html('prix_23_25_29+75'); D Link to comment Share on other sites More sharing options...
dwidoo Posted September 26, 2011 Author Share Posted September 26, 2011 Pour simplifier ma question, comment j'affiche dans mon template le contenu d'une variable javascript? Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 26, 2011 Share Posted September 26, 2011 hello, si tu fais ça avec jquery et pas mon cher mootools et si attr_21 est un identifiant, la syntaxe est $('#attr_21').text() ou .html() j'imagine que tu fais ça dans la partie affichée des options du select et qu'avec une boucle tu as généré des span ou autres avec id="attr_" auquel tu concatène la valeur d'une variable si c'est le cas, ça devrait marcher garde juste à l'esprit que pour mettre à jour les prix en fonction de valeurs choisies, il faudra ensuite faire tout ça sur un évènement, ce que tu fais là s'exécutera sur le domready ou le load a condition bien sûr de le faire sur un de ces évènements, genre (en jquery) $(document).ready(function(){ // là, ton js par ex $('#attr_21').html(prix_21_25_29+75); $('#attr_22').html(parseFloat(prix_23_25_29)+75); $('#attr_23').html('prix_23_25_29+75'); }) have swing Link to comment Share on other sites More sharing options...
dwidoo Posted September 26, 2011 Author Share Posted September 26, 2011 salut virtualgadjo, oui Jquery bien sûr. oui pour la boucle qui génère les span d'identifiant attr_"numéro" J'avais déjà testé ce code avec html() mais sans le document.ready(). De toute façon, même avec celui-ci, ca ne fonctionne toujours pas, les div #attr_XX etc. restent vides Je peux te copier ou t'envoyer mon code si tu veux bien jeter un oeil. En tout cas, j'apprécie l'effort, et l'aide depuis le début ! Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 27, 2011 Share Posted September 27, 2011 hello, je ne suis pas beaucoup là aujourd'hui (détour hosto pour voir un pote...) mais oui, je jetterais un oeil avec plaisir sur le code l'idéal serait de le voir tourner en ligne mais tu n'as peut-être pas encore basculer sur un espace de preprod. l'intérêt de le voir en ligne est d'inspecter le code source de la page pour voir ce qui résiste, du coup, en fait, le mieux serait que tu topes le code source de la page une fois servie comme ça, j'aurais tout pour jouer, les identifiants, le js récalcitrant avant que je ne puisse me pencher dessus tu peux déjà voir comment tu déclares tes variables. a priori si, dans la page tu as <script type="text/javascript"> var prix0 = 0; $(document).ready(function(){ $('#attr_0').text(prix0); }); </script> <!--et, plus bas, dans le chtemele--> <span id="attr_0"></span> ça devrait afficher 0 dans le span attention à un truc, si tes var prixxxx sont le résultat d'un calcul, il faut aussi mettre calcul et variable dans un évènement pour que le calcul s'exécute et renseigne les variables en fait, si ton calcul et tes variables sont destinés à être exécutés/renseignées sur plusieurs évènements, l'idéal est de faire une fonction avec tout ça, fonction que tu appelleras chaque fois que tu en as besoin, sur le domready, le change d'un select, etc. il suffit juste que ta fonction retourne un tableau de variables et hop le tour sera joué si ça ne se produit qu'une fois, tu peux soit le mettre dans le domready, soit carrément dans une fonction auto exécutée (function(){ //calcul, variable et remplissage des attr_ }(); have swing Link to comment Share on other sites More sharing options...
dwidoo Posted September 27, 2011 Author Share Posted September 27, 2011 hello virtualgadjo, je viens de faire un test basique avec ton code (attr_0 et prix_0), ca laisse le span vide! je t'envoie un lien de l'espace preprod par message privé en tout cas, c'est hyper sympa de ta part de bien vouloir jeter un oeil big thanks Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 28, 2011 Share Posted September 28, 2011 hello, tu as testé après les petites corrections d'usage ? have swing Link to comment Share on other sites More sharing options...
dwidoo Posted September 28, 2011 Author Share Posted September 28, 2011 Oui tes conseils étaient bons, ca et aussi il fallait utiliser eval() pour évaluer un string comme variable (puisque mes noms de variables étaient générés avec le contenu des variables id_attribute) sinon je t ai envoyé un message privé... Link to comment Share on other sites More sharing options...
virtualgadjo Posted September 28, 2011 Share Posted September 28, 2011 re dans la mesure du possible, évite eval qui est le diable si tu veux donner une valeur "entier" ou "float" en js, mieux vaut utiliser parseInt() ou parseFloat() have swing 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