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

Share this post


Link to post
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?

Share this post


Link to post
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)

Share this post


Link to post
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)

Share this post


Link to post
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));

Share this post


Link to post
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?

Share this post


Link to post
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é.

Share this post


Link to post
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.

Share this post


Link to post
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.

Share this post


Link to post
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.

Share this post


Link to post
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.

Share this post


Link to post
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.

Share this post


Link to post
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...

Share this post


Link to post
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...)

Share this post


Link to post
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

Share this post


Link to post
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 ;)

Share this post


Link to post
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.

Share this post


Link to post
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....

Share this post


Link to post
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...

Share this post


Link to post
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é)

Share this post


Link to post
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.

Share this post


Link to post
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 ?

Share this post


Link to post
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 ?

Share this post


Link to post
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 ?

Share this post


Link to post
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 ;-)

Share this post


Link to post
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).

Share this post


Link to post
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 ;-)

Share this post


Link to post
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... ;)

Share this post


Link to post
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.

Share this post


Link to post
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 !

Share this post


Link to post
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

Share this post


Link to post
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...).

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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....

Share this post


Link to post
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

Share this post


Link to post
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)

Share this post


Link to post
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 !

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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...

Share this post


Link to post
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 !!!!!

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites