[PrestaShop 1.7] Ajouter des champs texte aux produits

PrestaShop
  • Accueil
  • Blog
  • [PrestaShop 1.7] Ajouter des champs texte aux produits

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 !

prestashop-1.7-ajouter-champs-produits

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}

{block name='head_seo' prepend}
<link rel="canonical" href="{$product.canonical_url}">
{/block}

{block name='head' append}
<meta property="og:type" content="product">
<meta property="og:url" content="{$urls.current_url}">
<meta property="og:title" content="{$page.meta.title}">
<meta property="og:site_name" content="{$shop.name}">
<meta property="og:description" content="{$page.meta.description}">
<meta property="og:image" content="{$product.cover.large.url}">
<meta property="product:pretax_price:amount" content="{$product.price_tax_exc}">
<meta property="product:pretax_price:currency" content="{$currency.iso_code}">
<meta property="product:price:amount" content="{$product.price_amount}">
<meta property="product:price:currency" content="{$currency.iso_code}">
{if isset($product.weight) && ($product.weight != 0)}
<meta property="product:weight:value" content="{$product.weight}">
<meta property="product:weight:units" content="{$product.weight_unit}">
{/if}
{/block}

{block name='content'}

<section id="main" itemscope itemtype="https://schema.org/Product">
<meta itemprop="url" content="{$product.url}">

<div class="row">
<div class="col-md-6">
{block name='page_content_container'}
<section class="page-content" id="content">
{block name='page_content'}
{block name='product_flags'}
<ul class="product-flags">
{foreach from=$product.flags item=flag}
<li class="product-flag {$flag.type}">{$flag.label}</li>
{/foreach}
</ul>
{/block}

{block name='product_cover_thumbnails'}
{include file='catalog/_partials/product-cover-thumbnails.tpl'}
{/block}
<div class="scroll-box-arrows">
<i class="material-icons left"></i>
<i class="material-icons right"></i>
</div>

<section id="amproductfields">
<h2>{$product.custom_field_lang}</h2>
<div>{$product.custom_field_lang_wysiwyg nofilter}</div>
</section>

{/block}
</section>
{/block}
</div>
<div class="col-md-6">
{block name='page_header_container'}
{block name='page_header'}
<h1 class="h1" itemprop="name">{block name='page_title'}{$product.name}{/block}</h1>
{/block}
{/block}
{block name='product_prices'}
{include file='catalog/_partials/product-prices.tpl'}
{/block}

<div class="product-information">
{block name='product_description_short'}
<div id="product-description-short-{$product.id}" itemprop="description">{$product.description_short nofilter}</div>
{/block}

{if $product.is_customizable && count($product.customizations.fields)}
{block name='product_customization'}
{include file="catalog/_partials/product-customization.tpl" customizations=$product.customizations}
{/block}
{/if}

<div class="product-actions">
{block name='product_buy'}
<form action="{$urls.pages.cart}" method="post" id="add-to-cart-or-refresh">
<input type="hidden" name="token" value="{$static_token}">
<input type="hidden" name="id_product" value="{$product.id}" id="product_page_product_id">
<input type="hidden" name="id_customization" value="{$product.id_customization}" id="product_customization_id">

{block name='product_variants'}
{include file='catalog/_partials/product-variants.tpl'}
%2<br />
0 {/block}

{block name='product_pack'}
{if $packItems}
<section class="product-pack">
<h3 class="h4">{l s='This pack contains' d='Shop.Theme.Catalog'}</h3>
{foreach from=$packItems item="product_pack"}
{block name='product_miniature'}
{include file='catalog/_partials/miniatures/pack-product.tpl' product=$product_pack}
{/block}
{/foreach}
</section>
{/if}
{/block}

{block name='product_discounts'}
{include file='catalog/_partials/product-discounts.tpl'}
{/block}

{block name='product_add_to_cart'}
{include file='catalog/_partials/product-add-to-cart.tpl'}
{/block}

{block name='product_additional_info'}
{include file='catalog/_partials/product-additional-info.tpl'}
{/block}

{block name='product_refresh'}
<input class="product-refresh ps-hidden-by-js" name="refresh" type="submit" value="{l s='Refresh' d='Shop.Theme.Actions'}">
{/block}
</form>
{/block}

</div>

{block name='hook_display_reassurance'}
{hook h='displayReassurance'}
{/block}
</div>
</div>
</div>

<div id="product_tabs" class="row">
<div class="col-xs-12">
{block name='product_tabs'}
<div class="tabs">
<ul class="nav nav-tabs" role="tablist">
{if $product.description}
<li class="nav-item">
<a
class="nav-link{if $product.description} active{/if}"
data-toggle="tab"
href="#description"
role="tab"
aria-controls="description"
{if $product.description} aria-selected="true"{/if}>{l s='Description' d='Shop.Theme.Catalog'}</a>
</li>
{/if}
<li class="nav-item">
<a
class="nav-link{if !$product.description} active{/if}"
data-toggle="tab"
href="#product-details"
role="tab"
aria-controls="product-details"
{if !$product.description} aria-selected="true"{/if}>{l s='Product Details' d='Shop.Theme.Catalog'}</a>
</li>
{if $product.attachments}
<li class="nav-item">
<a
class="nav-link"
data-toggle="tab"
href="#attachments"
role="tab"
aria-controls="attachments">{l s='Attachments' d='Shop.Theme.Catalog'}</a>
</li>
{/if}
{foreach from=$product.extraContent item=extra key=extraKey}
<li class="nav-item">
<a
class="nav-link"
data-toggle="tab"
href="#extra-{$extraKey}"
role="tab"
aria-controls="extra-{$extraKey}">{$extra.title}</a>
</li>
{/foreach}
</ul>

