Comment ajouter un nouveau champ sur la fiche produit et dans le back-office Prestashop ?

24 juin 2011 | publié par Webbax

Allez, juste pour le plaisir on va se tenter à l’expérience ! Voilà un genre de demande qui peut survenir de la part d’un client, par exemple il désire avoir un nouveau champ « traduisible » dans sa fiche produit pour ajouter des informations complémentaires. Mais comment s’y prendre pour ajouter ce nouveau champ ?

But de l’opération
L’idée est donc d’ajouter un nouveau champ « traduisible » dans le back-office de la boutique, afin que celui-ci soit administrable et qu’on puisse bien sûr l’afficher sur la partie publique. Allez, comme on aime prendre des risques, on veut aussi qu’on puisse modifier le contenu du champ avec un éditeur HTML avancé, le challenge est lancé, c’est parti !

Les fichiers sources
Télécharger les fichiers sources modifiés

1) La base de données
On exécute un petit script dans phpMyadmin sur la table multilingue des produits pour ajouter un nouveau champ qui s’appellera « information ».

ALTER TABLE `ps_product_lang` ADD `information` LONGTEXT NOT NULL AFTER `description_short`

2) La classe Product.php
Bon, le problème est le suivant, on veut modifier le comportement de la classe Product.php, mais on aimerait pas tout faire exploser, comme on est en version 1.4, on va copier le fichier « /classes/Product.php » sous « /override/classes/Product.php » ensuite on va modifier le début du fichier afin de l’étendre à la classe par défaut :

class ProductCore extends ObjectModel

devient

class Product extends ProductCore

La logique est ensuite de trouver un champ « similaire » à celui qu’on veut ajouter afin de localiser tous les emplacements de code à modifier. Dans notre cas on va faire une recherche dans le fichier sur « description_short » qui est similaire au champ que je veux ajouter.

J’ajoute mon champ dans les champs de langues à valider (env. ligne 250)

protected $fieldsValidateLang = array(
		'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName',
		'meta_title' => 'isGenericName', 'link_rewrite' => 'isLinkRewrite', 'name' => 'isCatalogName',
		'description' => 'isString', 'description_short' => 'isString', 'information' => 'isString', 'available_now' => 'isGenericName', 'available_later' => 'IsGenericName');

Ensuite dans la fonction « getTranslationsFieldsChild » (env. ligne 384) j’ajoute aussi le champ.

	$fields[$language['id_lang']]['description_short'] = (isset($this->description_short[$language['id_lang']])) ? pSQL($this->description_short[$language['id_lang']], true) : '';
        $fields[$language['id_lang']]['information'] = (isset($this->information[$language['id_lang']])) ? pSQL($this->information[$language['id_lang']], true) : '';

