[PrestaShop 1.7] Ajouter des champs texte aux produits
Arnaud Merigeau
Aujourd’hui, nouveau tuto PrestaShop pour ajouter un champ aux produits pour ensuite l’utiliser dans vos intégrations front office ou bien dans des développements admin.
Constat : besoins spécifiques pour certains e-commerçants
Nombreux sont les projets où mes clients me demandent d’ajouter des données pour leurs produits sans pouvoir utiliser les champs disponibles par défaut. Voici le type de cas où je préfère utiliser des champs personnalisés pour les produits :
Dans ces cas précis, ce tutoriel PrestaShop risque combler vos attentes.
Ah mais attends, ce tuto PrestaShop va aussi vous faire gagner de l’argent.
Mais ça on va le voir plus loin.
Tuto PrestaShop : ajouter un champ pour les produits
C’est parti pour résoudre le cas numéro 1. Le tuto PrestaShop se déroule en 5 étapes assez simples vous allez voir. Penchons-nous d’abord sur les 4 premières étapes :
1. Installer le module AmProductFields
[Edit du 06/02/2020] J’ai modifié le module pour que les 2 champs texte et zone de texte soient compatibles avec le multilingue. Pour info, il manquait la class translation-field sur les champs. C’est à présent corrigé 🙂 La version 1.1.2 du module est donc disponible au téléchargement pour ajouter un champ texte au produit sous PrestaShop 1.7 !
Téléchargez le module PrestaShop AmProductFields v1.1 ci-dessous (module modifié issu du bon travail de Hervé Hennes dans cet article) puis installez-le simplement via le back office de PrestaShop. Aucune configuration n’est nécessaire, facile donc !
[email-download-link namefield= »YES » id= »4″]
2. Installer l’override Product.php
Pour vous simplifiez la tâche, j’ai compris dans le dossier du module le fichier override. Déplacez le fichier www/modules/amproductfields/doc_and_override/Product.php vers www/override/classes/ mais attention si vous avez déjà un fichier Product.php : dans ce cas, copiez le contenu du fichier que je fournis et adaptez-le avec le fichier Product.php déjà existant dans le dossier override/classes.
Supprimez le fichier de cache suivant : www/app/cache/prod/class_index.php
3. Rédigez vos contenus
Pour la base de départ, j’ai prévu 3 champs dont :
Rédigez vos contenus comme bon vous semble afin d’enrichir vos fiches produits.
4. Affichez vos contenus
Pour ma part, j’ai voulu afficher les informations saisies sur la fiche produit, sous les images, car par défaut le thème Classic offre de la place à cet endroit. On peut donc facilement rendre visible de l’information importante !
Ouvrez le fichier www/themes/classic/templates/catalog/product.tpl et ajoutez les lignes 74 à 77 :
{** * 2007-2017 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License 3.0 (AFL-3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/AFL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@prestashop.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <contact@prestashop.com> * @copyright 2007-2017 PrestaShop SA * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * International Registered Trademark & Property of PrestaShop SA *} {extends file=$layout}
On affiche alors les 2 champs traduisibles dans une <section> avec un id dans le cas où vous auriez besoin de donner un style particulier à l’élément. J’ai aussi encadré d’un <h2> le premier champ pour avoir un code optimisé pour le référencement.
Comment afficher les champs sur la page panier ?
[Edit du 21/07/2018] J’ai reçu plusieurs commentaires à ce sujet c’est pourquoi j’ai décidé de mettre à jour cet article. Je vais vous expliquer comment afficher les nouveaux champs de la fiche produit sur la page panier. Vous allez voir que c’est assez simple finalement !
J’ouvre d’abord le fichier www/classes/Cart.php et je copie la fonction getProducts dans un override que je place à cet endroit : www/override/classes/Cart.php.
Il faut ajouter les deux nouveaux champs dans la requête SQL SELECT ce qui donne ceci si on affiche la fonction simplement :
/** * Return cart products * * @param bool $refresh * @param bool $id_product * @param int $id_country * @param bool $fullInfos * * @return array Products */ public function getProducts($refresh = false, $id_product = false, $id_country = null, $fullInfos = true) { if (!$this->id) { return array(); } // Product cache must be strictly compared to NULL, or else an empty cart will add dozens of queries if ($this->_products !== null && !$refresh) { // Return product row with specified ID if it exists if (is_int($id_product)) { foreach ($this->_products as $product) { if ($product['id_product'] == $id_product) { return array($product); } } return array(); } return $this->_products; }
$sql->leftJoin('product_supplier', 'ps', 'ps.`id_product` = cp.`id_product` AND ps.`id_product_attribute` = cp.`id_product_attribute` AND ps.`id_supplier` = p.`id_supplier`'); $sql->leftJoin('manufacturer', 'm', 'm.`id_manufacturer` = p.`id_manufacturer`');
// @todo test if everything is ok, then refactorise call of this method $sql->join(Product::sqlStock('cp', 'cp'));
// Build WHERE clauses $sql->where('cp.`id_cart` = '.(int)$this->id); if ($id_product) { $sql->where('cp.`id_product` = '.(int)$id_product); } $sql->where('p.`id_product` IS NOT NULL');
// Build ORDER BY $sql->orderBy('cp.`date_add`, cp.`id_product`, cp.`id_product_attribute` ASC');
if (Customization::isFeatureActive()) { $sql->select('cu.`id_customization`, cu.`quantity` AS customization_quantity'); $sql->leftJoin( 'customization', 'cu', 'p.`id_product` = cu.`id_product` AND cp.`id_product_attribute` = cu.`id_product_attribute` AND cp.`id_customization` = cu.`id_customization` AND cu.`id_cart` = '.(int)$this->id ); $sql->groupBy('cp.`id_product_attribute`, cp.`id_product`, cp.`id_shop`, cp.`id_customization`'); } else { $sql->select('NULL AS customization_quantity, NULL AS id_customization'); }
if (Combination::isFeatureActive()) { $sql->select(' product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr, IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference, (p.`weight`+ pa.`weight`) weight_attribute, IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13, IF (IFNULL(pa.`isbn`, \'\') = \'\', p.`isbn`, pa.`isbn`) AS isbn, IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc, IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity, IF(product_attribute_shop.wholesale_price > 0, product_attribute_shop.wholesale_price, prod<br /> uct_shop.`wholesale_price`) wholesale_price ');
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`'); $sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.`id_shop` = cp.`id_shop` AND product_attribute_shop.`id_product_attribute` = pa.`id_product_attribute`)'); } else { $sql->select( 'p.`reference` AS reference, p.`ean13`, p.`isbn`, p.`upc` AS upc, product_shop.`minimal_quantity` AS minimal_quantity, product_shop.`wholesale_price` wholesale_price' ); }
$sql->select('image_shop.`id_image` id_image, il.`legend`'); $sql->leftJoin('image_shop', 'image_shop', 'image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$this->id_shop); $sql->leftJoin('image_lang', 'il', 'il.`id_image` = image_shop.`id_image` AND il.`id_lang` = '.(int)$this->id_lang);
$result = Db::getInstance()->executeS($sql);
// Reset the cache before the following return, or else an empty cart will add dozens of queries $products_ids = array(); $pa_ids = array(); if ($result) { foreach ($result as $key => $row) { $products_ids[] = $row['id_product']; $pa_ids[] = $row['id_product_attribute']; $specific_price = SpecificPrice::getSpecificPrice($row['id_product'], $this->id_shop, $this->id_currency, $id_country, $this->id_shop_group, $row['cart_quantity'], $row['id_product_attribute'], $this->id_customer, $this->id); if ($specific_price) { $reduction_type_row = array('reduction_type' => $specific_price['reduction_type']); } else { $reduction_type_row = array('reduction_type' => 0); }
$result[$key] = array_merge($row, $reduction_type_row); } } // Thus you can avoid one query per product, because there will be only one query for all the products of the cart Product::cacheProductsFeatures($products_ids); Cart::cacheSomeAttributesLists($pa_ids, $this->id_lang);
$this->_products = array(); if (empty($result)) { return array(); }
Notez l’ajout de pl.custom_field_lang_wysiwyg, pl.custom_field_lang, dans la requête SQL.
Une fois que c’est modifié, supprimez le fichier de cache suivant : www/app/cache/prod/class_index.php
Enfin, vous pouvez afficher les nouveaux champs dans le fichier www/prestashop/themes/mon_theme/templates/checkout/_partials/cart-detailed-product-line.tpl.tpl en utilisant :
Comment gagner de l’argent avec ce tuto PrestaShop ?
La réponse est assez simple vous allez voir.
Aujourd’hui, vous savez à présent comment afficher de nouveaux champs sur vos fiches produits. Très bien, et alors ??
Et bien, vous allez donc pouvoir proposer une fiche produit avec les infos clés en haut de page et un bouton d’ajout panier visible même sur les écrans de taille moyenne.
Enfin, vous allez pouvoir travailler votre référencement en ajoutant du contenu à vos fiches produits.
Je peux conseiller le format suivant :
description courte : avis du marchand avec un ton vendeur
champs supplémentaires : points clés du produit avec des faits
description longue : détails du produits avec des phrases et des informations pointues, le tout organisé avec des titres et visuels
Le résultat :
une fiche produit optimisée pour la lecture par vos clients, un meilleur taux de conversion à la clé
une visibilité de vos pages produits améliorée par un contenu plus riche et optimisé pour le SEO : meilleur référencement donc !
Vous avez un bel outil aujourd’hui pour développer votre business alors faites en bon usage 😉
Module PrestaShop : ACF – Advanced Custom Fields for Prestashop
Mise à jour de l’article [PrestaShop 1.7] Ajouter des champs texte aux produits du 14 septembre 2021
J’ai reçu un bon nombre de demandes depuis la création de cet article qui présent une solution pour ajouter un champ à la fiche produit.
Cependant certains d’entre vous me disent : « Je voudrais ajouter du texte et des options avec des cases à cocher » !
Ce à quoi je répond : « Hum le module que je propose gratuitement ne fait malheureusement pas ça mais … »
« Mais quoi ?! »
« Mais il existe une solution… »
Cette solution c’est un petit module qui va vous permettre d’avoir un module comme ACF pour WordPress pour ceux qui connaissent : un vrai bijou donc !
Vous pouvez avec ce module ajouter 9 types de champs :
text
textarea
WYSIWYG editor (text – html – images – videos)
switch (les fameux oui / non)
checkbox
checklist
select
radio
date
Parmi les autres caractéristiques, voici celles qui vont vous faire craquer :
nombre de champs illimité !
module compatible mutli-langues
module compatible multi-boutiques
création de champs pour les produits / catégories / clients
affichage front / back office super simple en choisissant les hooks de PrestaShop
possibilité d’avoir des champs lors de l’inscription des clients
compatible PrestaShop 1.7.X
Mais plutôt qu’un long discours, voici des captures écrans pour illustrer mes propos :
Création de champs pour les produits, catégories et clients
Liste des champs personnalisés
Création de champs pour les produits, catégories et clients
Type de champs personnalisés
Edition des champs personnalisés par un client
Champs personnalisés en admin pour un produit
Edition des champs personnalisés dans les infos client en front
Différents hook de la page catégorie pour les champs personnalisés
Différents hook de la page produit pour les champs personnalisés
Vue des champs dans l’admin pour un client