<div class="tab-content" id="tab-content">
<div class="tab-pane fade in{if $product.description} active{/if}" id="description" role="tabpanel">
{block name='product_description<br />
'}
<div class="product-description">{$product.description nofilter}</div>
{/block}
</div>

{block name='product_details'}
{include file='catalog/_partials/product-details.tpl'}
{/block}

{block name='product_attachments'}
{if $product.attachments}
<div class="tab-pane fade in" id="attachments" role="tabpanel">
<section class="product-attachments">
<h3 class="h5 text-uppercase">{l s='Download' d='Shop.Theme.Actions'}</h3>
{foreach from=$product.attachments item=attachment}
<div class="attachment">
<h4><a href="{url entity='attachment' params=['id_attachment' => $attachment.id_attachment]}">{$attachment.name}</a></h4>
<p>{$attachment.description}</p
<a href="{url entity='attachment' params=['id_attachment' => $attachment.id_attachment]}">
{l s='Download' d='Shop.Theme.Actions'} ({$attachment.file_size_formatted})
</a>
</div>
{/foreach}
</section>
</div>
{/if}
{/block}

{foreach from=$product.extraContent item=extra key=extraKey}
<div class="tab-pane fade in {$extra.attr.class}" id="extra-{$extraKey}" role="tabpanel" {foreach $extra.attr as $key => $val} {$key}="{$val}"{/foreach}>
{$extra.content nofilter}
</div>
{/foreach}
</div>
</div>
{/block}
</div>
</div>

{block name='product_accessories'}
{if $accessories}
<section class="product-accessories clearfix">
<h3 class="h5 text-uppercase">{l s='You might also like' d='Shop.Theme.Catalog'}</h3>
<div class="products">
{foreach from=$accessories item="product_accessory"}
{block name='product_miniature'}
{include file='catalog/_partials/miniatures/product.tpl' product=$product_accessory}
{/block}
{/foreach}
</div>
</section>
{/if}
{/block}

{block name='product_footer'}
{hook h='displayFooterProduct' product=$product category=$category}
{/block}

{block name='product_images_modal'}
{include file='catalog/_partials/product-images-modal.tpl'}
{/block}

{block name='page_footer_container'}
<footer class="page-footer">
{block name='page_footer'}
<!-- Footer content -->
{/block}
</footer>
{/block}
</section>

{/block}

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

// Build query
$sql = new DbQuery();

// Build SELECT
$sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, cp.`id_customization`, pl.`name`, p.`is_virtual`,
pl.`description_short`, pl.`available_now`, pl.`available_later`, product_shop.`id_category_default`, p.`id_supplier`,
p.`id_manufacturer`, m.`name` AS manufacturer_name, product_shop.`on_sale`, product_shop.`ecotax`, product_shop.`additional_shipping_cost`,
product_shop.`available_for_order`, product_shop.`show_price`, product_shop.`price`, product_shop.`active`, product_shop.`unity`, product_shop.`unit_price_ratio`,
stock.`quantity` AS quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`weight`,
p.`available_date`, p.`date_add`, p.`date_upd`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category, pl.`custom_field_lang_wysiwyg`, pl.`custom_field_lang`,
CONCAT(LPAD(cp.`id_product`, 10, 0), LPAD(IFNULL(cp.`id_product_attribute`, 0), 10, 0), IFNULL(cp.`id_address_delivery`, 0), IFNULL(cp.`id_customization`, 0)) AS unique_id, cp.id_address_delivery,
product_shop.advanced_stock_management, ps.product_supplier_reference supplier_reference');

// Build FROM
$sql->from('cart_product', 'cp');

// Build JOIN
$sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
$sql->innerJoin('product_shop', 'product_shop', '(product_shop.`id_shop` = cp.`id_shop` AND product_shop.`id_product` = p.`id_product`)');
$sql->leftJoin(
'product_lang',
'pl',
'p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('pl', 'cp.id_shop')
);

$sql->leftJoin(
'category_lang',
'cl',
'product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl', 'cp.id_shop')
);

$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();
}

if ($fullInfos) {
$ecotax_rate = (float)Tax::getProductEcotaxRate($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
$apply_eco_tax = Product::$_taxCalculationMethod == PS_TAX_INC && (int)Configuration::get('PS_TAX');
$cart_shop_context = Context::getContext()->cloneContext();

$gifts = $this->getCartRules(CartRule::FILTER_ACTION_GIFT);
$givenAwayProductsIds = array();

if ($this->shouldSplitGiftProductsQuantity && count($gifts) > 0) {
foreach ($gifts as $gift) {
foreach ($result as $rowIndex => $row) {
if (!array_key_exists('is_gift', $result[$rowIndex])) {
$result[$rowIndex]['is_gift'] = false;
}

if (
$row['id_product'] == $gift['gift_product'] &&
$row['id_product_attribute'] == $gift['gift_product_attribute']
) {
$row['is_gift'] = true;
$result[$rowIndex] = $row;
}
}

$index = $gift['gift_product'] . '-' . $gift['gift_product_attribute'];
if (!array_key_exists($index, $givenAwayProductsIds)) {
$givenAwayProductsIds[$index] = 1;
} else {
$givenAwayProductsIds[$index]++;
}
}
}

foreach ($result as &$row) {
if (!array_key_exists('is_gift', $row)) {
$row['is_gift'] = false;
}

$additionalRow = Product::getProductProperties((int)$this->id_lang, $row);
$row['reduction'] = $additionalRow['reduction'];
$row['price_without_reduction'] = $additionalRow['price_without_reduction'];
$row['specific_prices'] = $additionalRow['specific_prices'];
unset($additionalRow);

$givenAwayQuantity = 0;
$giftIndex = $row['id_product'] . '-' . $row['id_product_attribute'];
if ($row['is_gift'] && array_key_exists($giftIndex, $givenAwayProductsIds)) {
$givenAwayQuantity = $givenAwayProductsIds[$giftIndex];
}

if (!$row['is_gift'] || (int)$row['cart_quantity'] === $givenAwayQuantity) {
$row = $this->applyProductCalculations($row, $cart_shop_context);
} else {
// Separate products given away from those manually added to cart
%2<br />
0 $this->_products[] = $this->applyProductCalculations($row, $cart_shop_context, $givenAwayQuantity);
unset($row['is_gift']);
$row = $this->applyProductCalculations(
$row,
$cart_shop_context,
$row['cart_quantity'] - $givenAwayQuantity
);
}

$this->_products[] = $row;
}
} else {
$this->_products = $result;
}

return $this->_products;
}

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 :

<section id="amproductfields">
<h2>{$product.custom_field_lang}</h2>
<div>{$product.custom_field_lang_wysiwyg nofilter}</div>
</section>

 

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.
prestashop-1.7-ajouter-champs-produits-1
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 !

Module Prestashop champs personnalisés ACF

Vous pouvez avec ce module ajouter 9 types de champs :

  1. text
  2. textarea
  3. WYSIWYG editor (text – html – images – videos)
  4. switch (les fameux oui / non)
  5. checkbox
  6. checklist
  7. select
  8. radio
  9. 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 :

Lien du module que j’utilise pour de nombreux projets (30$) : Advanced Custom Fields for Prestashop

A bientôt pour un nouvel article !

