Jump to content

[Patch] Afficher les prix au kilo ou au litre (MAJ -> v3)


Recommended Posts

Bonjour à tous.

J'ai eu besoin de pouvoir afficher le prix au kilo sur certains produits afin d'être conforme à la législation.

J'ai cherché et n'ai rien trouvé. Je vous livre donc ma solution. Je l'ai étendue pour afficher un prix au litre ou autre.
Il est impossible avec la conception actuelle de Prestashop d'en faire un module. Donc il va falloir attaquer le code source. Les modifs à faire sont simples, et ne touchent pas au code sensible.

Comment ça marche ?
On se base sur le prix (jusque là, ça va) et sur le poids logistique renseigné dans la fiche produit.
On divise l'un par l'autre et on a ce qu'on voulait.
La manip est faite pour être compatible avec les attributs (et leur modifs de prix et poids) et, petit bonus, le prix au kilo change bien quand on change de déclinaison.
L'affichage n'a lieu que sur la fiche produit.

Prérequis :
Vous n'utilisez pas vraiment le poids des commandes pour calculer les fdp :
* Le poids renseigné dans les fiches produits est le vrai poids (et non le poids logistique ie avec emballage...)
* Je la refais : le poids renseigné dans les fiches produits est le poids net (et non le poids brut)
* Pour les autres unités, la valeur renseignée dans les fiches produits est nette et est "la bonne en unité" : par exemple, une bouteille de vin de 75cl, vous renseignez dans le champs poids la valeur 0.75 ; ainsi vous afficherez un prix au litre.

Et quelle version de Prestashop ?
Ceci est valable pour la 1.3.0.5 (ie 1.3.0 RC2).
Valable aussi pour la 1.2.5 (testé par Gilbert).
Vous devez refaire la manip après chaque mise à jour, puisque vous écraserez les fichiers modifiés.

Instruction d'installation :
Téléchargez le diff en pièce jointe du message et appliquez ça.
Si ça ne vous parle pas, c'est pas compliqué, vous ouvrez ça avec votre éditeur de texte, et vous ajoutez les lignes commençant par un + aux bons endroits (en enlevant le +) et quand il y a un - (un moins) vous enlevez la ligne.

Exemple :
Le diff :

diff --git a/themes/prestashop/css/global.css b/themes/prestashop/css/global.css
index d117840..50477bd 100644
--- a/themes/prestashop/css/global.css
+++ b/themes/prestashop/css/global.css
[spam-filter] -2250,3 +2250,9 [spam-filter] A
B
+ligne_entre_B_et_C
C
D
-E
+nouveau_E
F
G



Vous trouvez les lignes A et B et C et D, et entre B et C vous ajouter le bloc où il y a les + (en les enlevant).
Pour la deuxième partie, c'est pareil, mais vous enlevez d'abord la ligne ou il y a le moins.

Pour les avertis vous faites dans la racine de votre install prestashop : patch < priceweight.diff


