PrestaShop Forum

The best place in the world to ask questions about PrestaShop and get advice from our passionate community!

PrestaShop Forum

Jump to content

 

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

108 replies to this topic
#1
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 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
@@ -2250,3 +2250,9 @@ 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.

Attached Files


Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#2
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts
Exemple de rendu :
Voir vidéo en pièce jointe de ce post (les prix ne sont pas les vrais prix).

Attached Files


Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#3
maxou

    PrestaShop Newbie

  • Members
  • Pip
  • 14 posts
je ne trouve pas ce fichier .diff dont tu parle, j ai la ver 1.2.5 , ca 'interresse de mettre ce module puis-je avoir ton email
merci

#4
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts
Le fichier est joint à mon premier post.
C'est au dessus de ma signature, en bas du post.
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#5
maxou

    PrestaShop Newbie

  • Members
  • Pip
  • 14 posts
j ai telechargé , mais je le mets ou ? doit je l integrer dans un fichier existant de prestashop ou l'ajouter dans une directory
peut on se telephoner?

#6
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts
Relis le post, c'est tout expliqué.
Dans le fichier diff, il y a exactement quoi faire : les noms des fichiers de Prestashop à modifier et ce qu'il y a à ajouter/remplacer/retirer.
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#7
Atch

    PrestaShop Fanatic

  • Moderators
  • 2922 posts
Bonjour,

Merci pour le Patch, ça devait servir à pas mal de personnes de la communauté ;) vu le nombre de personnes qui posaient la question.

V++

Atch

#8
emraud

    PrestaShop Apprentice

  • Members
  • PipPip
  • 304 posts
Bonjour,

Serait-il possible de voir un exemple du résultat au niveau de l'affichage SVP ?
Eco MateRiAUx Durables
ps 1.2.5 - actualisation en cours

#9
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts

From 1271654306:

Serait-il possible de voir un exemple du résultat au niveau de l'affichage SVP ?


Bien sûr, j'ai mis une petit vidéo (500ko) sur le deuxième post de ce topic :
(lien direct pour ceux qui aiment pas scroller : http://www.prestasho...d/51755/#227421 )
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#10
maxou

    PrestaShop Newbie

  • Members
  • Pip
  • 14 posts
peux tu m'envoyer le fichier en question dejà corriger pour le prix au poids et au litre STP :)

#11
SNA Informatique

    PrestaShop Apprentice

  • Members
  • PipPip
  • 35 posts
J'ai deux erreurs erreur sur une install 1.2.5 en local dans le fichier product.php

Quote

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

Quote

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:

Quote

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?
Samuel NOTARO - S.N.A Informatique | Création sites web, référencement et webmarketing - Strasbourg
Web : http://www.sna-informatique.fr - Mail : contact@sna-informatique.fr - Tél : 06 17 06 06 48 - SIRET : 51328124600019

#12
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts

From 1271674210:

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

Quote

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.

From 1271674210:

Idem pour la ligne 160

Quote

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)
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#13
SNA Informatique

    PrestaShop Apprentice

  • Members
  • PipPip
  • 35 posts
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)
Samuel NOTARO - S.N.A Informatique | Création sites web, référencement et webmarketing - Strasbourg
Web : http://www.sna-informatique.fr - Mail : contact@sna-informatique.fr - Tél : 06 17 06 06 48 - SIRET : 51328124600019

#14
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts

From 1271675649:

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));

Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#15
SNA Informatique

    PrestaShop Apprentice

  • Members
  • PipPip
  • 35 posts
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?
Samuel NOTARO - S.N.A Informatique | Création sites web, référencement et webmarketing - Strasbourg
Web : http://www.sna-informatique.fr - Mail : contact@sna-informatique.fr - Tél : 06 17 06 06 48 - SIRET : 51328124600019

#16
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts
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é.
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#17
SNA Informatique

    PrestaShop Apprentice

  • Members
  • PipPip
  • 35 posts
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.
Samuel NOTARO - S.N.A Informatique | Création sites web, référencement et webmarketing - Strasbourg
Web : http://www.sna-informatique.fr - Mail : contact@sna-informatique.fr - Tél : 06 17 06 06 48 - SIRET : 51328124600019

#18
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts

From 1271679773:

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.
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#19
Maxime G

    PrestaShop Apprentice

  • Members
  • PipPip
  • 46 posts
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.
Un clavier azerty en vaut deux.

MAX Business - Blog e-Maxime

Prestashop : Afficher prix au kilo/litre

#20
SNA Informatique

    PrestaShop Apprentice

  • Members
  • PipPip
  • 35 posts
Super, c'est toi qu'il faut remercier, je ne fais que profiter de tes talents ^^

Testé et ca marche nickel sur 1.2.5, avec le paramétrage que l'on veut.
Samuel NOTARO - S.N.A Informatique | Création sites web, référencement et webmarketing - Strasbourg
Web : http://www.sna-informatique.fr - Mail : contact@sna-informatique.fr - Tél : 06 17 06 06 48 - SIRET : 51328124600019