Ensuite dans la fonction « getDefaultCategoryProducts » (env. ligne 823) j’ajoute le champ « information » dans le SELECT

		$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
		SELECT p.`id_product`, pl.`description_short`set, pl.`information` , pl.`link_rewrite`, pl.`name`, i.`id_image`
		FROM `'._DB_PREFIX_.'category_product` cp
		LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = cp.id_product)
		LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`)
		LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)
		WHERE cp.id_category = ' . (int)($this->id_category_default) . '
		AND id_lang = ' . (int)($idLang) . '
		AND p.`active` = 1
		AND i.`cover` = 1
		'. (is_null($limit) ? '' : ' LIMIT 0 , ' . (int)($limit)));

Ensuite dans la fonction « getNewProducts » (env ligne 1368) j’ajoute le champ « information » dans le SELECT

$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
		SELECT p.*, pl.`description`, pl.`description_short`,pl.`information`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`,
			i.`id_image`, il.`legend`, t.`rate`, m.`name` AS manufacturer_name, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new,
			(p.`price` * ((100 + (t.`rate`))/100)) AS orderprice, pa.id_product_attribute
		FROM `'._DB_PREFIX_.'product` p
		LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).')
		LEFT OUTER JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND `default_on` = 1)
		LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
		LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group`
		   AND tr.`id_country` = '.(int)Country::getDefaultCountryId().'
		   AND tr.`id_state` = 0)
	    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
		LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
		WHERE p.`active` = 1
		AND DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0
		AND p.`id_product` IN (
			SELECT cp.`id_product`
			FROM `'._DB_PREFIX_.'category_group` cg
			LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
			WHERE cg.`id_group` '.$sqlGroups.'
		)
		ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).'
		LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts));

Ensuite dans la fonction « getRandomSpecial » (env ligne 1451) j’ajoute le champ « information » dans le SELECT

$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
		SELECT p.*, pl.`description`, pl.`description_short`,pl.`information`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`,  p.`upc`,
			i.`id_image`, il.`legend`, t.`rate`
		FROM `'._DB_PREFIX_.'product` p
		LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
		LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group`
		                                           AND tr.`id_country` = '.(int)Country::getDefaultCountryId().'
	                                           	   AND tr.`id_state` = 0)
	    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
		WHERE p.id_product = '.(int)$id_product);

Ensuite dans la fonction « getPricesDrop » (env ligne 1514) j’ajoute le champ « information » dans le SELECT

$sql = '
		SELECT p.*, pl.`description`, pl.`description_short`, pl.`information`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`,
		pl.`name`, p.`ean13`, p.`upc`, i.`id_image`, il.`legend`, t.`rate`, m.`name` AS manufacturer_name,
		DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new
		FROM `'._DB_PREFIX_.'product` p
		LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
		LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group`
		                                           AND tr.`id_country` = '.(int)Country::getDefaultCountryId().'
	                                           	   AND tr.`id_state` = 0)
	    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
		LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
		WHERE 1
		AND p.`active` = 1
		AND p.`show_price` = 1
		'.((!$beginning AND !$ending) ? ' AND p.`id_product` IN ('.((is_array($ids_product) AND sizeof($ids_product)) ? implode(', ', $ids_product) : 0).')' : '').'
		AND p.`id_product` IN (
			SELECT cp.`id_product`
			FROM `'._DB_PREFIX_.'category_group` cg
			LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
			WHERE cg.`id_group` '.$sqlGroups.'
		)
		ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'`'.' '.pSQL($orderWay).'
		LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts);

Ensuite dans la fonction « getAccessories » (env ligne 2207) j’ajoute le champ « information » dans le SELECT

$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
		SELECT p.*, pl.`description`, pl.`description_short`,pl.`information`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`,
		i.`id_image`, il.`legend`, t.`rate`, m.`name` as manufacturer_name, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(),
		INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new
		FROM `'._DB_PREFIX_.'accessory`
		LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = `id_product_2`
		LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
		LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).')
		LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (p.`id_manufacturer`= m.`id_manufacturer`)
		LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group`
		                                           AND tr.`id_country` = '.(int)Country::getDefaultCountryId().'
	                                           	   AND tr.`id_state` = 0)
	    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
		WHERE `id_product_1` = '.(int)($this->id).'
		'.($active ? 'AND p.`active` = 1' : ''));

A présent on va déclarer une nouvelle variable « information » dans notre fichier, en dessous de « $description_sort » (vers la ligne 68).

	/** @var string Short description */
	public 		$description_short;

        /* new field */
        public          $information;