Dans le BO :
Il vous faut créer deux caractéristiques :
* special_priceweight avec comme valeur possible : 1
* special_priceweight_unit avec comme valeurs possibles kg, L, et/ou vos autres unités (celui là est optionnel, s'il n'existe pas ou n'est pas affecté à la fiche produit, "kg" sera utilisé)

Ces deux "caract spéciales" ne seront pas affichées sur la fiche produit.

Activer le prix au kilo sur la fiche produit :
* On renseigne le poids sur la fiche produit ainsi que les éventuelles modifications de poids des déclinaisons*.
* On place la caractéristique "special_priceweight" à "1".
* Si nécessaire, on choisit l'unité à afficher avec special_priceweight_unit.

*Exemple (à la con) pour les déclinaisons : Vous vendez des biscuits, vous avez deux déclinaisons : paquet de 100g (par défaut) et paquet de 200g.
* Vous créez la déclinaison "conditionnement" avec comme attribut "Paquet de 100g" et "Paquet de 200g" (si ce n'est pas déjà fait)
* Vous créez une fiche produit en spécifiant sur la fiche principale les valeurs de la décl par défaut le prix, disons 5€, et le poids 0.1 (=100g).
* Vous ajouter la décl Paquet de 100g, aucune modif prix, aucune modif poids.
* Vous ajouter la décl Paquet de 200g, modif prix +3€, modif poids +0.1.

Vous aurez ainsi : Paquet de 100g, 5€, 50€/kg et Paquet de 200g, 8€, 40€/kg.

(rem : on peut aussi faire 0€, 0kg sur la fiche principale et faire les modifs en +prix et +poids, plutôt que faire des différences alambiquées)


Précautions
Comme d'hab, utilisez ça à vos risques et périls, blablabla, testez avant sur une version qui n'est pas en production, blablabla, je ne saurez être tenu pour responsable de tout préjudice subi suite à l'application de ce patch.

Licence
Copyright moi. Vous êtes libre d'utiliser et d'améliorer, à la condition de le signaler et de partager vos améliorations dans ce post (partage dans les mêmes conditions). Sinon, je saurais vous retrouver :vampire:

À vous...
...de jouer !
Et de partager.

--

Historique
* v1 :
** Release initiale, pour tests.
* v2 :
** Correction mineures (NOTICE & cas où le poids renseigné vaut 0)
** Prise en compte de special_priceweight comme modifieur (pour par exemple afficher un prix par 100g tout en ayant un vrai poids en kilo dans la fiche produit (dans ce cas, on met 0.1 dans special_priceweight))
* v3 :
** 2 Corrections majeures.

--

Un fichier zip avec les fichiers modifiés prêts pour la 1.2.5 se trouve plus loin dans le topic. Lisez le topic pour comprendre les implications de vos changements.

--

PS: info pour moi :
v1 : commit f66bfc522aad2a7623e757eabaff447c7fe48a0c.
v2 : commit 898352ea829e58680196a6d0ecee43f9a3426645.
v3 : commit 43832d14322cd9d4897fb2efe9602bbe62566fe7.

priceweight.diff.txt

priceweight-v2.diff.txt

priceweight-v3.diff.txt

Link to comment
Share on other sites

J'ai deux erreurs erreur sur une install 1.2.5 en local dans le fichier product.php

Call-time pass-by-reference has been deprecated in C:\wamp\www\prestashop\product.php on line 158


J'ai bien repris le code indiqué pourtant.

Idem pour la ligne 160
Undefined offset: 1 in C:\wamp\www\prestashop\product.php on line 160


Avec le code suivant:

        /* MAX Special Features */
       $SpecialFeatures = array();
       if ($features)
           {
           $features_new = array();

           foreach ($features as $feature)
               {
               // Traiter séparement les special features et les enlever de $features
           if (preg_match('`^special_(.+)$`', $feature['name'], &$preg_res)!==false)
                   {
                   $SpecialFeatures[$preg_res[1]] = $feature['value'];
                   }
               else
                   {
                   $features_new[] = $feature;
                   }
               }

           $features = $features_new;
           }




Si tu sais si j'ai fait une erreur quelque part ou comment résoudre le souci, je suis preneur. Merci en tout cas pour ce patch qui va je pense devenir indispensable!

Le calcul s'affiche cependant et semble juste quand je mets au kg, mais pas au litre:

Warning: Division by zero in C:\wamp\www\prestashop\product.php on line 331

Notice: Undefined variable: combinations in C:\wamp\www\prestashop\product.php on line 333


Voici le code de mon product.php de la ligne 330 à 338
            $product_weightprice = round(($product->getPrice(true, null)) / ($product->weight), 2);
           if ($combinations)
               {
               $combinations_weightprice = array();
               foreach ($combinations AS $id_product_attribute => $comb)
                   {
                   $combinations_weightprice[$id_product_attribute] = round(($product->getPrice(true, null) + $comb['price']) / ($product->weight + $comb['weight']), 2);
                   }
               }







D'autre part, est-il possible de ramener la valeur et le calcul au gramme ou au mililitre, ou aux 100gr ou 100ml?

Link to comment
Share on other sites

J'ai deux erreurs erreur sur une install 1.2.5 en local dans le fichier product.php

Call-time pass-by-reference has been deprecated in C:\wamp\www\prestashop\product.php on line 158



Tu as quelle version de php ? 5.3.x ?
Enlève le & devant $preg_res dans le preg_match().
Cette erreur sera réglée.

Idem pour la ligne 160
Undefined offset: 1 in C:\wamp\www\prestashop\product.php on line 160

Si tu sais si j'ai fait une erreur quelque part ou comment résoudre le souci, je suis preneur. Merci en tout cas pour ce patch qui va je pense devenir indispensable!


Étrange, si le le preg_match match alors la parenthèse capturante doit capturé et $preg_res[ 1 ] doit être défini.

Essaye sans le !==false pour voir. j'ai peut être été un peu trop souple.

(PS: utilise les balises code et non quote sur le forum pour le code source)
Link to comment
Share on other sites

Merci pour ta réponse si rapide, et désolé pour les balises peu lisibles, j'ai corrigé.

J'ai PHP 5.3.0, je viens de tester tes propositions, les deux erreurs en 158 et 160 n'apparaissent plus.
Il reste les erreurs en 331 et 333 quand j'essaie une autre valeur dans special_priceweight_unit que kg. Cela ne fonctionne pas avec "l" ou "litre" ( voir mon post précédent)

Link to comment
Share on other sites

Merci pour ta réponse si rapide, et désolé pour les balises peu lisibles, j'ai corrigé.

J'ai PHP 5.3.0, je viens de tester tes propositions, les deux erreurs en 158 et 160 n'apparaissent plus.
Il reste les erreurs en 331 et 333 quand j'essaie une autre valeur dans special_priceweight_unit que kg. Cela ne fonctionne pas avec "l" ou "litre" ( voir mon post précédent)


J'ai fait quelques modifications pour assurer le coup.
Le NOTICE va disparaitre, et pour la division par zéro, j'ai mis des conditions. Je pense que le poids renseigné sur la fiche était à zéro.
Je te colle le code qui va en bas de product.php :

// MAX Prix au Kg
$combinations_weightprice = null;
$product_weightprice = null;
$display_weightprice = false;
$unit_weightprice = null;
if (isset($SpecialFeatures['priceweight']) && $SpecialFeatures['priceweight']=='1')
   {
   $display_weightprice = true;
   $product_weight = floatval($product->weight);
   if ($product_weight > 0)
       {
       $product_weightprice = round(($product->getPrice(true, null)) / ($product_weight), 2);
       }
   else
       {
       $product_weightprice = 'ERROR';
       }
   if (isset($combinations) && is_array($combinations))
       {
       $combinations_weightprice = array();
       foreach ($combinations AS $id_product_attribute => $comb)
           {
           $comb_weight = $product_weight + floatval($comb['weight']);
           if ($comb_weight > 0)
               {
               $combinations_weightprice[$id_product_attribute] = round(($product->getPrice(true, null) + $comb['price']) / ($comb_weight), 2);
               }
           else
               {
               $combinations_weightprice[$id_product_attribute] = 'ERROR';
               }
           }
       }
   //var_dump($product_weightprice, $combinations_weightprice);

   if (isset($SpecialFeatures['priceweight_unit']))
       {
       $unit_weightprice = $SpecialFeatures['priceweight_unit'];
       }
   else
       {
       $unit_weightprice = 'kg';
       }
   }
$smarty->assign(array(
   'display_weightprice' => $display_weightprice,
   'unit_weightprice' => $unit_weightprice,
   'product_weightprice' => $product_weightprice,
   'combinations_weightprice' => $combinations_weightprice));

Link to comment
Share on other sites

Nickel ca fonctionne.
Tu avais raison, poids non renseigné. Merci en tout cas pour ton support ultra rapide et ta disponibilité!

Dernière question, peux tu me dire quelle partie du code modifier pour avoir un ratio non plus au kg ou au l mais aux 100gr ou aux 100ml; ou au gr ou au ml.
En mettant 0.1 ou 0.01 dans special_priceweight dans le BO, est-ce que cela pourrait marcher?

Link to comment
Share on other sites

En fait, tu peux considérer que ton unité est "100g" (donc mettre "100g" dans special_priceweight_unit).
Quand tu as 250g, tu entres dans poids : 2.5

Remarque :
En faisant ça, le module de calcul des fdp croira à 2.5kg, il faut ne pas avoir l'utilité de ce calcul de fdp.
Ou bien, il faut en tenir compte quand on établit ses tranches, quand on lit 1, c'est 100g, et donc faire ses tranches en unités "100g", mais cela suppose que tous les produits sont dans cette unité.

Link to comment
Share on other sites

Oui j'avais pensé à cette solution également, mais c'est vrai que ca obligerait à revoir le poids de tout le catalogue.

C'est pourquoi je me demandais s'il était possible de mettre un coefficient multiplicateur lors du calcul du prix au litre ou au kg.

Théoriquement:
Il divise le prix entré dans le BO X 1 (correspond au poids 1 -kg ou litre) par le poids entré dans le BO.
Il "suffirait" de diviser ce chiffre par 10 pour un poids au 100gr , par 1000 pour un poids au gramme.

Après la pratique, je ne sais pas si c'est jouable.

Link to comment
Share on other sites

Oui j'avais pensé à cette solution également, mais c'est vrai que ca obligerait à revoir le poids de tout le catalogue.

C'est pourquoi je me demandais s'il était possible de mettre un coefficient multiplicateur lors du calcul du prix au litre ou au kg.

Théoriquement:
Il divise le prix entré dans le BO X 1 (correspond au poids 1 -kg ou litre) par le poids entré dans le BO.
Il "suffirait" de diviser ce chiffre par 10 pour un poids au 100gr , par 1000 pour un poids au gramme.

Après la pratique, je ne sais pas si c'est jouable.


C'est jouable :

Il y a a 2 parties à remplacer par :

if (isset($SpecialFeatures['priceweight']) && floatval($SpecialFeatures['priceweight']) > 0)
   {
   $display_weightprice = true;
   $product_weight = floatval($product->weight)/floatval($SpecialFeatures['priceweight']);



Et celle là au bon endroit à la place de l'ancienne :

$comb_weight = $product_weight + floatval($comb['weight'])/floatval($SpecialFeatures['priceweight']);



Et donc dans special_priceweight tu mets "1" pour le comportement normal, "0.1" (avec un point, pas une virgule) pour le coup des "100g", "0.001" pour avoir les grammes.
Et dans special_priceweight_unit, l'unité qui va bien.

Ainsi, on a un poids dans la fiche plus correct.

Link to comment
Share on other sites

Voilà, j'ai mis les corrections. Une v2 est donc née.
Merci à Gilbert pour ses retours.

Ce qui a changé :

J'ai pris en compte special_priceweight comme modifieur.
Je reste dans les prix / poids pour l'exemple, mais ça reste valable pour des litres... :

Avant :
prix_poids = prix / poids_fiche

Maintenant :
prix_poids = prix / poids_corrigé
avec poids_corrigé = poids_fiche / special_priceweight

Reprenons nos 2 boîtes de biscuit (5€,100g et 8€,200g) (voir premier post).
Donc pour faire un poids au 100g :
On place "100g" dans special_priceweight_unit
On place "0.1" dans special_priceweight
Dans les fiches produits, on place "0.1" et "0.2" dans le poids (nos poids en kg).
On a ainsi 5€/100g et 4€/100g.

Cela permet de garder un poids dans la fiche plus réel.

Link to comment
Share on other sites

Bonsoir,

Est-t-il possible d'effectuer le même calcul sauf en utilisant $localisation pour mettre le $weight ?
Cette variable est présente (idem ean13) dans product et dans les déclinaisons.

[edit] J'ai tappé trop vite, ce sera le prix m² que je dois affiché d'où l'utilisation des autres variables

Pourquoi cette question, car dans mon cas, je ne peux utiliser le poids réel pour les fdp.
Mes fdp sont plutôt 1 = 1 palette, aussi je me sert des champs ean13 et localisation pour ces infos (ean13 me sert au m² actuellement)...

Ce n'est pas l'idéal mais je ne me sert pas de ces champs aussi, cela m'évite de recréer des variables et de chercher à les inclures partout.

Link to comment
Share on other sites

Bonsoir,

Est-t-il possible d'effectuer le même calcul sauf en utilisant $localisation pour mettre le $weight ?
Cette variable est présente (idem ean13) dans product et dans les déclinaisons.

[edit] J'ai tappé trop vite, ce sera le prix m² que je dois affiché d'où l'utilisation des autres variables

Pourquoi cette question, car dans mon cas, je ne peux utiliser le poids réel pour les fdp.
Mes fdp sont plutôt 1 = 1 palette, aussi je me sert des champs ean13 et localisation pour ces infos (ean13 me sert au m² actuellement)...

Ce n'est pas l'idéal mais je ne me sert pas de ces champs aussi, cela m'évite de recréer des variables et de chercher à les inclures partout.


Oui, c'est faisable.
Pour la localisation, pas de soucis.
Pour l'ean13, il se met pas dans les urls rewritées ?

Remplacer dans le code fourni $product->weight par floatval($product->location) (c'est juste dans la deuxième partie de product.php)
Là il faut impérativement floatval, car la source est une chaîne de caractère, et il faut la convertir en décimal flottant, sinon il peut la transcoder en entier et ça peut être génant. Pour le weight, il le faisait déjà au chargement de l'objet.
Bien mettre un point comme séparateur de partie entière / décimale.
Link to comment
Share on other sites

Bonsoir,

Je ne sais pas si ean13 est géré différemment de location mais, il est récupérable pour les factures PDF et les BL. Dans mon cas, je précise aux clients, le poids total d'une palette.

Je vais essayer, bien que peu à l'aise avec la mise en forme du fichier texte.

Il est vrai que je suis plus familiarisé aux modif commentée dans les fichiers sources...

Link to comment
Share on other sites

Bonjour,

Je suis perdu... J'ai commencé les modifs mais j'avoue ne pas être sur de moi...

Pour Product.php cela doit-être ok, sauf pour 2ime changement... Faut-il remplacer //Pack management ou ajouter à la suite...

Pour global.css... Je n'ai pas ul.bullet li.feature_cat... Je l'ajoute, où mettre primary_block ?

Pour Product.tpl ... $product->ecotax est à remplacer ou faut-il ajouter à la suite....

Je reconnais ne pas être à l'aise avec la lecture du fichier texte...joint...

Sans vouloir abuser, est-il possible d'avoir un fichier exemple :

// début AJOUT ... //

// fin AJOUT//

Ou des précisions sur la lecture du fichier texte...

En attendant, un grand merci pour cette contribution qui mériterait d'être de base (les prix m² ou Kg étant obligatoire...)

Link to comment
Share on other sites

Toutes les infos nécessaires sont dans le diff.

Néanmoins, j'ai fait un zip pour ceux qui n'ont pas d'autres modifications sur leur boutique, il n'y a qu'à dézipper et remplacer les 3 fichiers (j'ai gardé l'arborescence).
La version concernée est la 1.2.5

Pour les autres, il suffit de suivre le fichier diff, c'est pas compliqué, je vous assure. Il y a le contexte autour (qq lignes avant, quelques lignes après) pour repérer où faire les modifs. Et quand une ligne commence par un moins, on doit l'enlever, quand elle commence par un plus, on doit la rajouter.

prestashop-priceweight-v2-for-1.2.5.zip

Link to comment
Share on other sites

Un grand merci Maxime,

Je supposais bien que seules les lignes marquées d'un symbole devaient changer mais une fois devant le code, ... j'ai commencé à prendre des morceaux de ligne non commentées.... (Stupido...). Pis qd j'ai ouvert global Css... pas trouvé la correspondance...

Je teste et surtout compare le zip avec mon back up pour produire qqchose de propre...

Une question toutefois, ligne 1952 de mon AdminProduct (dans //Datas), dans static public function getproductproperties, il n'y a pas de $row[`location`]. Est-ce que cela peut expliquer le fait que le champ emplacement n'est pas mémorisé pour les déclinaisons ?

En effet ean13 est bien présent et correctement mémorisé... C'est la seule différence que j'ai trouvé en épluchant les 35 pages de code d'AdminProduct... Hormis les float à mettre bien sur ;)

Link to comment
Share on other sites

J'ai pas le code sous les yeux là, mais c'est peut-être ça.

Le développement de PS se fait sans tests unitaires, donc il y a beaucoup de régression, et cela doit en être une.
Je regarderais ce soir, quand j'aurais un éditeur de texte digne de ce nom sous la main.

Link to comment
Share on other sites

Allelui YEA !

C'est "presque" OK.... Un big +100 pour Maxim.

J'ai juste un pb avec mes déclinaisons.... le prix m² s'affiche bien mais ne change pas... Faut-il que je remplace weight ailleurs ? J'ai essayé dans $comb...float...'weight' sur product.php de mettre ean13 à la place... Pis pas de changement... M'affiche toujours le premier calcul... x €/m² de mon produit de base... Pourtant ean13 est correctement enregistré avec les déclinaisons....

Une idée ?

A moins que la solution ne soit de me servir de location ? mais Quid de la mémorisation....

Link to comment
Share on other sites

Bonjour,

Tout d'abord merci à Maxime G pour cette belle modification très bien détaillée... Ca fait plaisir à lire...

J'ai un petit problème, je ne vois pas trop comment la résoudre. J'ai des produits "solides" et des produits "liquides". Soit un affichage pour des prix au kg et pour des prix au litre.
Comment faire cette distinction sur les fiches produits ?
Merci pour vos éclairs de génie...

Link to comment
Share on other sites

Je galère un peu avec le blocnote windows qui prend pas les retours chariots de type unix...

Dans product.php, je vois (difficilement !) qu'il ne peuple le tableau $combinations qu'avec ce qu'il a besoin (enfin presque).

Repère la ligne où il y a :

$combinations[$row['id_product_attribute']]['price'] = floatval($row['price']);


Il faut ajouter :

$combinations[$row['id_product_attribute']]['ean13'] = $row['ean13'];



Et comme la requête SQL à la base de ça ne donne pas tout, dans classes/Product.php, dans la requête de la fonction getAttributesGroups(), il faudrait ajouter (en toute logique) pa.`ean13` après le pa.`weight`

Ainsi, tu pourras te servir de $comb['ean13'].

(c'est à vue de nez, ie non testé)

Link to comment
Share on other sites

Bonjour,

Tout d'abord merci à Maxime G pour cette belle modification très bien détaillée... Ca fait plaisir à lire...

J'ai un petit problème, je ne vois pas trop comment la résoudre. J'ai des produits "solides" et des produits "liquides". Soit un affichage pour des prix au kg et pour des prix au litre.
Comment faire cette distinction sur les fiches produits ?
Merci pour vos éclairs de génie...


Merci ;-)

C'est le rôle de la caractéristique special_priceweight_unit qui si non spécifiée sur la fiche produit, affiche kg. Si on y met kN, ça affichera kN (bon le kilonewton c'est l'exemple à la c..n, on peut mettre ce qu'on veut). Bien entendu, le poids renseigné sera à interpréter dans l'unité spécifiée.

On peut utiliser special_priceweight différent de 1 pour essayer de garder un poids renseigné sur la fiche produit (ou sur les déclinaisons) plus fidèle (cas des sous unités du kg). Voir les posts plus haut.
Link to comment
Share on other sites

Bon, j'ai testé les modifs mais non pas de mise à jour du prix sur les déclinaisons,...

Il doit encore manqué qqch...

Dans product.php :

Vers la ligne 342, dans le code de la modif, tu as du remplacer :
$comb_weight = $product_weight + floatval($comb['weight']) / floatval($SpecialFeatures['priceweight']);


par :

$comb_weight = floatval($comb['ean13']) / floatval($SpecialFeatures['priceweight']);



place juste avant un var_dump($comb['ean13']);
Et regarde ce qu'il te dit. Il devrait t'afficher tes surfaces.

--

Sinon :

Vers la ligne 283, vers :

$combinations[$row['id_product_attribute']]['weight'] = floatval($row['weight']);



Tu as dû ajouter :

$combinations[$row['id_product_attribute']]['ean13'] = $row['ean13'];



Place juste avant un var_dump($row['ean13']);
Et regarde ce qu'il te dit. Il devrait t'afficher tes surfaces.

--

Sinon :

Dans classes/Product.php, vers la ligne 1506, dans la fonction getAttributesGroups(),
Tu as bien ajouté pa.`ean13` après pa.`weight`, bien séparé par des virgules ?

--

Sinon :

Dans l'admin, tu vois bien tes ean13 renseignés et tout et tout ?

Link to comment
Share on other sites

Pour les modifs, je confirme,
pour l'ean13 dans l'admin en BO, je confirme également.
J'ai bien trouvé l'appel de fonction dans classes et apliqué les modifs...

Je vais tester les var_dump pour voir où cela pêche et te tiens au courant.

Quoi qu'il en soit, c'est prometteur, je n'avais jusqu'à présent que les caractéristiques pour afficher un prix m².

Faut-il que j'essaye un {debug} pour te sortir la liste des variables du product.php ?

Link to comment
Share on other sites

Bonsoir Maxim,

J'ai vérifier mes modifs (environs 12 fois...) et mis var_dump devant la première (

Place juste avant un var_dump($row[‘ean13’]);
Et regarde ce qu’il te dit. Il devrait t’afficher tes surfaces.


Pis rien....

Je ne récupère pas le ean13...

Que dois-je faire ?
Link to comment
Share on other sites

J'ai regardé, ya bien tout ce qu'il faut. Ça doit marcher, et j'ai posé tes fichiers tels quels et chez moi ça marche, les var_dump me renvoient bien des valeurs.

Tu as bien mis qqchose dans les ean13 des déclinaisons ? Et pas seulement sur la page principale de la fiche produit ?

Du coup je suis plus sûr, les var_dump($row['ean13']) et var_dump($comb['ean13']) te renvoient les valeurs ou pas ?

On va y arriver ;-)

Link to comment
Share on other sites

En fait, tu le sais pas, mais ça marche.

Dans le source html généré, on le voit. C'est une partie du javascript généré par ma manip :

var priceWeightList = new Array();
                                           priceWeightList['43'] = 5.27;
                                           priceWeightList['44'] = 16.76;
                                           priceWeightList['45'] = 34.72;



Et en pratique, ça ne marche pas parcequ'il y a une erreur javascript avant l'appel à ça quand on change la déclinaison, et du coup ça s'arrête. Le prix est bien changé, parcequ'il se change avant l'erreur.

--

Erreur JS au chargement de la page :

$("#thumbs_list").serialScroll is not a function
http://franche-comte-durable.fr/boutique/themes/prestashop_FCD/js/product.js
Line 332



Erreur JS au changement de déclinaison :

$("#thumbs_list_frame").scrollTo is not a function
http://franche-comte-durable.fr/boutique/themes/prestashop_FCD/js/product.js
Line 300



[edit] Pour l'instant, je sais pas pk ça fait ça.

PS: Firefox avec l'extension Firebug t'aideras beaucoup (quand on active la console, on a les erreurs JS).

Link to comment
Share on other sites

Je n'ai rien viré exprès...

Oui j'ai vu juste après.

Donc pour que ça marche [...]

On y vient, enfin, j'espère !

Dans product.tpl vers la ligne 282, la ligne où il y a , déplace :
{if $display_weightprice}updatePriceweight();{/if}



juste avant le : (sur la même ligne)

findCombination();




Pour que ça s'exécute en premier et que ça ne bloque pas à cause de l'erreur levée dans les méandres de findCombination().

Et je découvrirai si ça a marché... demain matin ;-)

Link to comment
Share on other sites

Désolé Maxim,

Ce n'est pas la solution...

Les déclinaisons restent sur prix initiales...

De plus, java se m'est en erreur et mon menu Lavalamp n'affiche plus la bulle qui suit le curseur...

Pas de bug particulier en affichage, si ce n'est Lavalamp qui est à l'économie... ;)

Link to comment
Share on other sites

Désolé Maxim,

Ce n'est pas la solution...

Les déclinaisons restent sur prix initiales...

De plus, java se m'est en erreur et mon menu Lavalamp n'affiche plus la bulle qui suit le curseur...

Pas de bug particulier en affichage, si ce n'est Lavalamp qui est à l'économie... ;)