151 commentaires sur “[PrestaShop 1.7] Ajouter des champs texte aux produits

  1. Bonjour Arnaud,

    Merci pour ce module très utile. Cependant, la variable s’affiche même si rien n’est saisie dans le champs personnalisé d’un produit. Savez-vous me dire comment appliquer une condition à l’affichage ?

    En vous remerciant.

    1. Bonjour Jesse,
      Vous pouvez utiliser une condition comme {if isset($product.custom_field_lang) && $product.custom_field_lang}{$product.custom_field_lang}{/if}
      Bonne journée 🙂

  2. Bonjour Arnaud et merci beaucoup pour ce module qui m’a bien dépanné !
    Il fonctionne parfaitement bien pour moi à l’exception d’un petit détail. Le champ custom_field_lang s’affiche bien à la fois sur la page catérorie, sur la page produit dans la section vente croisée mais pas sur la page produit dans la section accessoires. C’est le même fichier tpl qui est utilisé.
    Version de prestashop : 1.7.8.8 Theme warehouse 4.5.8.
    Auriez-vous une idée de pourquoi le champ ne s’affiche pas uniquement dans les accessoires ?
    Merci
    Cordialement

    1. Bonjour Laurent,
      De tête, il faut modifier la fonction getAcessories() dans la class Product.php pour appeler le champ souhaité dans la requête sql.
      A bientôt 🙂

  3. Bonjour Arnaud et merci pour ce tuto. Je ne sais pas si mon message d’hier est bien passé mais il est obsolète, j’ai trouvé pourquoi les données entrées ne s’affichaient pas dans l’admin (ligne ajoutant mon champ dans le tpl non enregistrée). Par contre, j’aimerais ajouter ce champ dans les colonnes de liste de produits en admin. J’ai bien trouvé des tutos pour afficher une colonne Manufacturer (entre autres celui de Hervé Hennes), mais je n’arrive pas à adapter pour qu’il affiche le champ custom date et permette un tri dessus puisque ce ne sera pas par id. Si jamais vous avez une piste à me fournir, ce serait super ! Merci et bonne journée !

    1. Bonjour Camille,
      Merci pour le commentaire,
      J’ai récemment eu besoin d’ajouter des données dans les colonnes en back office et j’ai pris ce module https://prestashop.pxf.io/GjAedr
      On a pas mal de champs disponibles en natifs et on peut en ajouter d’autres personnalisés.
      Bon développement !

  4. bonjour Arnaud, merci pour ce tuto que je découvre après être tombée sur le code sur Github 😉 Petite question (posée sur Github aussi), lorsque je remplis les 2 premiers champs, ils sont bien enregistrés en bdd, mais après rafraichissement de la page produit en BO, le contenu ne s’affiche plus. Seul le contenu du champ wysiwhig s’affiche.
    Pour ma part, j’avais besoin d’un champ date (pour ajouter une date de péremption). Je l’ai donc ajouté au code du module (custom_field_date) et dans l’override Product.php, ça fonctionne nickel. Mais pareil, le contenu n’est plus affiché après rafraichissement. Comme il y a aussi un champ date (availability_date) sur l’onglet Quantités, j’ai vu que la valeur “value” est remplacée ensuite par la date entrée. Donc dans le tpl du module, j’ai essayé d’ajouter value =”$custom_field_date” mais cela ne semble pas récupérer le contenu du champ. Si vous avez une petite minute pour ne fût-ce que me dire comment résoudre ma première question, peut-être arriverais-je à résoudre la seconde toute seule. Merci d’avance !

  5. merci 🙂
    C’est quelle class qu’il faut overrider ? J’ai rien trouvé qui peut correspondre? Dans la le fichier class/ product.php ou un autre fichier ?
    Merci encore pour ce super tuto

    1. Bonjour Mikael,
      Merci pour votre commentaire,
      Il s’agit de la class Product.php en effet.
      Bon développement 👌

  6. Hello,
    Merci pour ce super tuto pour ajouter des champs perso sur les fiches produits 🙂
    Il fonctionne super bien.
    Petite question : pour les accessoires des produits (les produits liés) les champs perso ne s’affiche pas dans les miniatures.
    On est donc sur une fiche produit, on affiches les produits liés avec les miniatures. J’ai ajouté {$product.custom_field_lang} sur les miniatures. Cela fonctionne partout, même sur les pages de catégories, mais pas sur les produits liés.

    De ce que j’ai cru comprendre la seule différence que j’ai relevé vient de ceci. On appelle les product accessory et pas seulement les product.
    {foreach from=$accessories item=”product_accessory”}
    {block name=’product_miniature’}
    {include file=’catalog/_partials/miniatures/product.tpl’ product=$product_accessory carousel=true richData=true}
    {/block}
    {/foreach}

    Comment faire pour que le champs perso soit aussi pris en compte dans l’appel des produits liés?

    Merci par avance pour votre aide et aussi pour ce super blog qui est facile à lire et comprendre 🙂

    1. Bonjour Mickaël,
      Merci pour le commentaire.
      De tête, il faut modifier le controller qui passe les variables pour les listes produits des accessoires.
      Bon courage 🙂

  7. Bonjour,
    Merci pour votre retour. J’ai effectivement pu rajouter mes champs de la backOffice et la page produit c’est top !
    Sur ma lancée j’ai souhaité faire la même chose sur la page panier (en suivant le tuto) mais systématiquement j’ai une erreur dans le panier. Les champs ont bien été ajoutés dans la requête SQL cependant l’appel depuis le fichier cart-detailed-product-line.tpl ne fonctionne pas… j’ai plusieurs erreurs. il y a t’il un endroit particulier où ajouter le code ? C’est bien ou l’on veut avoir l’information ? Si vous avez une piste pour m’aiguiller.
    Encore merci à vous

    1. Bonjour Maxpepe5924,
      Merci pour ton commentaire !
      Pour pouvoir répondre, il faudrait avoir plus d’information.
      Quel est le code ? Quelles sont les erreurs ?

  8. Bonjour Arnaud,
    Merci pour ce tuto très bien fait et qui fonctionne parfaitement. Je vois bien les 3 champs dans les produits. Pour ma part j’avais 4 champs texte à rajouter dans la table produit pour ensuite pouvoir les mettre à jour en masse via CSV. Visiblement je n’ai pas ces champs accessible facilement sur phpmyadmin ? Est ce que je peux rajouter plus de champs que ceux par défaut ?
    Merci d’avance pour ton retour et déjà un grand merci

    1. Bonjour Maxpepe5924,
      Les champs sont ajoutés à la table ps_product et ps_product_lang.
      Bonne journée :p)

  9. Bonjour Arnaud,

    Merci beaucoup pour votre article 😀

    Serait-il possible d’ajouter ces champs pour chaque déclinaison de produit ? Il faut que j’inscrive un code spécial pour chaque produit et déclinaison comme un second code ean.

    Merci d’avance de votre aide,
    Salutations

    1. Bonjour Alex,
      Je ne connais pas de module pour ajouter un champ aux déclinaisons produits malheureusement.
      Si j’en vois un passé, je le posterai dans les commentaires ; abonnez-vous pour avoir l’info 😉

  10. Bonjour Arnaud,
    est-ce que le module ACF pourrait servir à attacher les numéros de série à un produit ? Mon client vend des produits physiques où pour chaque déclinaison, chaque exemplaire est muni de son numéro de série qui donne le droit à la garantie. Est-ce qu’il aurait une possibilité de remonter ces informations dans le stock ?
    Merci d’avance de votre aide
    Cordialement
    Ewa

  11. Bonjour Arnaud,
    est-ce que le module ACF pourrait servir à attacher les numéros de série à un produit ? Mon client vend des produits physiques où pour chaque déclinaison, chaque exemplaire est muni de son numéro de série qui donne le droit à la garantie. Est-ce qu’il aurait une possibilité de remonter ces informations dans le stock ?
    Merci d’avance de votre aide
    Cordialement
    Ewa

    1. Bonjour Jujube33,
      Ce n’est pas le but car ACF permet de rattacher une information fixe.
      Dans votre cas, il faudrait une liste de numéros de série à rattacher à chaque commande.

  12. Bonjour,

    A tout hasard, vous n’auriez pas un plugin miracle pour rajouter du texte en bas de la page catégorie?
    Mettre un pavé tout en haut de cette page pour le SEO n’est pas super top au niveau de l’UX.
    Malheureusement je ne trouve rien.
    Help. :p

    Merci

    1. Bonjour Denis,
      Pas de miracle ^^
      Pour ajouter du contenu en bas de page catégorie, vous pouvez prendre ce module Advanced Custom Fields for Prestashop.
      Il vous permet d’ajouter des champs pour les catégories notamment et ensuite vous pourrez placer le shortcode où vous voulez dans votre page catégories 🙂
      A bientôt !

  13. Bonjour Arnaud,

    je suis sous presta 1.7.8.1 theme classic et j’aimerai placer (en plus) le prix du produit à coté du bouton panier sur la page produit.
    En effet, j’ai des produits avec plusieurs attributs et le prix n’est plus visible à l’écran quand on scrolle vers le bas. De fait, le client ne voit pas le prix changer quand il modifie les attributs.
    Je pense que cela se passe sur le fichier “product.tpl” mais je préfère demander votre avis…

    Merci pour votre blog qui est d’une grande aide pour les #&*°) comme moi !
    Amicalement, Patrick

  14. Bonjour,

    J’ai le même soucis que Josselin j’ai fait mise à jour de 1.7.7.4 à 1.7.8.2 et je n’ai plus de champs descriptions et récapitulatif dans le BO et cela même en natif et même avec le module d’édition rapide. J’étais en train de chercher une solution (ça fait une semaine…) mais rien…
    Avez vous une idée ? Bien entendu j’ai désactivé le module précité, vidé le cache, mais rien…
    Je viens de me lancer et faire ma pub et BIM…je ne peux plus saisir de nouveaux articles… au secours…

    1. Bonjour Aurélie,
      Le module est à jour est fonctionnel, testé sur PrestaShop 1.7.8.0.
      Bonne journée 🙂

  15. Bonjour Arnaud,
    Tout d’abord un très grand merci pour votre module.
    Pour des raisons de sécurité, je viens de passer ma boutique en Prestashop 1.7.8.
    Le module est toujours actif, mes textes déjà saisis (dans la version Presta précédente) apparaissent bien sur le site, mais côté BO les champs du module sont désespérément vides sur les fiches produit et impossible d’y ajouter la moindre information.
    Si vous avez une idée de ce qui a pu provoquer cela, je suis preneur. Sinon j’attendrais une éventuelle mise à jour.
    Merci
    Josselin

    1. Bonjour Josselin,
      Merci pour le retour et en effet une mise à jour devrait corriger cela.
      Abonnez-vous au blog via le flux rss ou la newsletter pour avoir l’info 😉

  16. Bonjour, j’ai testé votre module avec succès et je vous en remercie. (prestashop 1.7.7.5 sur des boutiques du multiboutique)

    Cependant je ne voulais l’utiliser que pour certains groupes client et pas d’autres. Utiliser la simple désactivation du module par le groupe n’a pas l’air suffisant
    Auriez vous une piste ? le module complet le permet il sinon le cas échéant ?
    merci et bonne journée

  17. Bonjour Arnaud,
    J’utilise cet addon depuis deux ans je suis actuellement à la version 1.7.6.9, j’ai fait la maj presta hier vers 1.7.7.7 et tout les textes sous les photos ont disparu, à la place il y avait marqué “Array”.
    J’ai donc fait une restauration vers ma version précédente.
    Que faire ?

    1. Bonjour Sylvain,
      Super content de savoir que ce module vous est utile.
      C’est vrai qu’il n’y a pas 50 solutions gratuites pour créer un champ produit dans PrestaShop 1.7 en même temps.
      Je note pour une prochaine évolution de ce module gratuit 😉
      Restez connecté pour être averti de la mise à jour !

  18. Bonjour, J’ai testé le module sur presta 1.768, dans le back office tout fonctionne mais sur la page produit rien ne s’affiche avec la ligne {$product.custom_field_lang_wysiwyg nofilter} . Y’a t’il une astuce ? Merci 😉

    1. Bonjour Cyril,
      Il faut bien vider le cache de PrestaShop avant tout 😉

  19. Bonjour Arnaud,
    Excellent tuto.
    Dans ton exemple, tu inclus le contenu dans une “section” en le positionnant sous les photos.
    Mais comment puis-je l’intégrer parmi les tab “Description” et “Détails Produit” en ajoutant une nouvelle tab ?
    Je suis sur la version 1.7.7.5

    Merci

  20. Bonjour, il semble qu’il n’est plus compatible, il apparait pas dans les modules. version 1.7.7.3.
    Merci pour votre partage

    1. Bonjour shunshuk,
      Le module n’est pas testé sur PrestaShop 1.7.7.3, à voir en effet si des adaptations sont nécessaires.
      N’hésitez pas à partager vos retours pour les autres 😉

  21. Bonsoir,

    Votre tuto m’a beaucoup intéressé, il est très bien fait.

    Mais visiblement et d’après ce que j’ai compris, il n’est pas possible de créer un champ supplémentaire affecté à chaque déclinaisons de la fiche produit. (donc qui changerait éventuellement en fonction de la déclinaison sélectionnée)

    Ou alors je n’ai pas tout compris ?

    Existe t-il une astuce pour ce “genre” de champ supplémentaire ?

    Par avance, merci pour le retour !

    1. Bonjour Cris,
      Pour ce faire, vous devez modifier via un override le controller ProductController.php.
      Par exemple il y a la fonction assignAttributesGroups qui pourrait faire l’affaire.
      Bon courage 🙂

  22. Bonjour,

    Je voudrai savoir si possible de faire un truc comme ” Ajouter un produit associé’ dans la fiche du produit dans le BO ?
    un champ auto-complet avec un bouton ajouter, avec la possibilité de mettre plusieurs valeur ?

    Merci d’avance

    1. Bonjour tefigasy,
      Merci pour votre commentaire.
      C’est possible en effet aussi c’est en complément du tuto pour ajouter un champ aux produits.
      A voir pour un prochain tuto !

  23. Bonjour,

    Merci pour votre travail et partage.

    Est-il possible de mettre à jour les champs en masse avec un import .CSV comme pour les références produit par exemple ? Et si oui comment ?

    Je vous remercie d’avance.

    1. Bonjour Jesse,
      Oui c’est possible via la base de données dans la table ps_product_lang avec un export / import en csv.
      Bon courage 😉

  24. Bonjour,

    Merci beaucoup pour le tutoriel, en en suivant des différents j’ai réussi à créer un module avec des champs textes et éditeurs HTML sur la fiche produit dans deux langues.

    Mais je voudrais ajouter une liste déroulante (les options peuvent être saisies en dur dans le template du formulaire, avec un label texte et une valeur numéraire qui serait la seule à être sauvegardée en DB) et je n’ai pour l’instant aucune idée de comment procéder.

    Si vous avez le temps pour un exemple ou des indications ce serait super !

    Merci d’avance.
    Cordialement,
    Claire

    1. Bonjour Claire,
      Merci pour le commentaire !
      Je me note cette idée pour un prochain tuto 😉

  25. Je réponds sur un nouveau post, car la fonction Répondre ne fonctionne pas sur ton site.
    Pardon, j’ai testé sur une 1.7.5.1, je vais testé sur une version plus haute.
    J’ai bien la classe translation-field dans le .TPL.
    Je ne vois pas comment les noms des champs xxxx_lang_1 peuvent être comprisent par le système, alors que le système se base sur un tableau pour les langues, type xxxx_lang[1]. Sur ta version, c’est avec un underscore, et je n’arrive pas à comprendre. Tout ce qui n’est pas avec du multilingue marche bien, oui, mais pour le reste, c’est filtré par la fonction et ca ne remonte pas dans $this->update_fields.

  26. Bonjour, je vous remercie pour ce module. Sur une 1.7.6+, le module ne fonctionne pas pour les champs multilingue.
    Je ne comprends pas comment le système arriverait à capter les champs custom_field_lang_1 ou custom_field_lang_2, alors que le système est fait pour capter un tableau ? custom_field_lang[1]
    Et même en l’envoyant de la sorte, la variable ne remonte pas jusqu’à la BDD, elle est filtrée semble t-il par formatFields()

    Qu’en pensez vous ?

    1. Bonjour Hugo,
      Après installation récemment sur PrestaShop 1.7.6.7, tout est bien fonctionnel.
      Il y a eu des updates suite à certains commentaires également.

    1. Bonjour Lionel,
      Je vous invite à vérifier si l’override est bien installé et si le fichier class_index.php est bien supprimé.
      Vous pouvez aussi tester la variable $product de la sorte {$product|print_r} pour savoir ce qu’elle retourne.
      Bon courage 😉

  27. bonjour ,a tous
    plus que débutant et ayant besoin de pal mal de détail sur ma facture j’ai trouvé ce module très intéressant et a ma portée, mais pourtant je bute sur quelques soucis , j’ai bien réussi a faire afficher les infos sur la description du produit , mais je n’arrive pas a faire appraitre dans le détail du panier au mieux que j’ai réussi il apparaît un”Array” en dessous du nom du produit, si quelqu’un arrive a faire comprendre a un vieux de 48 ans ce qu’il n’a pas du comprendre , je suis partant , merci

    1. Bonjour Lionel,
      Repassez sur toutes les étapes du tutoriel et vérifiez bien le fichier de cache qui doit être supprimé.
      Bon courage !

  28. Bonjour,
    J’ai fait la demande pour recevoir le module, et lors du téléchargement je me retrouve avec une zip de 0 Ko.
    Est-ce qu’on peut le récupérer autrement ?
    Testé sous Chrome et Firefox.

    Merci

  29. Bonjour,
    Je voudrais savoir ce qu’il faut faire pour creer une section (dans l’édition de produit et onglet information) pour intégrer une case assez large ou je peux taper du texte et pouvoir l’enregistrer. Cette case serait a usage interne et sera seulement vu en backoffice prestashop par les administrateurs.
    Merci
    Jean-Baptiste

    1. Bonjour Jean-Baptiste,
      Vous pouvez utiliser le tuto et ne pas ajouter de variables dans les fichiers .tpl.
      Vous aurez ainsi des champs pour les produits seulement visibles en back office.

    2. Bonjour,
      L’article “[PrestaShop 1.7] Ajouter des champs texte aux produits” est pour PrestaShop 1.7 donc non ça ne fonctionne pas pour PrestaShop 1.6 mais après une courte recherche sur Google vous allez trouver 😉

  30. Merci encore pour ce tuto, j’aimerai faire la même chose pour les déclinaisons, mais il semblerait que ma valeur ne soit pas prise en compte lors de la soumission du formulaire… J’ai adapté le code du tuto, je récupère bien la valeur lors du chargement mais celle ci n’est pas transmise.
    En regardant de plus prés la valeur du name ne semble pas bonne , les autres champs ont comme valeur de name un tableau, où chaque champ a une clef bien précise. je me suis donc dit que j’allais adapter le name de mon champ, sauf que là j’ai une erreur de Symfony qui me signale que le nouveau champ fournit est de trop et donc ne passe pas le validateur… bref je sens que je suis pas loin mais je bloque… Si quelqu’un a une idée
    Merci d’avance.

  31. Bonjour,
    Je suis à la recherche de solutions pour ajouter un champs de chargement d’une image. Avez-vous des conseils ou des pistes à suivre?
    Merci !

    1. Bonjour Cédric,
      Vous pouvez détourner l’information saisie dans le champ WYSIWYG en solution simple.
      Il est aussi possible d’ajouter un champ image mais ce n’est pas la même histoire.
      A voir pour un prochain tuto 😉

    2. En effet j’ai pensé à utiliser le champ WYSIWYG, mais je préfèrerai un champ image propre.
      Nous attendons avec impatience alors le tuto !!!

  32. Bonjour,
    Pour information, j’ai ajouté la classe “translation-field” aux classes “tab-pane” dans le fichier “amproductfields/views/templates/hook/amproductfields.tpl” pour que le multilingue fonctionne et s’enregistre correctement dans la base de données, en tout cas sur la 1.7.6.1.

  33. Bonjour,
    merci pour ce tuto, j’ai un soucis pour ma part les données ne semble pas s’enregistrées. Avez vous tester sur 1.7.6.1 ?
    Merci d’avance.

  34. gros problème avec le champ personnalisé supplémentaire dans la fiche produit
    Bonjour,
    Je demande pardon pour les erreurs de mon français, j’espère pouvoir me faire comprendre.
    J’ai un gros problème avec le champ personnalisé supplémentaire dans la fiche produit https://www.arnaud-merigeau.fr/prestashop-1-7-ajouter-des-champs-texte-aux-produits-2/.
    Votre module fonctionne parfaitement en insérant le champ personnalisé dans le détail du produit. Même si je l’insère dans la liste, il affiche parfaitement le champ, mais le choix de voir le détail d’un produit contenant des articles connexes (vous l’aimerez peut-être aussi) provoque une grosse erreur. si l’article dans la liste n’a pas de produits connexes, entrez dans les détails du produit et tout fonctionne correctement.
    Cela fait des jours que je suis fou de trouver une solution, mais je ne suis pas un programmeur, je peux faire des tentatives dangereuses.
    J’ai besoin de votre aide précieuse pour savoir comment résoudre la situation.
    Je vous envoie des pièces jointes.
    Merci et j’espère vous lire bientôt.
    Meilleurs voeux.
    Paola Marini

    1. Bonjour Paola,
      Je vous ai répondu par e-mail pour étudier le cas dans une intervention.

  35. Bonjour,
    merci de votre réponse !
    mais je n’ai pas l’impression que la solution de Sylvain soit en rapport avec le multiboutique, il parle uniquement du côté multilingue ? Mon problème est dans le cas où un champ est multilingue, lors de sa modification en vue “toutes les boutiques”…

    1. Bonjour Agnès,
      Je n’ai pas eu l’occasion de tester en multiboutique, si vous arrivez à vos fins n’hésitez pas à poster ici la réponse pour en aider d’autres 😉

  36. Bonjour,
    merci pour ce module très utile !
    Cependant, les champs multilingues ne s’enregistrent pas en base de données lorsqu’on a plusieurs boutiques et qu’on fait la modification en vue “toutes les boutiques”.
    Si on suit le principe de Prestashop, ça devrait modifier ce champ dans chaque boutique.
    Savez-vous d’où ce problème peut venir ?
    Merci !

    1. Bonjour Agnes,
      Sylvain a remonté un correctif plus haut sur le site de h-hennes 😉

  37. bonjour, je n’arrive pas a télécharger votre module, je met bien mes informations mais je ne reçoit pas le lien de téléchargement

    1. Bonjour,
      Je viens de tester c’est fonctionnel, vous devez saisir votre nom et e-mail puis valider.
      Vous recevrez le lien par e-mail 🙂

  38. Bonjour,
    Je tiens simplement à vous dire merci pour l’ensemble de votre travail, j’ai ajouté votre site dans mes favoris et je l’utilise régulièrement.
    Cordialement,

  39. Bonjour,
    merci pour votre tuto.
    Par hasard, auriez vous déjà essayé d’ajouter un champ prix (et non texte donc) afin que celui-ci puisse modifier le prix du produit ?
    merci !

    1. Bonjour,
      Je ne vous conseille pas de modifier le champ prix car l’impact n’est pas que sur l’affichage de la fiche produit (facture, admin…).

  40. Bonjour, merci beaucoup pour cet article.
    J’ai un petit soucis lors de l’affichage des valeurs dans le panier.
    La variable dans la balise “h2” ne s’affiche pas et la variable dans la balise “p” affiche “Array”.
    Ma version de prestashop est 1.7.5.2
    Tout fonctionne parfaitement dans la page produit.
    Merci

    1. Bonjour,
      Dans ce cas, il faut modifier le controller adéquat et ajouter les champs à la requête SQL.

  41. Bonjour Arnaud,
    Merci pour ton article qui est exactement ce que je recherche. Malheureusement j’ai un problème dans sa mise en place. Les données saisi dans l’un des 3 champs disponible s’enregistrent correctement en base de données mais ne s’affiche ni sur la fiche produit en front ni sur la fiche produit en back. As-tu une idée pour m’aiguiller ?

    1. Bonjour Jérôme,
      Dans ce cas, il faut bien vérifier tous les points du tutos car l’un n’est sûrement pas bon 😉
      Bon courage !

  42. Salut,
    Merci pour ton article, c’est toujours le bienvenu 🙂
    Il y a une coquille dans la méthode AmProductFields::hookDisplayAdminProductsMainStepLeftColumnMiddle($params).
    Tu passes en paramètre la variable $active à la méthode Language::getLanguages($active), mais elle n’est pas définie. Saurais-tu la définir ?
    Sinon, j’ai du mal à comprendre l’utilité de premier champ “custom_field”. Tu indiques une relation avec Lengow et le duplicate content. Est-ce une valeur personnalisée qui sera affichée qu’à l’export ?
    Merci

    1. Bonjour Flo,
      Merci pour ton commentaire.
      Je n’ai pas sous la main mon ordinateur pour regarder car en congés aussi avant que je mette à jour l’article, il faut regarder du côté de la Class Language.php quel paramètre est attendu pour $active.
      Concernant Lengow, dans mon cas spécifique, l’ajout des champs a permis d’utiliser pour les produits des informations supplémentaires à envoyer aux marketplaces 😉
      A bientôt !

  43. Bonjour, sur version 1.7.5.0 avec un thème, cela ne s’affiche pas. Le thème pose peut être problème ?

    1. Bonjour Jer84,
      Une fois les données enregistrées, il faut ajouter la variable pour afficher les données dans le fichier .tpl voulu 😉

  44. Bonjour,
    J’ai installé le module sur la version 1.7.5.0 de Pretashop mais aucune des valeurs ne sont enregistrées en base de donnée lors de la soumission. Y a t il une manip particulière à affectuer pour cette dernière version de Prestashop ?
    Merci pour votre aide.

    1. Bonjour,
      Non aucune action particulière si ce n’est installer et utiliser.
      Bon courage !

  45. Merci pour ce tuto, c’est exactement ce dont j’avais besoin ! J’ai juste besoin d’un léger coup de main, je travaille avec prestashop depuis une semaine, je ne trouve pas le fichier cache suivant : www/app/cache/prod/class_index.php dans mon ftp. Et voici donc ce qui s’affiche en dessous de l’image de mon produit : https://screenshots.firefox.com/9pVMvrJ2x59CxqCv/centuryprint.eu
    Pouvez-vous m’éclairer svp ? Ce serait vraiment génial merci

    1. Bonjour Kevin,
      Dans le dossier www/app/cache/ vous avez /prod/ et/ou /dev/ selon si vous activez le mode debug ou non 😉

  46. Je viens de passer prestashop en version 1.7.5.0, j’ai retélécharger le zip puis je l’ai décompressé. J’ai mis le dossier obtenu “amproductfields” dans “www/modules/” puis j’ai pris le fichier www/modules/amproductfields/doc_and_override/Product.php pour le déplacer vers www/override/classes/
    Et là… le module ne s’affiche même plus en français et il provoque un bug lors que je clique sur créer un nouveau produit: ça m’envoi sur le tableau de bord. j’ai été obligé de tout remettre d’origine pour pouvoir créer un nouveau produit.
    Plus je progresse, moins j’avance avec ce module…!
    Arnaud est ce que tu pourrais me dire comment faire fonctionner ce module sur la 1.7.5.0 (alors que ça marchait en 1.7.4.3) et comment le faire fonctionner en multinlingue (là ça n’a jamais fonctionné sur aucune version 1.7 par contre) ?
    Merci !

    1. Finalement j’ai trouvé la méthode et je l’ai expliqué dans ce forum:
      https://www.h-hennes.fr/blog/2017/10/19/prestashop-1-7-ajouter-des-champs-produit/#comment-21782
      Avec cette modif le module fonctionne bien pour ajouter des textes sous les photos produits de prestashop et en multilingue!
      Pour ce faire j’ai utilisé le module de Hervé Hennes et j’ai utilisé votre apport des lignes 74 à 77 du fichier www/themes/classic/templates/catalog/product.tpl (encore valable sous ps 1.7.5.0) et j’ai rajouté une touche personnelle de CSS pour en faire un élément qui parait natif à prestashop.

    2. Merci pour le retour Sylvain, je vais mettre l’article à jour prochainement !

  47. @rogers750172 Est ce que le champs multilingue affiche un texte différent en chaque langue voulue dans le back &amp; front office ?
    Moi sur 1.7.4.4 ça ne fonctionne pas..

  48. Bonjour, je viens d’installer le module et j’ai le problème cité plus haut, à savoir la valeur n’est pas enregistrée dans la base de donnée lors de la soumission.

  49. Bravo et merci pour ce tuto.
    Fonctionne parfaitement sur la version 1.7.5.0.
    Pour ma part, j’ai placé ce nouveau champ sur le côté droit, sous le le bouton “Ajouter au panier”.
    Cordialement,
    Roger.

  50. Bonsoir, est ce que cette modification est compatible avec prestashop 1.6.1.17 ?
    Merci d’avance de votre réponse… Je tourne en rond…
    Cordialement

  51. Bonjour et bonne année 2019
    j’ai le même problème que mes collègues sur 1.7.1.2 sauf que les correctifs proposés ne fonctionnent pas. Une fois installé le module fait bien les ALTER TABLE mais les champs n’apparaissent pas dans la page admin produit.
    Cela semble venir du hook car le hookDisplayAdminProductsMainStepLeftColumnMiddle n’est pas déclenché dans la page produits. Preuve en est que lorsque je glisse une erreur dans le code de amproductfiels.php la page produit n’est pas du tout affectée.
    Tandis que la page Admin Positions affiche bien mon erreur.

  52. bonjour et merci pour votre module
    j’ai suivis toutes les instructions mais après sauvegarde je rentre dans la fiche produit et le champs wizwig est vide ?
    d’autre part j’aimerai en fait pouvoir renter un code html dans le champs wizwig est il possible de le faire
    Merci d’avance pour votre aide

  53. Bonjour, Tout mes produits ont besoin d’être expliqué avec des détails techniques et autre, et je ne trouve aucun module qui permette d’écrire un paragraphe personnalisé pour chaque produit sur leurs fiches sous les photos. J’ai regarder du coté de mypresta.eu le module “Prestashop HTML Box Pro” ça sert a accrocher des blocs texte n’importe ou sur le site, mais c’est des bloc texte unique qui apparaissent sur toutes les pages qui ont le “hook” ou l’on a accroché le bloc texte. Je n’ai essayé que la version gratuite “Prestashop HTML box” mais avec tout ce que j’ai essayer je suis pas arrivé a créé de champ personnalisé pour mes produits comme le permet votre module “AmProductsField”.
    Vu que vous l’avez devellopé pour PS 1.7, mais sur ma version 1.7.4.2 le multilingue ne fonctionne pas, c’est vraiment domage.
    Est ce que vous pourriez mettre a jour le module pour qu’il fonctionne en multilingue svp ? Je dois démarrer ma boutique sans plus tarder, j’en ai vraiment besoin.
    Énorme merci si vous pouvez solutionner ce problème.

    1. Bonjour,
      Merci pour le commentaire.
      Le module n’est pas encore à jour faute de temps.
      Je posterai un update sur cet article lorsque se sera le cas.
      A bientôt 🙂

  54. Bonsoir Arnaud Merigeau.

    Bonjour,
    Je viens de tester sur PS 1.7.2.0 et il peut y avoir un blocage et dans ce cas, il faut désinstaller le module si possible puis supprimer le dossier module et amproductfields.zip dans le dossier modules.
    Une fois que c’est bon, il faut uploader manuellement le dossier amproductfields dans /modules/ et installer via le back office le module.

    La méthode fonctionne avec Presta 1.7.4.3

  55. Bonjour Arnaud,
    Merci pour ce module.
    Cependant, aprés avoir suivi à la lettre le tuto j’ai le même problème que YOAN.
    Les champs ne s’affichent pas dans le back office après installation.
    Quelle solution SVP / Merci
    Cache supprimé
    version Prestashop 1.7.1.2
    Merci de votre aide.
    Bonne journée
    Sophie

    1. Bonjour,
      Je viens de tester sur PS 1.7.2.0 et il peut y avoir un blocage et dans ce cas, il faut désinstaller le module si possible puis supprimer le dossier module et amproductfields.zip dans le dossier modules.
      Une fois que c’est bon, il faut uploader manuellement le dossier amproductfields dans /modules/ et installer via le back office le module.

  56. C’est pour des champs simples, une idée de comment faire pour ajouter un select multiple ?
    Doc inexistante pour la 1.7 ……

    1. Bonjour, non malheureusement lorsqu’on a plusieurs langue d’activées et qu’on a installé le module, effectivement il y a les trois nouveaux champs qui s’affichent sur les fiches produit dans le BO, mais ils ne deviennent pas traduisible. Lorsqu’on change la langue de la fiche produit on a tout les champs natif prestashop de la fiche produit qui changent mais pas les deux derniers champs du module AMProductfield. Vu sur presta 1.7.4.2 et 1.7.4.3
      Ce serait bie nd’en faire un module traditionnel qu’on installe par glisser/déposer dans le BO et qui fonctionne en plusieurs langue.
      Merci pour ce module en tous cas car il n y a pas de module alternatif pour mettre du texte référençable dans la première colonne des fiches produit (sous les photos).

    2. Bonjour Abc,
      Merci pour votre retour.
      Je prends note de votre demande pour voir à développer ce type de module.
      A bientôt !

  57. Bonjour,
    Merci pour ce module.
    Après la mise à jour du fichier j’ai encore le même problème que YOAN. Les champs ne s’affichent pas dans le back office après installation..
    Merci.

    1. Bonjour Bou,
      Merci pour votre message.
      Il faut bien utiliser la dernière version du module via le lien dans l’article.
      Aussi, quelle est votre version de PrestaShop ?

    2. Merci de votre réponse.
      La version que j’utilise est la version 1.7.1.2
      Le problème vient peut-être de là…
      Merci

    3. Bonjour,
      Je reviens un peu tardivement avec le même problème. Je n’arrive pas à faire apparaître les champs dans le back office sur un serveur distant (tout marche en local). La version prestashop que j’utilise est la version 1.7.1.2.
      Avez-vous des idées sur ce problème ?
      Cordialement,
      Matthias

    4. Bonjour,
      Vérifiez déjà que le module est bien installé, activé et qu’il est présent sur les hooks dans la section positions dans l’admin.
      Si non, réinstallez-le en ligne.
      A bientôt 🙂

  58. Bonjour et merci pour ce tuto. Est-il possible d’ajouter ce nouveau champ à la fenêtre Quickview du produit ? Merci.

    1. Bonjour illucom,
      Merci pour le commentaire,
      Comme c’est indiqué par David, il faut reprendre les variable smarty de la fiche produit et les insérer dans le .tpl souhaité.
      Dans certains cas comme pour la page panier, il faut aussi modifier le controller pour que la requête sur les produits prenne en compte les nouveaux champs 😉

  59. Bonjour Arnaud,
    Ca marche parfaitement en front sur fiche produit, quick-view, miniature etc…! un grand merci Arnaud pour ce tuto.
    J’aurais souhaité également ajouter le nouveau champs sur le récapitulatif du panier, mais en appliquant l’étape 4 du tuto dans cart.tpl, j’ai un message d’erreur :
    ContextErrorException in smarty_internal_templatebase.php(157) : eval()’d code line 696:
    Notice: Undefined index: custom_field
    in smarty_internal_templatebase.php(157) : eval()’d code line 696
    at ErrorHandler->handleError(‘8’, ‘Undefined index: custom_field’, ‘/home/directtrp/www/2017/vendor/prestashop/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()’d code’, ‘696’, array(‘_smarty_tpl’ => object(Smarty_Dev_Template))) in smarty_internal_templatebase.php(157) : eval()’d code line 696
    at content_5b51d82ce143e4_24560705(object(Smarty_Dev_Template)) in smarty_internal_templatebase.php(157) : eval()’d code line 659
    at content_5b51d82ce0aef4_36988028(object(Smarty_Dev_Template)) in smarty_internal_templatebase.php(157) : eval()’d code line 209
    at content_5b51d82ced5474_71490027(object(Smarty_Dev_Template)) in smarty_internal_templatebase.php line 188
    at Smarty_Internal_TemplateBase->fetch(‘checkout/cart.tpl’, null, ‘layouts/layout-full-width.tpl’, object(SmartyDev), false, true, false) in SmartyDev.php line 41
    at SmartyDev->fetch(‘checkout/cart.tpl’, null, ‘layouts/layout-full-width.tpl’) in FrontController.php line 660
    at FrontControllerCore->smartyOutputContent(‘checkout/cart.tpl’) in FrontController.php line 644
    at FrontControllerCore->display() in Controller.php line 225
    at ControllerCore->run() in Dispatcher.php line 369
    at DispatcherCore->dispatch() in index.php line 28
    cart.tpl est il gérer différemment que product.tpl?
    Merci pour tes lumières!
    David

    1. Bonjour David,
      Merci pour le commentaire,
      Je viens de mettre à jour l’article avec une section dédiée à l’affichage des champs sur la page panier.
      J’espère que ça vous aidera 😉

  60. Suite à ma demande de ce jour 17 juillet a 10h58, j’ai réussi à trouver ce qu’il fallait faire. Il faut que dans la table CATEGORY PRODUCT, une ligne correspondant au nouveau produit créé figure. Exemple le nouvel id product est 5, il faut une nouvelle ligne comprenant l’ID de la category choisie, l’ID product qui sera donc 5 et la position qui sera implémentée de 1 par rapport au produit qui précedait.
    Après les autres tables PRODUCT, PRODUCT LANG, PRODUCT SHOP, STOCK AVAILABLE et STOCK MVT, si elles sont correctement remplies, le nouveau produit apparait aux yeux de tous dans le front office.
    Cordialement
    Edmond

  61. Bonjour, Je me permets ce message parce que j’ai besoin, pour diverses raisons, non pas de créer les produits par le back office de prestashop mais par les tables mysql. Je travaille sous prestashop 1,7,4,0. J’ai ajouté une table mysql à la base de données prestashop. Certains éléments de cette table vont aller « alimenter » les tables existantes de prestashop, de façon à créer dans le bak office d’une part et aussi dans le front office le produit. Pour arriver à un résultat concluant, j’ai donc à partir du back office créer deux produits. J’ai édité les tables PRODUCT, PRODUCT LANG, PRODUCT SHOP, STOCK AVAILABLE et STOCK MVT, qui à mon sens sont les tables qui permettent le travail sur la création d’un produit. J’ai regardé comment s’articulait les ajouts des produits dans les tables en passant par le back office. J’ai aussi avant tout créer les catégories nécessaires. En alimentant ces tables décrites plus haut, par mysql admin dans l’onglet « INSERER » le produit apparaît bien dans la partie back office avec tous les autres produits, mais n’est pas dans le front office. Pourquoi ?
    Merci d’une réponse

    1. Bonjour Edmond,
      Merci pour votre commentaire,
      Si le produit apparait bien dans l’admin, je pense qu’il doit tout simplement y avoir une valeur à 0 sur le champ “active” ou différent de both pour le champ “visibility”.
      C’est de ce côté là qu’il faut regarder à mon avis.
      Bonnes recherches et pensez à partager votre solution pour les autres 😉

    1. Bonjour,
      Vous avez l’info dans le fichier php du module dans la fonction install tout simplement avec la liste des hooks.
      A bientôt 🙂

  62. merci pour le précieux module fonctionne parfaitement sur certaines parties mais j’ai besoin d’aide car je ne sais pas comment faire et je ne suis pas un programmeur.
    J’ai utilisé le champ supplémentaire pour remplacer le nom du produit, le nom n’apparaît pas ici:
    – lors de l’achat du produit ajouté au panier
    – barre de recherche, recherche par nom de produit et non par champ personnalisé
    – section ci-dessous le produit: “vous pourriez l’aimer aussi” (je pense que c’est crosselling)
    J’ai de sérieux ennuis, pourriez-vous m’aider rapidement? Je suis sur le point de publier et je suis toujours.
    Merci beaucoup d’avance!
    ver prestashop 1.7.2.4

    1. Bonjour Gianluca,
      Merci pour le commentaire,
      En fait il faut suivre le tuto car le module permet d’enregistrer en base de données les informations supplémentaires du produit.
      Il faut ensuite les afficher et pour cela, il faut placer les variables, c’est l’étape 4 du tuto 😉

  63. Bonjour,
    Merci pour ce module il fonctionne très bien 🙂
    Cependant, je ne peux pas traduire les champs, les valeurs dans les champs restent les mêmes pour toutes les langues, y a-t-il une procédure pour activer cette fonctionnalité ?
    Merci d’avance pour votre aide 🙂

    1. Bonjour,
      Merci pour votre commentaire.
      Par défaut, un seul champ est traduisible dans ce module, vous pouvez donc l’utiliser en multilingue sans problème.
      Vous pouvez aussi dupliquer ce champ et son fonctionnement dans le module si besoin 🙂

  64. Merci beaucoup pour les instructions très pratiques ! J’ai essayé de transférer la méthode aux ps-marques.. Malheureusement, il ne fonctionne pas et la documentation de PrestaShop ne contient aucune aide. Est-ce que quelqu’un a déjà réussi à ajouter son propre champ de marque à PrestaShop 1.7 ?
    Pardonnez mon français insuffisant !

    1. Bonjour Gabriel,
      Merci pour le commentaire,
      Non je n’ai pas encore pris le temps de faire un tuto sur ce sujet mais je le note 🙂
      A bientôt !

  65. Hello!
    Thanks for this tutorial. I followed your steps and got my field on the right place … but: the values are not saved to the database? On refresh the values are gone .. do you have any idea?
    kind regards,

    1. Hi Andre,
      I have notice to Yoann (first comment) that the post and the download link is modified and working right now.
      You can download it now and tell me here if all is okay 😉
      Regards

  66. Bonsoir,
    J’ai installé votre module et j’ai fait exactement ce que vous avez décrit. Tout fonctionne parfaitement.
    Je vois les trois champs que vous avez créé. J’ai essayé de modifier le fichier product.php ainsi que le fichier .tpl afin de mettre à la place de vos champs un simple champ texte que j’ai nommé “modele”.
    Il ne se passe rien. J’ai supprime le fichier de cache mais ça ne change rien. Seuls vos trois champs s’affichent. De plus, j’ai essayé d’entrer des données dans ces champs et de les enregistrer et lorsque je reviens sur la fichie produit, ces champs sont vide. Qu’est-ce que je n’ai pas compris dans votre explication? Comment modifier les fichiers afin de changer les champs que vous avez mis par défaut en y mettant ceux que je désire? Merci.

    1. Bonjour Antoine,
      J’ai modifié l’article avec le lien de téléchargement du module PrestaShop corrigé. J’ai répondu à Yoann avec le souci en question
      Bon téléchargement et n’hésitez pas à faire un retour si c’est bon 😉
      A très vite

  67. Hello, nice tutorial, it works!
    How can the custom field be added to faceted search filter block?
    thanks

    1. Hi,
      Hum it’s possible but it’s an another deep work 😉
      You can send me an email to work on it.
      Regards

  68. Bonjour,
    Merci pour d’avoir partagé, c’est super.
    J’ai le même problème que yoann, si la solution a été trouver je suis preneur.
    Merci d’avance

  69. Bonjour, merci pour tout ce boulot et de le partager. J’ai le même souci que YOANN, si tu as trouvé la solution pour lui peux tu m’aider à mon tour. Merci beaucoup.

    1. Bonjour eric,
      Je viens de modifier l’article avec le lien du module corrigé. J’ai répondu à Yoann avec le problème qui se produisait également.
      Bon téléchargement 🙂
      A très vite

  70. Bonjour,
    J’utilise la version 1.7.1.2, je peux la mettre à jours si besoin.
    La case désactiver toutes les surcharges est bien sur non
    https://i.imgur.com/MUySgt2.png
    En regardant votre premier imprime écran, vous n’avez pas la partie ” ajouter une caractéristique, marque ou produit” sous le résumé. J’ai peut etre un conflit de module.

    1. Bonjour Yoann,
      Je viens de tester sur une 1.7.1.2 et je n’ai aucun problème.
      Si vous le souhaitez, je peux regarder : contactez-moi par e-mail 😉

    2. Bonjour Yoann,
      J’ai fais quelques recherches et le module enregistrait bien les informations dans la base de données mais il ne les affichait pas dans le back office une fois sauvegardées.
      C’est corrigé et le lien de téléchargement est à jour dans l’article.
      J’ai testé sur PrestaShop 1.7.3.0 et c’est fonctionnel.
      Bon téléchargement et pensez à laisser un avis sur le sujet 😉
      A très vite

  71. Merci pour votre réponse, j’ai bien supprimer le class_index.php ( cf imprime écran ci dessus ), j’ai essayer de tout supprimer ou de recrée le cache.
    J’ai essayer de réinstaller plusieurs fois le module, pourtant il semble actif.
    Il y a une subtilité que je n’ai pas compris, pourtant la précédure est trés bien écrite !

    1. Bonjour Yoann,
      Dans l’admin de PrestaShop > Paramètres avancés > Performances, il faut que l’option “Désactiver toutes les surcharges” soit sur “non” aussi.
      Quelle est la version de PS ?

  72. Bonjour,
    Avant tout pour votre travail, il correspond exactement a ce que je souhaite faire !
    J’ai néanmoins un soucis, aprés l’installation et la suppression du fichier cache, l’inteface admin du produit n’est pas modifiée. J’ai bien votre module dans l’onglet modules sur la fiche produit mais aucun champs.
    Auriez vous une idée ?
    https://i.imgur.com/unDJImh.png
    Cordialement,

    1. Bonjour Yoann,
      Avec plaisir 🙂 Avez-vous bien supprimé le fichier de cache suivant : www/app/cache/prod/class_index.php ?
      Bonne journée.

Laisser un avis

Consultez les autres articles