Et pour finir on supprime aussi la fonction « __construct » et tout son contenu

	public	function __construct($id_product = NULL, $full = false, $id_lang = NULL)
	{
		global $cart;

		parent::__construct($id_product, $id_lang);
		if ($full AND $this->id)
		{
			$this->tax_name = 'deprecated'; // The applicable tax may be BOTH the product one AND the state one (moreover this variable is some deadcode)
			$this->manufacturer_name = Manufacturer::getNameById((int)$this->id_manufacturer);
			$this->supplier_name = Supplier::getNameById((int)$this->id_supplier);
			self::$_tax_rules_group[$this->id] = $this->id_tax_rules_group;
			if (is_object($cart) AND $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')} != NULL)
				$this->tax_rate = Tax::getProductTaxRate($this->id, $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
			else
				$this->tax_rate = Tax::getProductTaxRate($this->id, NULL);
			$this->new = $this->isNew();
			$this->price = Product::getPriceStatic((int)($this->id), false, NULL, 6, NULL, false, true, 1, false, NULL, NULL, NULL, $this->specificPrice);
			$this->unit_price = ($this->unit_price_ratio != 0  ? $this->price / $this->unit_price_ratio : 0);
			if ($this->id)
				$this->tags = Tag::getProductTags((int)$this->id);
		}

		if ($this->id_category_default)
			$this->category = Category::getLinkRewrite((int)$this->id_category_default, (int)$id_lang);
	}

Voilà notre classe est prête, forcément on pourrait l’optimiser en laissant « que » les variable utiles et en « overridant » uniquement les fonctions concernées, mais pour des raisons pratiques on va laisser la classe comme ceci.

3) Le formulaire
Voilà, notre but à présent c’est de faire afficher un champ au formulaire et pour y arriver on va modifier le fichier « /repertoire_admin/tabs/AdminProducts.php ». Le fichier est énorme ? Il vous fait peur ? C’est normal c’est un spaghetti géant ! On recherche sur les termes « description_short » et ça va nous conduire vers la ligne 2769.

Et là juste après le « </tr> » de notre textarea « description_short » on injecte notre champ sur le même principe, on fait juste de changer le nommage avec « information »

           echo '
                <tr>
                    <td class="col-left">'.$this->l('Information:').'</td>
                    <td style="padding-bottom:5px;" class="translatable">';
                    foreach ($this->_languages as $language)
                        echo '<div class="lang_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $this->_defaultFormLanguage ? 'block' : 'none').';float: left;">
                                    <textarea class="rte" cols="100" rows="20" id="information_'.$language['id_lang'].'" name="information_'.$language['id_lang'].'">'.htmlentities(stripslashes($this->getFieldValue($obj, 'information', $language['id_lang'])), ENT_COMPAT, 'UTF-8').'</textarea>
                               </div>';
                    echo '</td>
		</tr>';

4) La fiche produit
Si on a fait tout ce travail, c’est bien pour faire afficher ce contenu quelque part :D , bon prenons à présent le fichier « /themes/prestashop/product.tpl »

Vers la ligne 210 du fichier « product.tpl » on ajoute ceci

       <div id="information" style="border: 1px solid #D0D3D8;margin-bottom:20px;background:#E5E6E7;">
                    {if !empty($product->information)}
                        {$product->information}
                    {/if}
                </div>

5) Résultat
Affichons à présent la page produit (pensez à désactiver le cache dans le back-office, si vous ne voyez pas de changement).

Voilà le nouveau champ qui affiche son contenu.

Et le voilà administrable dans le back-office.



Bilan

Et oui, tout ça pour faire afficher un champ multilingue ? Effectivement c’est un peu long, peut-être un peu bordélique aussi, mais ça fonctionne très bien. On regrette un peu que dans le back-office, la modification soit aussi « brouillonne », on triffouille 3000 lignes de codes censées afficher un onglet et parfois ça tient du miracle que tout ce méli-mélo fonctionne (je suis un peu mauvaise langue ^^). Mais voilà vous avez compris le principe, vous pouvez répéter cette méthode pour d’autres fonctionnalités, le principe reste le même.

Encore un peu de lecture ? Je te conseille...
Webbax est une entreprise suisse basée en Valais qui concentre son intérêt sur le e-commerce, le développement web... mais aussi le marketing déjanté. Mon activité est une véritable passion qu'il me fait plaisir de partager au travers de mon blog.
Ambiance cool et bonne humeur... voilà la devise du succès !