C'est bon, je la tiens !

Et en même temps, ça m'a fait corrigé un autre petit bug.

Voici la deuxième partie de la modif de product.php
// MAX Prix au Kg
$combinations_weightprice = null;
$product_weightprice = null;
$display_weightprice = false;
$unit_weightprice = null;
if (isset($SpecialFeatures['priceweight']) && floatval($SpecialFeatures['priceweight']) > 0)
   {
   $display_weightprice = true;
   $product_weight = floatval($product->weight) / floatval($SpecialFeatures['priceweight']);
   if ($product_weight > 0)
       {
       $product_weightprice = round(($product->getPrice(true, null)) / ($product_weight), 2);
       }
   else
       {
       $product_weightprice = 'ERROR';
       }
   if (isset($combinations) && is_array($combinations))
       {
       $combinations_weightprice = array();
       foreach ($combinations AS $id_product_attribute => $comb)
           {
           $comb_weight = $product_weight + floatval($comb['weight']) / floatval($SpecialFeatures['priceweight']);
           if ($comb_weight > 0)
               {
               $priceweight = round(($product->getPrice(true, $id_product_attribute)) / ($comb_weight), 2);
               }
           else
               {
               $priceweight = 'ERROR';
               }

           foreach ($comb['attributes'] as $id_attribute)
               {
               $combinations_weightprice[$id_attribute] = $priceweight;
               }
           }
       }
   //var_dump($product_weightprice, $combinations_weightprice);

   if (isset($SpecialFeatures['priceweight_unit']))
       {
       $unit_weightprice = $SpecialFeatures['priceweight_unit'];
       }
   else
       {
       $unit_weightprice = 'kg';
       }
   }
