Jump to content

Recommended Posts

Bonjour à tous,

 

Je suis actuellement en train de réaliser ma boutique avec Prestashop 1.6
 

Lorsque l'on créé une déclinaison pour un produit, on choisit le champ à modifier, une taille de Tee-shirt par exemple, en passant d'une taille à l'autre on peut modifier la référence :

  • Taille S : TS
  • Taille M : TM

Ceci est un exemple.

 

J'aurai voulu rajouter un nouveau champs qui se modifierait en fonction du changement de la taille.

 

  1. Ajout du champs dans la base de données

J'ajoute donc un champs dans la table PREFIX_product_attribute. Je nomme donc ce champ cardboards_by_pallet.

C'est une variable de type TINYINT, avec 4 chiffres maximums.

 

     2.  Ajout du champs dans le Back Office

 

Dans le fichier \adminPREFIX\themes\default\template\controllers\products\combinations.TPL

 

Je rajoute un champ de texte à la ligne 320 :

<hr/>
<div class="form-group">
<label class="control-label col-lg-3" for="attribute_cardboards_by_pallet">
{l s='Cardboards by pallet'}
</label>
<div class="col-lg-3">
<input maxlength="4" type="text" id="attribute_cardboards_by_pallet" name="attribute_cardboards_by_pallet" value="" />
</div>
</div>
<hr/>

     3. Modification des classes

 

Dans le fichier /classes/Combination.php, j'annonce ma variable à la ligne 59.

public $cardboards_by_pallet;

J'annonce aussi ces caractéristiques à la ligne 85.

'cardboards_by_pallet' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'size' => 4), 

Dans le fichier /classes/Product.php :

 

Dans la fonction public function addCombinationEntity :

 

J'ajoute $cardboards_by_pallet à la liste des variables annoncées.

public function addCombinationEntity($wholesale_price, $price, $weight, $unit_impact, $ecotax, $quantity,
$id_images, $reference, $cardboards_by_pallet,$id_supplier, $ean13, $default, $location = null, $upc = null, $minimal_quantity = 1,  array $id_shop_list = array(), $available_date = null)

Puis juste en dessous :

$id_product_attribute = $this->addAttribute(
$price, $weight, $unit_impact, $ecotax, $id_images,
$reference, $cardboards_by_pallet, $ean13, $default, $location, $upc, $minimal_quantity, $id_shop_list, $available_date);

Dans la fonction public function updateAttribute :

public function updateAttribute($id_product_attribute, $wholesale_price, $price, $weight, $unit, $ecotax,
$id_images, $reference, $cardboards_by_pallet, $ean13, $default, $location = null, $upc = null, $minimal_quantity = null, $available_date = null, $update_all_fields = true, array $id_shop_list = array())

J'ajoute ensuite la ligne suivante ligne 1455 :

$combination->cardboards_by_pallet = pSQL($cardboards_by_pallet);
Dans la fonction public function addAttribute, j'annonce toujours ma nouvelle variable :
public function addAttribute($price, $weight, $unit_impact, $ecotax, $id_images, $reference,$cardboards_by_pallet,$ean13,
$default, $location = null, $upc = null, $minimal_quantity = 1, array $id_shop_list = array(), $available_date = null)

J'ajoute ensuite la ligne suivante ligne 1510 :

$combination->cardboards_by_pallet = pSQL($cardboards_by_pallet);

Dans la fonction public function getAttributesGroups, je rajoute la variable dans la liste suivant $sql = [...]

pa.`cardboards_by_pallet`

    4.    Modification des controllers

 

Dans le fichier /Controllers/front/ProductController.php, je rajoute le texte ci-dessous à la ligne 457.

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

Dans le fichier /Controllers/admin/AdminProductsController.php.

 

Dans la fonction public function processProductAttribute, je rajoute la suite à deux endroits. Ligne 871 et 903

Tools::getValue('attribute_cardboards_by_pallet'),

Ligne 3632 :

array_push($product_props, 'reference', 'cardboards_by_pallet', 'ean13', 'upc',
'available_for_order', 'show_price', 'online_only',
'id_manufacturer'
);

Ligne 4061 :

$comb_array[$combination['id_product_attribute']]['cardboards_by_pallet'] = $combination['cardboards_by_pallet'];

Les numéros de lignes peuvent être plus ou moins exact en fonctions des personnes et des modifications effectuées précédemment.

 

J'ai effectué les modifications précédentes.

 

Dans ma base de données, il y a bien l'ajout de ma nouvelle variable à la création de la déclinaison du produit.

Mais, je ne vois plus les déclinaisons de produits dans le Back Office.

 


 

EDIT 1 : Je viens de trouver mon erreur, c'est réglé.

 

Partie 3 :

 

J'avais mis :

'cardboards_by_pallet' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isInt', 'size' => 4), 

Il fallait enlever  'shop' => true, ce qui donne :

'cardboards_by_pallet' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'size' => 4), 