63 commentaires pour "Comment ajouter un nouveau champ sur la fiche produit et dans le back-office Prestashop ?"

  1. Oh mon gars (si je peux me permettre ;_),
    alors CA c’est du lourd , j’ai cherche ca pendant tellement longtemps… que j’avais abandonne…
    c’est une recherche concernant un autre probleme qui m’a amene vers votre article.
    ENORME!
    felicitation, y a du niveau, serieux

    MERCI

  2. Bonsoir,
    En cherchant « tout à fait autre chose », je tombe sur cette fiche qui m’approche de ma solution… Merci…
    J’imagine que pour ajouter ce(s) champ(s) « libre(s) » en onglet, il me « suffira » de modifier product.tpl dans la partie

    Je n’y suis pas encore, mais au moins, vous m’avez ouvert des portes… et un peu d’espoir… ;-)

    Sincerely
    DJM

  3. Petit suivi : ça a super bien marché…
    Effectivement, je conseille de ne laisser dans le fichier placé en override que les instructions modifiées…
    Sincerely
    DJM

  4. Merci beaucoup c’est exactement ce dont j’avais besoin

  5. j’ai appliqué ces modifications, je clique sur catégories en admin et j’ai l’erreur : Fatal error: Class ‘ProductCore’ not found in C:\Program Files\EasyPHP5.2.10\www\naishprocenterleucate\classes\Product.php on line 32
    Soit erreur sur la première modification demandée, j’ai essayé de remettre la ligne initiale, mais j’ai alors l’erreur suivante :
    Fatal error: Cannot redeclare class ProductCore in C:\Program Files\EasyPHP5.2.10\www\naishprocenterleucate\override\classes\Product.php on line 3370
    Merci de votre aide,
    Agnès BH

  6. Autant pour moi en effet, j’avais enregistré le fichier product.php du dossier classes dans override/classes mais au lieu de modifier ce dernier, j’avais modifier celui d’origine, soit celui qui est dans le dossier classes initial d’où mon erreur.
    Merci beaucoup de votre aide et pour ces supers explication qui m’ont beaucoup simplifié la vie.
    Merci encore

  7. Merci pour ce tutoriel, j’aimerais savoir comment on peut créer un champs non traduisible en sauvegardons la valeur dans la table ps_pack.

    mon but c’est d’ajouter un bouton ‘checkbox’ à coté de chaque produit d’un pack (cette valeur concerne un produit X dans le pack)

    Merci.

  8. Super tuto merci !

    Je l’ai utilisé pour ajouter un onglet dans mes fiches produits.

    Comme mentionné plus haut il vaut mieux garder que les parties de code modifiées dans l’override. (j’avais une erreur de champs déclarés 2 fois – ligne 28 et 29)

    Ce n’est pas le sujet mais il ne me reste plus qu’a trouver comment pointer directement avec un bouton (dans le résumé produit) sur l’onglet que j’ai ajouté dans ma fiche produit.

  9. Merci pour ce super tuto !
    j’ai réussis et tout fonctionne :)

    Petite question également à @cybearDJM
    comment faire pour changer le fichier product.tpl pour afficher en onglet les infos indiquées ?
    Merci,

  10. Bonjour,

    Super méthode qui à fonctionné pour moi aussi.
    Néanmoins, je ne peux plus cliquer sur l’icône d’ajout d’une image, car lorsque je clique dessus et que je souhaite consulter l’arborescence de mon site pour sélectionner une image que j’aurais préalablement mise sur mon serveur alors je tombe sur mon site.

    A la place d’avoir l’arborescence du site, j’ai dans la fenêtre popup mon site avec une erreur page inexistante.

    Que dois je faire pour rétablir l’accès à l’arborescence ?
    Je peux fournir des images par mail si besoin

  11. Bonjour,

    Tuto très intéressant. Est-ce qu’il y aurait beaucoup de modifications à faire pour ajouter un upload d’image à la place d’un bloc texte?

    Merci

  12. Excellent tuto, c’est effectivement efficace, par contre je ne suis pas convaincu que ce la méthode la plus recommandée en terme de maintenance.
    Que se passe t il en cas de mis a jour de la vesrion de prestashop ? Il doit y avoir un moyen pour overider et de ne mettre en avant que le nouveau champ créé non ?
    Qu’en pensez vous ?

    • Bonjour,
      Pour le moment on ne peut pas le faire sur Prestashop 1.4, par contre en version 1.5 de Prestashop, l’override du back-office est prévu.

      • Bonjour (et bravo pour le tuto),

        sympa le système d’override pour faciliter la mise à jour de la version de Prestashop, mais qu’en est-il quand on modifie la structure de la base de données et non uniquement une classe ?

        Si l’on ajoute/modifie/supprime plusieurs champs de la base de données, la mise à jour de la version impossible sera impossible non ?

        • La base de données reste un point délicat, mais en principe dans la logique on ajoute des champs supplémentaires donc cela n’affecte pas le fonctionnement par défaut.
          Modifier le nom des champs existants voir les supprimer, serait une prise de risques importante qui affecterait le fonctionnement standard de Prestashop.

          • ah d’accord, donc ajouter des champs dans la BD ne pose pas de problème à la mise à jour ?
            mais quid dans le cas d’une mise à jour importante qui changerait elle-même la structure de certaines tables ?

            ça me paraît risqué tout de même

  13. Bonjour, ce tutoriel m’a bien aidé seulement à la place de mettre un champ d’écriture je voudrais mettre un champ « input » de type « radio » que dois-je écrire dans le fichier « /repertoire_admin/tabs/AdminProducts.php » ?
    La valeur de « information » serait alors l’un des choix cocher par l’utilisateur.

    Merci.

  14. Comment faire pour que ce nouveau champs soit lié aux attributs ?

    (comme, par exemple, UPC ou référencement qui se met « à jour » en fonction des attributs sélectionnés)

    Merci beaucoup pour ce tutorial !

  15. Bonjour,

    Merci pour ce tutorial très pratique!
    Comment faire pour rajouter ce champ dans le module home featured? Rien ne s’affiche si je rajoute le div de la page product…

    Merci de votre réponse

  16. Bonjour,

    j’ai suivi la méthode pour ajouter un champ de A à Z, mais je rencontre un problème, quand je rempli le champ dans le produit. le texte ne s’affiche pas.

    Comment faire?

    merci

  17. Bonjour,

    Voilà, dans quelques jours je pense créer un champ personnalisé dans prestashop mais, je me demandais si ce changement allait rester dans le futur, même après la mise à jour de prestashop ?

    Merci d’avance de ta réponse Webbax. Cela m’éclaira.

  18. Bonjour,

    Merci pour ce tutoriel très bien expliqué et accessible.
    Je rencontre cependant un problème malgré le fait que j’ai scrupuleusement suivi toutes les étapes, une fois l’intégralité des fichiers uploadés, mon site renvoie une erreur 500. Une idée ? Je suis sur la version 1.4.7 de PrestaShop.

    Merci pour votre réponse

  19. Bonjour,

    Merci pour ce tuto bien détaillé et qui remplit son rôle :-)

    Il est évidemment regrettable d’avoir à modifier à la bourrin des fichiers dispatchés un peu partout : étendre une class de 3000 lignes, un form html codé en string php, modifier directement la bdd…

    Ce qui m’amène à cette question : quels sont les avantages de cette méthode par rapport à un simple recours aux « features » natives que l’on trouve dans la partie « catalog » du backend ?

    Merci pour ta réponse,
    Kat

    • On va dire qu’il y a aussi un aspect « pratique » pour le client final. Se promener dans l’onglet « Personnalisation » est moins pertinent que par exemple dans l’onglet « Info », qui est utilisé au quotidien. Cela dépend bien sûr du client et de ses exigences, utiliser les champs personnalisables, permet bien sûr de conserver la souplesse native de l’outil sur le long terme.

  20. Bonjour
    Et bravo pour ce tuto, c’est tout a fait ce dont j’avais besoin.

    Je le teste de suite

  21. Bonjour,
    bravo ca marche Nickel!
    par contre dommage que les nouveaux ajoutés fraichement n’apparaissent pas dans le BackOffice dans l’outil d’import CSV (produits), parmi les champs disponibles, on ne retrouve pas ce que l’on vient de creer.
    Si vous avez une piste pour ca, je suis preneur, ca serait pratique pour ajouter une info par produit sur des catalogues avec des centaines de références.
    salutations

  22. Bonjour,

    Avez-vous testé sur une version 1.5?

    Je suis en train d’essayer d’ajouter des champs mais je bloque. Les champs multilingues sont bien enregistrés mais impossible d’enregistrer un simple champ texte :/

    • Bonjour,

      Je n’ai pas encore essayé, mais vous pouvez rechercher un autre champ similaire (déjà par défaut), pour vérifier à chaque endroit du code où celui-ci est appelé.

  23. Bonjour, je cherche désespérément à intégrer des nouveaux champs dans la partie déclinaison d’un produit, est ce sur le même principe que celui ci ?

    Je vous remercie par avance de votre réponse.

  24. bonjour ,
    deja merci pour le tuto il fonctionne trés bien

    je me demandé si quelqu’un a pensé a jouter un datepicker au champs text merci

    ps: si oui existe t’il un tuto

  25. Bonjour,

    J’ai un petit pb avec ce tuto. La mise en place des champs ne posent pas de pb, mais le texte rentré dans ce nouveau champs n’est pas enregistré. A chaque sauvegarde du produit, le champ « information » s’efface. Est-ce dû à la version 1.4.8.2 de Prestashop ??
    Cordialement,

  26. C pile poil le tuto qu’il me fallait.
    Mais je me demande juste s’il faut vraiment tout recopier dans le override du controleur Product, car du coup ça me parait assez complexe, juste pour ajouter un petit champ ?
    Merci !

  27. Bonjour,
    Je me permet de remonter ma question de 13/06, à savoir que les informations renseignées dans les fiches produits dans ce nouveaux champs créé ne s’enregistre pas dans mon cas. A chaque validation, le champs s’efface.
    Quelqu’un pourrait me donner un petit coup de main ??
    Merci d’avance !

  28. Déjà merci pro ce tuto !! Sa m’intéresse beaucoup ! Par contre je rencontre un problème récurant et je voulais savoir si quelqu’un l’avais déjà eu aussi.. Après avoir fait toutes les manip, il apparait alors le mot Array alors que dans le back-office j’ai le champs pour mettre le texte que je veux !!
    Quelqu’un à t’il une idée ?
    Merci !

  29. Bonjour,

    Merci pour ce super tuto !!!

    Je souhaite pour ma part, ajouter un champ « colisage » (champ numérique non traduisible). J’ai quelques difficultés à le mettre en place. Comment dois-je procéder. Dois-je suivre la même procédure ?

    Merci d’avance pour votre aide !

    • Concernant la question de DAN et DOUBLE, j’ai trouvé la solution si la question est toujours d’actualité…
      Voila ce qu’il faut modifier dans dossier-admin/tabs/AdminProducts.php
      vers la ligne 2190 dans mon cas pour insérer le nouveau champs entre Nom produit et référence

      Moi je l’ai fait pour un champ name2 en tant que sous titre de mon ‘name’ principal :

      echo ‘

      ‘.$this->l(‘Sous Titre:’).’
      ‘;
      foreach ($this->_languages as $language)
      echo ‘_defaultFormLanguage ? ‘block’ : ‘none’).’;float: left; »>
      getFieldValue($obj, ‘name2′, $language['id_lang'])), ENT_COMPAT, ‘UTF-8′).’ » />
      ‘;
      echo ‘
      ‘;

      ;)

  30. Bonjour,
    Merci pour ce tuto bien fait et bien utile.
    J’ai compilé ce dernier avec celui d’un autre blog pour ajouter un champ name2 afin de m’en servir de ‘sous titre’ pour mes produits.
    L’insertion des données en base et admin : ok !
    L’affichage dans product.tpl : ok !
    Par contre je souhaiterai le faire également afficher dans product-list.tpl mais là ! il me le prends pas en compte.
    Est ce qu’il y a une autre classe à modifier pour cela ?
    J’ai beau chercher je ne trouve pas la solution.
    Donc si quelqu’un à la réponse; je suis preneur.

    Merci ;)

    presta 1.4.3

  31. You have to delete the __construct function.

  32. Bonjour,
    moi j’ai un problème. Dès la première ligne j’ai une erreur.
    En faisant toutes les étapes décrites, j’obtiens dans mon BO:

    le champ information (Français (French)) est invalide

    que faire? s’il vous plait pouvez-vous m’éclairer?

  33. Tout cela pour afficher deux lettres !!!!!!!
    Vraiment, à quoi bon ce prestashop !!!! ?

  34. Hi,

    thanks for the tut, but it’s not working for me. The Back Office is fine, I have the text editor and everything, but nothing on the Front Office…

    I did the MySQL query and copied all the files you gave us here… any advise? please…

  35. Bonjour,
    Pour prestashop 1.5.1 une proposition de la modification est prévu…??

    Merci beaucoup pour ce Tips! superbe!!

  36. Bonjour, je veux un 3 eme éditeur de texte, faut-il seulement télécharger le pack fichier a modifier et les modifier dans les dossiers qui correspondent ou bien il y a d’autres modification a prévoir pour le fonctionnement.?

    cordialement

    M.Ketroussi

  37. bonjour,

    merci pour les infos,
    J’aimerais dans les fiches produits rajouter 4 sous catégories infos « à la place de en savoir plus », cliquable.

    1-COMPOSITION
    2-CONSEIL D’UTILI
    3-EN SAVOIR+
    4-MARQUES

    Trop de textes techniques à mettre dans le BO.
    Dans ce cas dans le BO je ne fournirais pas « résumé » et « description »

    Est-ce que ce que vous décrivez me permettra de réaliser ceci ?
    si je pouvais avoir une réponse ça m’aiderait beaucoup
    merci

    • Bonjour,

      Tout est possible… maintenant dans le cas présent je ne suis pas vraiment sûr d’avoir bien compris.

      La première chose à noter c’est que si vous utilisez Prestashop 1.5, il faudra effectuer un override du back-office… du coup vous pouvez oublier cette méthode (valable pour Prestashop 1.4 uniquement).

      Il faut savoir aussi que le résumé du produit est normalement utilisé ensuite pour les moteurs de recherche… du coup s’il est vide… cela sera peut-être moins pertinent.

  38. Bonjour

    j’adore ce petit tuto bravo

    je voudrais savoir s’il est possible de mettre un champs au lieu ce produit est SPECIAL mais Tarif membre XX euro ( il calcul le tarif ttc – la remise en % )

    merci d’avance

    • Bonjour,

      Cette technique a été démontrée pour un cas précis sous Prestashop 1.4

      Pour un autre type de champ, il faut appliquer une logique différente en fonction du besoin, mais je ne peux vous détailler le code, car celui-ci est trop spécifique.

      A travers ce tutoriel, le but était de présenter surtout la manière de procéder pour ajouter un champ… après suivant le type de champ, il faut coder un traitement différent et revoir la logique de chargement des données.

      Merci pour votre visite !

  39. Bonjour à tous,

    peux t-on changer ou ajouter l’attribut « date » dans la personnalisation du back office Prestashop et le retrouver ainsi dans la page produit

    Merci de votre réponse.

    • Bonjour,

      L’ajout ou la modification d’un champ implique un développement sur mesure, cela demande une modification :

      + dans le back-office
      + sur front-office (dans le template)
      + dans la classe concernée
      + dans le modèle de données

      Actuellement sous Prestashop il n’est pas possible d’ajouter des champs à la volée, un nouveau champ implique obligatoirement un développement spécifique.

      Merci pour votre question.

Trackbacks/Pingbacks

Tu veux dire quelque chose ?

Sept + Cinq =

Pour les smileys :    
;) → :D → :P → 8) → 8O → :( → :`( →
:oui: → :hum: → :non: → :ouch: → :rire: →
Pour du code :
    [php]  [/php] ou <code> </code>