$smarty->assign(array(
   'display_weightprice' => $display_weightprice,
   'unit_weightprice' => $unit_weightprice,
   'product_weightprice' => $product_weightprice,
   'combinations_weightprice' => $combinations_weightprice));



Changement :

* appel de $product->getPrice(true, $id_product_attribute) au lieu de $product->getPrice(true, null)+$comb['price'] qui était faux dans certain cas.
* ajout d'une boucle pour attribuer les id_attribute et non le id_product_attribute dans tant que clé de $combinations_weightprice ce qui causait ton problème. Moi j'étais dans un cas particulier qui me masquait ça (j'avais pour l'instant les id_attribute égaux aux id_product_attribute car j'avais pas encore ajouté d'autres produits utilisant ça).

(à adapter avec les $comb['ean13'] et $product->ean13 dans ton cas)

Je releaserai la v3 ce soir.

Link to comment
Share on other sites

Bonjour Maxim


+200 pour toi !!!!

Ca marche du tonnerre cette fois !!!! Bravo et chapeau bas... Réactif et précis. ;)

J'espère que la team lira notre échange et s'inspirera de ton excellent travail pour la 1.3 finale car cette manip est essentielle pour mettre nos boutiques en conformité avec la loi...

Encore un grand, énorme merci

Espérant que tu t'interresses encore à PS pour nous proposer d'autres développement aussi canon !

Link to comment
Share on other sites

Merci à emraud pour ses essais, ça m'a permis de corriger deux problèmes gênants que je n'avais pas vu, faute d'un contexte non favorable.

Une v3 est donc née.

En pièce jointe de ce post, le zip avec les fichiers déjà modifiés pour la 1.2.5

Pour ceux souhaitent l'utiliser, je rappelle que :

