Jump to content

Quelle variable pour afficher le prix de chaque déclinaison?


dwidoo

Recommended Posts

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

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… :wacko:

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

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

  • Like 2
Link to comment
Share on other sites

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

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

  • Like 1
Link to comment
Share on other sites

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

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

  • Like 1
Link to comment
Share on other sites

Salut virtualgadjo,

 

Merci encore pour ton aide :) . Tu avais raison, la migraine est assurée :wacko: . 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

  1. inclure des
    <span id="attr_a1">  <span id="attr_a2">

    , la même chose pour les attributs de type b et c

  2. 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 :wacko:

  3. 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
  4. 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

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

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

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

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

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

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

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

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

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...