Je revois les déclinaisons dans le Back Office. En espérant que ça en aide certains.  :)

 


 

Maintenant, il ne me reste plus qu'à afficher cette variable dans le fichier product.tpl, mais je n'arrive pas à l'afficher.

 
Edit 2 :
 
Lorsque j'active le mode debug, j'obtiens cette erreur :
Notice: Undefined property: Product::$piece_by_cardboard in /homepages/29/d314111698/htdocs/prestashop/cache/smarty/compile/db/1b/72/db1b721154d4782b4f7b206d7131c896a7d951e8.file.product.tpl.php on line 348

J'utilise aussi {$product|@print_r} pour afficher toutes les variables présentes dans $product, ma nouvelle variable est absente.

Ma nouvelle variable n'est pas "ajoutée" à la variable $product de smarty, mais je ne vois toujours pas où peut se situer l'erreur ou l'oubli.

Je commence à ne plus avoir de cheveux sur le crâne, ca va faire 1 semaine que je cherche d'où peux venir le problème ...


 
Je m'en remet à vous pour m'aider. Cordialement, Tal'
Edited by Talezam (see edit history)

Share this post


Link to post
Share on other sites

Salut,

 

 

T'as essayé de vider le cache smary et le cache des classes ?

 

/cache/smarty

/cache/index_class.php

 

Share this post


Link to post
Share on other sites

Bonjour, 

 

Oui, j'ai vidé le cache, désactivé la mise en cache et activé la recompilation automatique du template.

Edited by Talezam (see edit history)

Share this post


Link to post
Share on other sites

Dans ce cas, peux tu me confirmer que tu as ajouté le champ "public $piece_by_cardboard;" dans la class Product avec ou sans override (/override/classes/Product.php).

Share this post


Link to post
Share on other sites

J'ai tout fait sans override, ca vient peut être de là, car j'ai un peu de mal a utilisé l'override.

 

Il faut quand même les annoncer dans Product.php et pas seulement dans Combination.php ? Je vais tester d'ici demain après midi. Je te redirais ça.

Edited by Talezam (see edit history)

Share this post


Link to post
Share on other sites

Bonjour,

 

Alors, j'ai testé en rajoutant :

public $piece_by_cardboard;

dans la classe product, en rajoutant une fois :

'cardboards_by_pallet' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'size' => 4), 

et sans cela. Je n'obtiens plus d'erreur en mode debug. Mais, la nouvelle variable que j'ai rentrée dans la BDD PREFIX.product_attribute ne va pas être récupéré. Je continue de chercher.
 

Lorsque je fais :

{$combinations|@print_r:1}

Je vois bien mes déclinaisons, et la valeur de ma nouvelle variable en fonction de la déclinaison. Mais en faisant :

$combinations->cardboards_by_pallet

Il y a cette erreur :

 

Notice: Trying to get property of non-object in /homepages/29/d314111698/htdocs/prestashop/cache/smarty/compile/db/1b/72/db1b721154d4782b4f7b206d7131c896a7d951e8.file.product.tpl.php on line 358

 

Si j'enlève du fichier product.php, la requête  sql de ma nouvelle variable(pa.`cardboards_by_pallet`), elle n'est plus visible lorsque j'affiche toutes les variables de $combinations. 

 

Si je met {$combinations.[iD de ma déclinaison].cardboards_by_pallet},  j'obtiens bien la variable qui s'affiche.

 

Je continue de chercher ....

Cordialement, Tal'
 

Edited by Talezam (see edit history)

Share this post


Link to post
Share on other sites

Bonjour à tous,

 

Je n'arrive toujours pas à afficher correctement ma valeur sur la fiche du produit.

 

En ce qui concerne la modification de ma nouvelle variable en fonction de la sélection du diamètre, la référence change. Il faudrait que ma nouvelle variable change aussi, je pense que cela si situe dans le product.js du thème que j'utilise, mais je ne peux pas tester tant que je n'arrive pas à afficher ma variable sur le fiche produit ....

Share this post


Link to post
Share on other sites

Un petit up.

 

JE sais que pour le changement de la valeur lors du choix du client, il faut modifier le fichier product.js, mais si je n'arrive pas à afficher la valeur de la déclinaison par défaut, je ne peux pas tester, la modification de cet élément en fonction du choix du client.

Share this post


Link to post
Share on other sites

Cela semble marcher pour lui : https://www.prestashop.com/forums/topic/455645-erreur-apres-ajout-champ-declinaison/?hl=%2Bdeclinaison

 

Mais perso ça inverse me champ dans les déclinaisons...

 

Après remise a zéro... cela fonctionne pour moi....

 

Pour afficher sur la page produit dynamiquement voici ce qu'il faut faire après:

 

Pour ceux qui veulent aller plus loin et afficher dynamiquement la nouvelle référence, un tuto pour la partie JS...

 

https://www.prestashop.com/forums/topic/250198-afficher-ean13-code-barre-sur-fiche-produit/page-2

 

Voilou

Share this post


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

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More