* Vous ne devez pas avoir fait d'autres modifications dans le code source de ces 3 fichiers ;
* Vous devez comprendre les implications d'utiliser les poids comme poids nets ;
* Vous devez d'abord tester ça sur une version qui n'est PAS en production ;
* Vous devez vous signaler ici (ça n'est pas propre à la version zip, voir licence en 1er post).

Petite note pour certains, un "j'ai même pas essayé donc j'y arrive pas, tu peux le faire pour moi ?" (j'ai résumé, mais l'idée est là) ne se réalisera pas. Je n'aide que ceux qui mettent les mains dans le cambouis et qui essaye de comprendre, et de faire (et qui ont lu le topic en entier).

prestashop-priceweight-v3-for-1.2.5.zip

Link to comment
Share on other sites

J'espère que la team lira notre échange et s'inspirera de ton excellent travail pour la 1.3 finale car cette manip est essentielle pour mettre nos boutiques en conformité avec la loi...


Ça m'étonnerait, normalement, il y a un freeze des ajouts de fonctionnalités à la fin des alpha.

Pourquoi pas pour la 1.4 qui pourrait être en plus "Loi Chatel"-compliant (ie date livraison fixe).

Remarque, le fait de ne pas afficher de date fixe de livraison (genre "xx/xx/2010" au lieu de "dans 3j") ne se verra pas sanctionner en soi (la dgccrf s'amuse à passer des commandes sur tous les sites). Par contre, un client peut annuler, à raison, une commande en invoquant ceci. (en pratique, il peut déjà utiliser le délai de rétractation à réception pour refuser et se faire entièrement rembourser, mais pensez aux cas des denrées alimentaires, non éligible au retour...).
Link to comment
Share on other sites

Maxim,

Il est vrai qu'il reste le problème de la date fixe, j'avais trouvé un mod mais le test n'a pas été concluant. Nombreux sont ceux qui cherchent une parade pour afficher la date de livraison. Enfin, restons confiant, la Team bosse dur et intègre le travail de la communauté.

PS reste une belle aventure collaborative et merci à tous les contributeurs.

Link to comment
Share on other sites

Waou ! l'éruption d'un volcan en Islande peut décidément avoir des conséquences inattendues. Mille merci d'avance Maxime pour cette contribution que je vais tester rapidement et dont je fais partie des initiateurs depuis le début de prestashop. J'en ai un furieux besoin depuis 3 semaines et là tu es l'homme qui tombe à pic. Merci Merci Merci

Bonne journée et à bientôt

Jean Bruno

Link to comment
Share on other sites

Salut Maxime et Emraud

avant que je ne me jette à corps perdu dans le code j'ai une petite question rapport aux pré-requis (amis je n'ai pas eut encore le temps de lire en détail tout le post. Je reviens du Marco où j'ai été bloqué est j'ai 500 mails à traité)
:
J'ai lu en travers que Emraud a utiliser le code EAN que je ne peux toucher et perso j'ai un poids logistique. Serait-il possible de créer un troisième caractéristique qui permettrait pour chaque produit de renseigner cette fameuse unité de base ?

désolé si la réponse est présente dans le post

A + et merci encore

Link to comment
Share on other sites

Jean-bruno,

Il doit être possible de te servir de $location pour éviter de recréer une variable, à un détails pret....

Dans les déclinaisons, elle n'est pas correctement mémorisé... J'ai mis dans un post plus haut la ligne qui diffère dans AdminProduct et qui peut être à l'origine de l'absence de mémorisation.

Dans l'admin des produit c'est e champ emplacement.

Pas testé car d'autres adaptations non résolues de mon PS.

Sinon, avec les modif de Maxim, cela marche du tonnerre et c'est super propre !!!!
Je peux même géré via Import... Le pied....

Link to comment
Share on other sites

  • 2 weeks later...

Trop fort ça marche. Merci les amis
Alors quelques bricoles qui m'arrangerait bien :

Peut t'on et comment remplacer l'appel au poids du produit par une troisieme caractéristique (car le poids n'est pas forcement lié si on parle de surface) ?

Comment ensuite faire apparaitre ce prix unitaire à la place du prix basique, par exemple dans le homefeatured ?

Enfin comment faudrait t'il s'y prendre pour que le client puisse sélectionner cette variable (par exemple il choisi 20 m2) et que ce résultat se divise par cette fameuse variable (2,1 m2 par paquet) pour aller ce mettre dans le champ quantité de produit (9,52 arrondi supérieur à 10 ?) Utopique ?

Je sens qu'on est plus très loin d'y arriver, si ?

Encore merci

Link to comment
Share on other sites

Jean-Bruno,

Si je te lis bien tu veux :
-Vendre à x€/m² (A) [et non : à y €, + ligne sup par MOD de maxime (x€/m²)]

puis fixer ton unité de base au paquet ---> 1 paquet = 9,52 m²

Donc Qd clients prend 1 ----> au panier, il y a 9,52 x (A) = y €

C'est bien cela ?

Si je résume avec le MOD, il faudrait ne plus afficher le prix de l'unité de vente $price, et calculer le panier avec une variable (m²) pour l'ajout au panier.

Mais ton paquet est bien ton unité, pourquoi ne pas afficher le prix final du paquet et conserver le MOD tel que (en choisissant $location, pour le calcul du prix par unité par exemple (attention $location ne fonctionne pas correctement sur les déclinaisons, comme précisé dans un post précédent, il manque quelquechose dans //DATA de AdminProduct.php)

Link to comment
Share on other sites

Merci Emraud
Je crois que tu as compris mais il me faudrait un arrondi en plus (soit réultat 9,52 arrondi à 10 = y €
Sauf que c'est peut être un peu mettre toute la boutique sans dessus dessous. La problématique est la suivante

1 paquet = 2,1 m2 ou 2,m2 ou etc
Le client raisonne en m2 (je veux 10 m2)
Je cherche une solution pour lui faciliter le calcul pour qu'il mette 10:2,1 paquets (arrondi au paquet supérieur) dans sont panier tout en lui expliquant le calcul.`

Tu as un idée ?

Encore merci !

Link to comment
Share on other sites

Jean Bruno,

Sincèrement non, j'ai suivi la même piste durant de longues semaines.... Pour me rendre à l'évidence que cela impliquait une refonte complète de la solution pS... Pis d'autres pb surgissent... Quid des autres produits non concernés (dans mon cas produit VRAC par exemple comptabilisé aux sacs... ou Kg). Je vais faire référence à ma surface unitaire dans le libellé de l'article, puis ajout d'un champ sur facture ou figure u vente en m² pour chaque produit concerné. Si pas renseigné alors vide... donc pas calculé... Il reste encore des choses à reprendre de mon côté aussi.... Mais sincèrement en quelques modifs du block prix, tu dois pouvoir afficher ce que tu souhaites. Regarde aussi du côté de Presto et de son module quantity discount, il intervient au niveau de l'affichage du block prix... J'ai essayé de le décortiqué mais pas tout compris... Regarde à tous hasard

Link to comment
Share on other sites

Merci Emraud (encore) Tiens en passant va faire un tour sur ecoringo.com, ça devrait t'intéresser !

Pour le prix je l'était imaginé une sorte de calculette en PopUp qui s'afficherait et qui une fois le calcul validé l'injecterai dans le panier. Possible ça (parce que du coup tout se rapporterai à ce que tu indique dans cette fameuse "caractéristique mystère", non ?)

Merci

Link to comment
Share on other sites

Bonsoir les amis

Je craaaaaaaaque

Bon j'ai compris les grandes lignes et je vais me servir de ton idée d'utiliser $location (nota : "emplacement" dans la fiche produit)

Sauf que pour appliquer les modifs sur le theme que j'ai (Blackwhite de Kamel) qui est en 1.3 il y a quasi rien qui colle.
Si je met le tpl modifié de Maxime pour la 1.2.5 ça fonctionne mais le look est à l'ouest
Si j'essaye d'incorporé les modifs à mon TPL ça n'apparait pas ou/et ça met le bazar

Merci de m'aider à sortir de ce mauvais pas. Dès que j'aurai tout saisi je passe 10 mn pour faire un tuto, promis !

PS : En parcourant le post j'ai vu qu'a un endroit il faut modifier la classe Product.php, oui ? non ?

ci-joint mon TPL modifié si une âme charitable…

Mille mercis

productAUKGJB.tpl.zip

Link to comment
Share on other sites

Salut Jean Bruno,

Je vois que tu n'abandonnes jamais !!! Cool ;)

Petit back concernant $location, si tu as besoin des déclinaisons, test auparavent si la 1.3 concerve bien cette variable car sur 1.2.5, dans l'adminproduct elle est perdue sur les déclinaison. J'avais planché et décortiqué AdminProduct 1.2.5 et constaté que dans la partie //DATA du script, il n'y avais pas de $row pour location (ref ligne dans un post précédent). Je ne me sert finalement pas de ce champ aussi pas testé si en ajoutant cela corrige le pb.

Mes compétences s'arrêtent hélas là... Comme toi, il me faut des semaines pour avancer la moindre modif....

Ah!!! Coder est un métier. Merci à tous les contributeurs car sans eux... Rien ne bougerait...

Link to comment
Share on other sites

YESSSSSSSSSSS

ILFAUT DECOMMENTER CETTE LIGNE

$product_weight = floatval($product->location) / floatval($SpecialFeatures['priceweight']);



je fait un tuto ce soir avant de tout oublier !!!!!!

Merci Emraud, merci Maxime merci d'intégrer ça au plus vite dans PRESTA !!!!!

Link to comment
Share on other sites

Ouha bin dis donc !!!!!!

J'en ai encore les tympans qui vibrent.... ;)

J'espère que tu vas nous faire un tuto d'enfer vu le mal que tu t'es donné pour trouver la soluce pour ton cas !!!

Petite info en passant : Pour ceux qui utilise le dégressif sur les Qt, Presto propose un module quantitydiscount qui affiche le prix dégressif dans le bloc prix au lieu de la bande toute môooooche en footer de product.

Et cela marche avec les modifs (en tout cas avec ean13, c'est OK). Y a que Seamonkey (un sous produit Mozilla) qui fait de la résistance et n'affiche pas correctement. Mais Fire, EI, Safari sont OK, pas testé Opéra.

Et merci Jean Bruno pour le lien, annuaire éco ;)

A l'occas, échange de lien si tu veux... J'espère mettre en test mon nouveau portail pour ce WE... Have a look dans discution général... Pis tu me diras.

Link to comment
Share on other sites

TUTO sous 1.3

A. Creer dans le Back Office 2 caractéristiques comme suit :

Catalogue > Caractéristiques > Ajouter une caractéristique
special_priceweight
Ajouter une valeur
1

Ajouter une caractéristique
special_priceweight_unit
Ajouter une valeur
le m2
le Kg

Ajouter ici les valeurs de mesure de vos différents produits

B. Ouvrir le fichier /votreboutique/classes/Product.php
chercher
pa.`weight`,
ajouter juste après le ou les champs qui vous serviront à afficher votre quantité rapporté à votre unité de mesure 1
pour se servir du champ ean13 de la fiche produit ajouter
pa.`ean13`,
pour se servir comme moi du champ Emplacement de la fiche produit ajouter
pa.`location`,
si vous ne savez pas de quoi je parle ajouter
pa.`ean13`,pa.`location`,
Ca doit vous donner quelquechose comme ça

 pa.`ecotax`, pa.`weight`, pa.`location`, pa.`ean13`, pa.`default_on`,



Ensuite

C. Ouvrir le fichier /votreboutique/product.php
trouver la ligne

$combinations[$row['id_product_attribute']]['weight'] = floatval($row['weight']);


sur la ligne d'APRES coller

$combinations[$row['id_product_attribute']]['location'] = $row['location']; 
$combinations[$row['id_product_attribute']]['ean13'] = $row['ean13'];


comme ça on a toujours la possibilité de choisir le champ qu'on voudra

Trouver le paragraphe

$smarty->assign(array(
           'no_tax' => Tax::excludeTaxeOption() OR !Tax::getApplicableTax(intval($product->id_tax), 1),
           'customizationFields' => $product->getCustomizationFields(intval($cookie->id_lang))
       ));

       // Pack management
       $smarty->assign('packItems', Pack::getItemTable($product->id, intval($cookie->id_lang), true));
       $smarty->assign('packs', Pack::getPacksTable($product->id, intval($cookie->id_lang), true, 1));



Juste APRES ce paragraphe et AVANT les 2 accolades coller

// MAX Prix au Kg
       $combinations_weightprice = null;
       $product_weightprice = null;
       $display_weightprice = false;
       $unit_weightprice = null;
       if (isset($SpecialFeatures['priceweight']) && floatval($SpecialFeatures['priceweight']) > 0)
           {
           $display_weightprice = true;

// DECOMMENTER LA  LIGNE DU CHAMP CHOISI  dans les 3 lignes suivante

           // $product_weight = floatval($product->weight) / floatval($SpecialFeatures['priceweight']);
           // $product_weight = floatval($product->ean13) / floatval($SpecialFeatures['priceweight']);
           $product_weight = floatval($product->location) / floatval($SpecialFeatures['priceweight']);
           if ($product_weight > 0)
               {
               $product_weightprice = round(($product->getPrice(true, null)) / ($product_weight), 2);
               }
           else
               {
               $product_weightprice = 'ERROR';
               }
           if (isset($combinations) && is_array($combinations))
               {
               $combinations_weightprice = array();
               foreach ($combinations AS $id_product_attribute => $comb)
                   {
                   $comb_weight = floatval($comb['location']) / floatval($SpecialFeatures['priceweight']); 
                   $comb_weight = floatval($comb['ean13']) / floatval($SpecialFeatures['priceweight']);
                   if ($comb_weight > 0)
                        {
                       $priceweight = round(($product->getPrice(true, $id_product_attribute)) / ($comb_weight), 2);
                        }
                    else
                        {
                       $priceweight = 'ERROR';
                       }

                   foreach ($comb['attributes'] as $id_attribute)
                       {
                       $combinations_weightprice[$id_attribute] = $priceweight;
                        }
                   }
               }
           //var_dump($product_weightprice, $combinations_weightprice);

           if (isset($SpecialFeatures['priceweight_unit']))
               {
               $unit_weightprice = $SpecialFeatures['priceweight_unit'];
               }
           else
               {
               $unit_weightprice = 'kg';
               }
           }
       $smarty->assign(array(
           'display_weightprice' => $display_weightprice,
           'unit_weightprice' => $unit_weightprice,
           'product_weightprice' => $product_weightprice,
           'combinations_weightprice' => $combinations_weightprice));



NOUBLIER PAS DE DESOMMENTER LALIGNE QUI VOUS INTERESSE DANS LE CODE CI DESSUS (c'est indiquer dedans)

Le plus dur est fait, si si !

SUITE AU PROCHAIN POST

Link to comment
Share on other sites

D. Ouvrir le fichier /votreboutique/theme/votretheme/product.tpl

trouver le paragraphe

{if $product->ecotax != 0}

{l s='include'} {convertPrice price=$product->ecotax} {l s='for green tax'}
           {/if}



juste APRES coller

// Prix au Kilo MAX
           {if $display_weightprice}

{convertPrice price=$product_weightprice}/{$unit_weightprice}

               {if $combinations_weightprice}
                   [removed]
                   // <![CDATA[

                   updatePriceweight = function() {ldelim}
                       // Valeurs
                       var priceWeightList = new Array();
                   {foreach from=$combinations_weightprice key=idCombination item=combination}
                       priceWeightList['{$idCombination|intval}'] = {$combination};
                   {/foreach}

                       // Selection
                       var choice = 0;
                       $('div#attributes select').each(function(){ldelim}
                           if (typeof priceWeightList[$(this).val()] != 'undefined') {ldelim}
                               choice = $(this).val();
                           {rdelim}
                       {rdelim});

                       // Affichage
                       if (choice!=0) {ldelim}
                           $('#priceweight_display').text(formatCurrency(priceWeightList[choice], currencyFormat, currencySign, currencyBlank));
                       {rdelim}

                   {rdelim}

                   $(document).ready(function(){ldelim}
                       updatePriceweight();
                   {rdelim});

                   //]]>
                   [removed]
               {/if}
           {/if}



Ca doit finir juste avant

{if isset($groups)}
            <!-- attributes -->




Quelques lignes plus loin vous devez avoir un paragraphe comme ceci

{$group.name|escape:'htmlall':'UTF-8'} :
                {assign var='groupName' value='group_'|cat:$id_attribute_group}



juste APRES coller

 0}$('#resetImages').show('slow');{/if}">


 0}$('#resetImages').show('slow');{/if}">



La, si je ne me suis pas planté, ça doit marcher.

Par principe avant de fulminer, vider votre cache navigateur et tous les fichiers (sauf index.ph) dans /tools/smarty/compile/

Si il y a des modifs à faire dans le tuto je suis dispo.
Bye Bye et grazie mile à Max et à Emraud pour son soutien sans faille

Link to comment
Share on other sites

Pour product-list, si je ne m'abuse, y faut remonter à smarty la valeur preice-weight. Puis la récupérer....

Non pour un codeur, fastoche...;)

Moi, je ne sais pas... Je comprend la logique mais ... je parle pas la langue...


Pis merci à Jean Bruno, parce que là... C'est 'achement bien expliqué

Link to comment
Share on other sites

La, si je ne me suis pas planté, ça doit marcher.

Par principe avant de fulminer, vider votre cache navigateur et tous les fichiers (sauf index.ph) dans /tools/smarty/compile/

Si il y a des modifs à faire dans le tuto je suis dispo.
Asta la vista et grazie mile à Max et à Emraud pour son soutien sans faille


J'ai parcouru, tout m'a l'air bon dans le tuto.
Merci, car je ne suis sans doute pas le meilleur pour expliquer.

Pour afficher dans product-list, il faut suivre le même cheminement, sauf qu'il n'y a pas à s'embêter avec l'affichage javascript des combinaisons.

PS: asta la vista sans "h", c'est un site de crack :-)

¡ Hasta luego !
Link to comment
Share on other sites

Bonjour Maxim,

Je vois que tu surveilles pour pas qu'on raconte trop de conneries :roll:

Une petite question, concernant product-list, faut aussi ajouter qqchose au CSS, non ?

Jean Bruno, tu as omis de le citer plus haut dans le tuto... Il y a une ligne à ajouter au CSS

Link to comment
Share on other sites

Une petite question, concernant product-list, faut aussi ajouter qqchose au CSS, non ?

Jean Bruno, tu as omis de le citer plus haut dans le tuto... Il y a une ligne à ajouter au CSS


Le CSS, c'est juste pour la déco, on s'en rend vite compte mais c'est pas bloquant ;-)

Pour le product-list.tpl tu peux mettre ton prix au kilo/litre/m²/autre dans un
 


comme pour le prix, et le placer juste en dessous.

Tu rajoutes priceweight dans le class="price" de ce que tu as ajouté : class="price priceweight"

Et comme ça, il a les styles du prix, et dans ta css tu peux améliorer en ajoutant :

.priceweight {
color: #00f !important;  /* par exemple pour le mettre en bleu */
autre-regle: autre-valeur !important;
}

Link to comment
Share on other sites

Bonjour Maxim, bonjour Jean Bruno

Désolé de ne répondre que maintenant mais mon Provider fait des siennes depuis 2 jours :sick:

Bon, les services se rétablissent et j'ai repris le code...

Alors un grand merci Maxim de nous distiller tes précieux conseils car c'est une tâche bien hardue que de faire ses adaptations Ô combien nécessaires pour ne pas offenser Tout puissant Châtel ;)

Alors pour product-list.tpl.... Bin c'est beaucoup plus hardue et j'aurais besoin de tes lumières pour finaliser...

Y a pas de product-list.php qui appel le prix....

La product list est renvoyé depuis supplier.php (même pour manufacturer.php)
Bon jusque là... j'ai trouvé.... Mais dans supplier.php... la structure est totalement différente.... Pas de price, selement un appel à $s et qui viens de je ne sais où.... product-sort.php ???

Je joint le résultat à l'affichage.... Et demande encore un coup de main...

J'ai essayé d'insérer le code d'appel des variables directement dans product-list.tpl.... Mais bien entendu la syntaxe m'échappe complètement.....

Cela m'affiche le code en début de page et non les variables....

Un post est ouvert aussi pour qqn qui n'arrive pas à virer un prix à 0, je comprend mieux son souci....

23532_VKgrHdKcRUaDlHuiJToE_t

Link to comment
Share on other sites

J'ai une piste pour récupérer les variables de product-list :
http://www.prestashop.com/forums/viewthread/37676/P15/modules_tiers/montrer_les_combinaisons_et_attributs_dans_les_listes_produits

Mais je ne sais pas trop par quel bout m'y prendre car là ce sont les déclinaisons qui sont récupéré... En théorie ( :-P Y a cas %-P ) ce serait plus simple pour le prix... mais là c'est mon côté optimiste qui parle....

Link to comment
Share on other sites

Biggre !!!

Codeur est un métier, et c'est pas le mien..........

Product list est gérée depuis supplier.php, supplier.tpl et Supplier (Classes)

Product list est finalement plus simple à géré..... Pour peu qu'on ai compris les rudiments du code.... dans product_list.tpl du thème

{if $priceDisplay}{convertPrice price=$product.price_tax_exc}{if $priceDisplay == 2} {l s='-Tx'}{/if}{/if}
               <!-- Prix m² -->
               {if $product.location != ""}
A partir de {convertPrice price=$product.price/$product.ean13}/{$product.location} 
                {elseif $product.location == ""}


                {/if}



A mettre à partir de price display (écrase la ligne {if $display}


Avec ean13 = quantité total vendue (ex. 5 pour un conditionnement par 5 litres)
avec location = litre (si l'unité de base est le litre)

Un énorme merci à Maxim

Link to comment
Share on other sites

  • 3 months later...

Bonjour à tous et merci pour toutes ces précieuses information pour améliorer la gestion des prix / poids sur prestashop.

Cependant je pense qu'il y a un réel problème sur la condition de départ qui consiste à considérer le poids dans la fiche produit comme le poids net à utiliser pour calculer le prix par rapport à l'unité de référence. En effet celui ci est pris en compte pour calculer le poids de la commande et ainsi déterminer le tarifs de la livraison.

Etant donné la différence parfois importante entre le poids net et le poids brut, cela peut avoir un impact évident sur le coût du transport et peut être à l'origine d'un déficit sur la marge prévu sur chaque produit.

Voici un exemple pour illustrer mes propos en prenant un marchand d'huile d'olive (prix fictif):


il vend une bouteille d'huile d'olive en 0,25 L à 5€ l'unité (soit 20€/L) dont le poids brut pour le transport est de 500g.
il vend une bouteille d'huile d'olive en 0,75 L à 12€ l'unité (soit 16€/L) dont le poids brut pour le transport est de 1000g.
il vend une bouteille d'huile d'olive en 1 L à 15 € l'unité (soit 15€/L) dont le poids brut pour le transport est de 1500g

ps: le poids brut n'est pas linéaire car le modèle de la bouteille utilisé pour chaque conditionnement est différent.


Pour avoir le bon prix au litre en considérant le poids de la fiche produit comme poids net, il faudrait que je mette special-weight en Litre et special_priceweight à 1000 et que je mette le poids suivant sur chaque déclinaison :
poids à 250g pour simuler le 0,25 L
poids à 750g pour simuler le 0,75 L
poids à 1000g pour simuler le 1 L


Or pour chaque bouteille d'1L le coût de livraison est à 8€ pour 1000g et 9€ pour 1500g. Le marchand perd donc 1€ sur la marge de son produit ce qui n'est non négligeable.

Si je considère le poids de la fiche produit comme le poids brut comme c'est prévu à l'origine par prestashop, j'obtiens alors un prix par rapport à l'unité de référence avec special-weight en Litre et special_priceweight à 1000

la bouteille à 0,25 L affichera 10€/L (5/500*1000)
la bouteille à 0,75 L affichera 12€/L (12/1000*1000)
la bouteille à 1 L affichera 10€/L (15/1500*1000)


Dans ce cas le coût de la livraison est correcte mais le prix au Litre ne correspond plus et j'affiche une mauvaise valeur au client.

Tout ça pour vous dire qu'il faudrait rajouter un champs poids net (ou poids du conditionnement) dans la classe produit (et en base bien sur) et un impact sur la déclinaison. Ce sera sur ce poids qu'on se basera pour afficher le prix selon l'unité de référence.

Dans le fichier product.php il faudra changer $product->weight en $product->packaging_weight.

Pour reprendre cette idée avec l'exemple du marchand d'olive ça donnerait ceci avec special-weight en Litre et special_priceweight à 1


la bouteille à 0,25 L avec un poids brut de 500g un poids de conditionnement à 0,25 et avec un prix à 5€.

la bouteille à 0,50 L avec un poids brut de 1000g un poids de conditionnement à 0,75 et avec un prix à 12€.

la bouteille à 1 L avec un poids brut de 1500g un poids de conditionnement à 1 et avec un prix à 15€.


Dans ce cas on aura donc un coût de transport et le prix selon l'unité de référence seront corrects.

Bien sur cette solution demande une modification beaucoup plus profonde que la solution V3 proposée:
Il faut rajouter un champs packaging_weight en base dans la table product avec le même type que le champ weight actuel.
Il faut rajouter ce champs dans la classe Product avec ses valeurs respectives dans $fieldsRequired, $fieldsSize, $fieldsValidate... si besoin et les rajouter dans les fonctions faisant des appels à la base de données ou populant l'instance Product.

Qu'en pensez-vous?
Link to comment
Share on other sites

LA SOLUTION QUE JE PROPOSE (utiliser une caratéristique plutôt que le poids logistique) permet de prendre en compte ta remarque de manière ultra simple et sans modifier le core.
La voici en résumé
Créer une caractéristique "metrage" (par exemple) et renseigner en créant des valeurs coorespondant aux produits pour lesquels on souhaite que cette formule apparraisse.
Puis dans product.tpl quelque part dans <!-- prices --> insérer ceci juste après une balise {/if}

<!-- METRAGE -->
 {if $features}
     {foreach from=$features item=feature}
         {if $feature.name=='metrage' && $feature.value!='' }
 {convertPrice price=$product->getPrice(true, $smarty.const.NULL, 2)/$feature.value} TTC le m²{/if}

     {/foreach}
 {/if}
 <!-- FIN METRAGE --> 



NB : je n'ai pas encore trouvé la solution pour les produits avec déclinaisons mais j'ai cru voir apparaitre une fonctionnalité dans la 1.4.0.2

Et voilà le boulot ! Merci à mon ami le Dahu sans qui j'aurais passé encore 1 an sur ce "détail" ;-)

a+

Link to comment
Share on other sites

  • 4 weeks later...

salut à tous !
J'ai suivi à la lettre ce tuto, car j'aimerai afficher les prix à l'unité, car la plupart de mes produits sont en paquets de 10, 20, 30,...
et pouvoir afficher un prix unitaire à X exemplaires. ensuite le client choisit son type de conditionnement et le prix de 20 n'est pas le même qu'à 50...

Bref, j'ai effectué toutes les modifs apportées par Jean-Bruno, en me basant sur $location puisque j'utilise ean13.

Mais voilà, rien ne s'affiche ans ma fiche produit, enfin du moins je ne comprends pas réellement comment agir dans le BO pour voir l'affichage.
Je ne comprends pas pourquoi toucher à une caractéristique en début de tuto, si il faut renseigner l'emplacement qui correspond à une déclinaison.

Merci de vos réponses, cela me ferait grandement avancer.

Tramber.

Link to comment
Share on other sites

Salut Jean-bruno, je suis presque en prod (donc toujours en cré...) mais la boutique doit être opérationnelle pour hier.
en fait j'essaie de regarder les dernières fonctionnalités à apporter.

du coup je reviens à ma demande, quels champs remplis-tu pour voir les modifications. Est-ce que ça marche, est-ce selon toi la bonne méthode pour afficher non pas un prix au kg ou au mètre mais à l'unité sachant qu'il peut être vendu dans différents conditionnement.
J'ai essayé plusieurs bidouillage dans le BO mais rien ne s'afffiche...

Après pour la SVN, est-ce que ça marche si la boutique est en prod et surtout comment ça marche?

Merci d'avance.

Link to comment
Share on other sites

Tu choisis un produit et tu lui crées une caractéristique que tu appelle "metrage" (pour l'exemple, ça te donneras des metres carrés)
Dans la caractéristique tu ajoutes les valeurs de ton produit dans toutes ses configurations
Si c'est des paquets de 2.1 m2 tu entre "2.1"
Si tu as des packs de 2 paquets de 2,1 m2 tu entres "4.2"

C'est le nombre que va diviser ton prix.

Ensuite remplace le fichier product.tpl par celui que je te joins et tu va sur la page de ton produit : miracle ça marche.
Pour le faire avec d'autres caractéristiques tu fais pareil et tu modifie ton tpl comme commenté (cherche METRAGE dans le code du tpl

courage

le code pour mémoire

<!-- METRAGE -->
 <?php if ($this->_tpl_vars['features']): ?>
     <?php $_from = $this->_tpl_vars['features']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array'); }if (count($_from)):
   foreach ($_from as $this->_tpl_vars['feature']):
?>
         <?php if ($this->_tpl_vars['feature']['name'] == 'metrage' && $this->_tpl_vars['feature']['value'] != ''): ?>
 <?php echo Product::convertPrice(array('price' => $this->_tpl_vars['product']->getPrice(true,@NULL,2)/$this->_tpl_vars['feature']['value']), $this);?>
TTC le m²<?php endif; ?>

     <?php endforeach; endif; unset($_from); ?>
 <?php endif; ?>
 <!-- FIN METRAGE -->

Link to comment
Share on other sites

  • 2 months later...

Merci pour la qualité de votre travail, mais, je dois m'y prendre comme un manche, parce que je n'arrive pas a le faire fonction sous la versions 1.3.1 de prestashop.

Existe-t-il un zip avec les fichiers pré-modé a mettre juste après une installation de prestashop ?
( spécial manche ou newbies svp )

et dan mon cas c'est une obligation bien plus pressente que la loi chatel, mais c'est pour afficher en clair en quoi je me démarque de ma concurrence )

merci par avance de vos réponses

Link to comment
Share on other sites

Salut Spacespy,
En effet ils ne nous disent pas tout dans ce topic... J' me suis acharné et je suis arrivé à un affichage qui s'en rapproche, pour afficher le prix unitaire en fonction du conditionnement.
J'ai un peu fait un mix des 2 solutions car en suivant à la lettre les infos de Jean-bruno je n'y suis pas arrivé.

Si tu veux voir ce que ça donne : http://artsephemeres.com/decotable/82-decors-de-table
c'est en rose : à partir de : ....€
Et le prix unitaire dans la fiche produit.

Dis moi où tu en es si t'as besoin d'aide.

Tramber.

Link to comment
Share on other sites

je vois bien le fameux prix unitaire.

le probleme c'est que j'ai copié tous les morceaux de code, et que y'a rien qui fonctionne.

de plus il n'est pas clairement expliqué quelle case remplir et surtout avec quoi.

Dans mon cas c'est pour un site de vente en ligne de produits de la mer, ou les prix changent tous les jours et surtout les prix des lots sont proportionnels au prix kilo.

S'il faut renseigner le prix des lots ou même faire une fiche par type de lot c'est pas un probléme, mais bon dieu, c'est pas croyable qu'il n'y ai rien de clair pour se mettre en conformité avec la loi .

Je rappel qu'aux termes de la loi Châtel et surtout aux termes du code du commerce, seul les prix par unités de mesure conventionnelles inscrites auprès de l'institut national des poids et mesures sont légitimes dans la définition du prix d'un produit.

donc s'il vous plait, proposez un pack pour patcher son installation afin de se mettre en conformité avec la loi.

Je n'aime pas les bracelets chromés, et encore moins devoir payer l'amende de la DGCCRF de l'ordre de la centaine d'euros par produits (et plus ou moins doublée en cas de récidive) surtout que je vais mettre en ligne dans les 300 produits hors variations de conditionnements.

Par avance merci

Link to comment
Share on other sites

La communauté n'a aucune obligation de créer un pack pour qui que ce soit... Chacun apporte sa pierre à lédifice (qui est déjà colossal !!)

Pour répondre à ta question j'ai remplacé la variable "metrage" par conditionnement dans le product-list.tpl
Ensuite j'ai créé une caractéristique (onglet caractéristique dans catalogue) "conditionnement" dans le Back office, ensuite j'ai créé une valeur par conditionnement : 5, 10 20,...
Et il s'affiche bien le prix unitaire, cette variable est le diviseur pour avoir l'unité. Il se renseigne par les caractéristiques.

Après concernant la loi, chacun vend des produits différents, à chacun d'adapter sa boutique à ces produits.

En espérant t'avoir aidé.

Link to comment
Share on other sites

mon probleme c'est que rien ne s'affiche.

merci de ton aide en tout cas.

( mon coup de stress est surtout pour l'editeur et les programmeurs pros, car suite a un coup de telephone, la seul réponse qui m'ai été fournie est : c'est impossible pour des raison d'arrondis qui ne se font pas )

Link to comment
Share on other sites

  • 3 months later...

Bonjour,

J'ai un peu de mal à adapter cette fonction à la version 1.4 de prestashop...

Dans ProductController.php, il faut mettre :

self::$smarty->assign(array(
           'display_weightprice' => $display_weightprice,
           'unit_weightprice' => $unit_weightprice,
           'product_weightprice' => $product_weightprice,
           'combinations_weightprice' => $combinations_weightprice));


au lieu de :

$smarty->assign(array(
           'display_weightprice' => $display_weightprice,
           'unit_weightprice' => $unit_weightprice,
           'product_weightprice' => $product_weightprice,
           'combinations_weightprice' => $combinations_weightprice));


pour que les variables passent bien sous smarty.
Cependant, sur la fiche produit, bien que l'unité change correctement (Kg devient L quand besoin), le prix au litre/kg reste à zero...

Si quelqu'un a la solution, je suis preneur, merci...

En passant, j'ai directement modifié le fichier ProductController.php, je n'ai pas compris comment passer les deux bouts de code en override. Si quelqu'un pourrait un peu m'expliquer le concept...

Link to comment
Share on other sites

Bonjour,
En passant, j'ai directement modifié le fichier ProductController.php, je n'ai pas compris comment passer les deux bouts de code en override. Si quelqu'un pourrait un peu m'expliquer le concept...


Par exemple , dans ton cas, si tu veux surcharger la methode process() de ProductControllerCore

Dans /override/controllers tu crées un fichier nommé ProductController.php


Dedans :

class ProductController extends ProductControllerCore
{

   public function process()
   {

       parent::process(); // pas obligatoire mais c'est mieux que de tout reprendre

       ....ton code ici... 

   }

}

Link to comment
Share on other sites

  • 1 month later...

Bonjour à tous,

Comment se passe la mise en place de ce patch "prix unitaire" sur Prestashop 1.4 ?
La question va se poser rapidement pour pas mal de gens, et ils vont tous atterir ici !

Depuis la 1.3, le contenu de product.php a beaucoup changé, du coup j'ai peur de passer 3 jours à patauger dans les fichiers PHP à la recherche des justes emplacements pour mettre en place ce patch salvateur... ( Qui n'a hélas pas été mis en place pour la 1.4... Vivement la 1.5 ? )

Je m'occupe d'un site de produits alimentaires sur lequel il me faut impérativement un prix unitaire fiable, qui ne se mette pas à faire le foufou quand un produit existe en plusieurs déclinaisons, sous peine que je finisse en cavale ou dans un cachot (cf. les lois de 2008, je force un peu le trait) : sans vouloir vous mettre la pression, ce patch et vous autres êtes le SEUL recours qui semble exister, rien que ça !

Hedrad et Broceliande, le point que vous avez soulevé est-il la seule difficulté d'adaptation ? Comment s'est finie la mise en place pour toi, Hedrad ?

Merci d'avance !

Link to comment
Share on other sites

...Et le javascript ?

Ca a l'air 1 peu trop simple pour être vrai, mais ça éviterait de toucher au PHP, non ?
Après tout, les internautes n'activant pas le JS ne peuvent de toute façon pas utiliser une boutique Prestashop, il me semble !

L'algo pourrait ressembler à ça :

si le produit existe en plusieurs déclinaisons,
alors : extraire de la page le poids en Kg/volume en L + le prix TTC ,
afficher après calcul le prix unitaire correct arrondi au centime.
(sinon : on peut utiliser la fonction prix unitaire dispo en BO, le script ne touche à rien.)

Link to comment
Share on other sites

Rom soul ,
en fait je n'ai ici fourni qu'une methode d'override globale , et je n'ai personnellement pas intégré ce patch.
Je ne peux pas donc te répondre concernant son intégration.

A certains de mes clients j'ai fourni, de memoire, une solution différente 100% modulaire , adaptée au besoin précis (mètres linéaires etc )
Comme tous les produits n'ont pas nécessairement besoin d'une indication de prix unitaire, et comme tous n'ont pas nécessairement la même unité (ex : ml et m² ) , ils ont juste une petite admin distincte leur permettant d'assigner ainsi une unité et un coefficient aux produits concernés...
L'approche javascript est pas bête non plus , mais moins copine avec les tables et bdd à moins de coder les unités en dur dans le js , ce qui ne répond pas forcément à tous les produits d'un même site.

Link to comment
Share on other sites

Merci Broceliande de répondre si vite,

méthode d'override bien notée, et pour mon projet je vais donner sa chance à la solution javascript, ça a l'air + simple !

Après tout si le prix et la quantité figurent sur la page, on doit bien pouvoir les récupérer et en faire une bonne vieille division !
Mais effectivement le JS n'ayant accès qu'au HTML final de la page, et pas aux infos BD, cette solution risque d'être précaire car dépendante des divers templates et intitulés des déclinaisons en BO... On va voir ça.

Link to comment
Share on other sites

Hello !

Petite visite rapide sur ce sujet fort intéressant ... (malheureusement pas récent) !

Regardez ce qu'on peut faire avec un module tel que ComparaME (en test actuellement ici), un tout nouveau module qui se présente sous forme d'un onglet de la fiche produit et qui permet d'effectuer automatiquement un calcul de prix au kilo (ou litre) de l'article et qui le compare le prix (en % et valeur absolue) et qui le classe avec des sites concurrents... Bien pratique pour montrer clairement à vos clients que vous étés bien placé !

Pour les sites qui vendent des produits où la notion de poids/volume est importante tel que le secteur alimentaire, on ne met pas assez en avant un bon prix alors qu'il est finalement compétitif même face à des sites qui ont plus de visibilité ... Et souvent cette différence n'est pas visible facilement car c'est au niveau du prix au kilo que la différence apparaît réellement !

44733_8NXj0g3FugAFG4IIKwTc_t

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