[Prestashop 1.5+ | 1.6+] Ajouter un champ pour les catégories et activer l’éditeur

Pour faire suite à l’article précédent « Ajouter un champ zone de texte (textarea) sur la page produit de Prestashop« , voici maintenant la solution (cette fois-ci trouvée par mes soins) pour :

  • Ajouter un nouveau champ (dans cet exemple texte) pour les catégories
  • Activer l’éditeur de texte TinyMCE sur les textareas (zones de texte).

Pour cet exemple, j’ai souhaité ajouter un deuxième champ de description qu’on appellera ici description_2.

 

NOTE : Ce tuto fonctionne pour tous les autres contenus (sauf produits) : pages CMS, magasins, etc. Ils vous suffit d’adapter les classes et controllers à modifier.

 

I ) Modification de la base de données

Pour commencer, connectez-vous à votre base de données et rendez-vous dans la table _PREFIX_category_lang.

Ajoutez un champ « description_2 » de type « Text ».

 

II ) Modification de la classe Category

Rendez-vous dans /override/classes/Category.php et collez-y ce code :

public $description_2;

public static $definition = array(
	'table' => 'category',
	'primary' => 'id_category',
	'multilang' => true,
	'multilang_shop' => true,
	'fields' => array(			
		'nleft' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'nright' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'level_depth' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true),
		'id_parent' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
		'id_shop_default' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
		'is_root_category' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
		'position' => array('type' => self::TYPE_INT),
		'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
		'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),

		// Lang fields
		'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 64),
		'link_rewrite' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 64),
		'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
		'description_2' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),
		'meta_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
		'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
		'meta_keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
	),
);

 

III ) Modification du controlleur administrateur AdminCategoriesController

Copiez les fonctions __construct(), getDescriptionClean() et renderForm() du fichier /controllers/admin/AdminCategoriesController.php.

Les coller dans : /override/controllers/admin/AdminCategoriesController.php.

 

Important : Modifiez la ligne parent::_construct() de la fonction __construct par AdminController::__construct();

 

Nous allons maintenant apporter les modifications nécessaires sur le modèle du champ « Description ».

 

Fonction __construct();

Copiez l’array « Description » (lignes 31 à 37 environ) et coller juste au dessous, en remplaçant tout par description_2:

'description' => array(
	'title' => $this->l('Description'),
	'width' => 500,
	'maxlength' => 90,
	'callback' => 'getDescriptionClean',
	'orderby' => false
),
'description_2' => array(
	'title' => $this->l('Description 2'),
	'width' => 500,
	'maxlength' => 90,
	'callback' => 'getDescription2Clean',
	'orderby' => false
),

 

Fonction getDescriptionClean()

Modifiez cette fonction comme suit :

public static function getDescription2Clean($description)
{
	return strip_tags(stripslashes($description));
}

 

Fonction renderForm()

Localisez le code suivant dans cette fonction :

array(
	'type' => 'textarea',
	'label' => $this->l('Description:'),
	'name' => 'description',
	'lang' => true,
	'rows' => 10,
	'cols' => 100,
	'hint' => $this->l('Invalid characters:').' 
),

Dupliquez-le juste au dessous et remplacez tout les « description » par description_2.

array(

	'type' => 'textarea',
	'label' => $this->l('Description 2:'),
	'name' => 'description_2',
	'lang' => true,
        'autoload_rte' => true,  
	'rows' => 10,
	'cols' => 100,
	'hint' => $this->l('Invalid characters:').' 
),

 

Afin d’activer l’affichage de l’éditeur de texte riche TinyMCE sur ces pages, rajoutez aux champs description et description_2 (toujours dans la fonction renderForm), la ligne suivante :

'autoload_rte' => true,

 

Depuis la version 1.5.5, il faut remplacer la dernière ligne de la fonction (return parent::renderForm();) par return AdminController::renderForm();.

Merci à Kaby et Guillaume qui ont trouvés la solution.

 

IV) Appel dans le template

Pour finir, appelez simplement ce nouveau champ dans /themes/votre_theme/category.tpl comme suit et à l’endroit souhaité :

{$category->description_2}

Voilà, votre nouveau champ texte est créé ! N’hésitez pas à laissez un commentaire ci-dessous si vous rencontrez un problème.

99 commentaires

  1. Paradox a écrit :

    Bonjour , svp , comment on peux faire appel au champ corréspondant afin d’entrer du texte dans le backoffice , et l’afficher dans la page produit par exemple !! Merci d’avance :

  2. Anne a écrit :

    bonjour, merci pour ce tutoriel, cependant moi non plus je n’arrive pas à afficher le champs description 2 dans le back-office. j’ai suivi l’exemple de l’url citée pour afficher un nouveau champ pour les produits, mais je ne trouve pas quel fichier tpl modifier pour les catégories. Pourriez-vous me le préciser ?

    • admin a écrit :

      Bonjour,
      Je ne suis pas sure de comprendre votre problème.
      Vous souhaitez ajouter un champ dans l’interface de gestion des produits ou des catégories ?
      Et l’affiche où ?

      • Anne a écrit :

        je veux rajouter un 2e champs de description pour les catégories, comme votre tutoriel, mais une fois les fichiers modifiés comme indiqué dans ce tuto, lorsque j’édite une catégorie dans le back-office, je n’ai pas ce 2e champs de descritpion qui s’affiche. que faire pour qu’il apparaissent dans le back-office ?

        • admin a écrit :

          Si le champ « description2 » ne s’affiche pas, c’est certainement qu’il y a une erreur dans le nom de votre champ quelque part. C’est l’étape 3 qui permet d’afficher le champ dans le back-office. Pour les catégories, il n’y a pas de fichier .tpl, la construction des champs se fait grâce à ce fichier.
          Revérifiez le nom de votre champ dans chaque étape.

          J’ignore si la compilation a une effet sur la partie admin, mais dans le doute, forcez la.

  3. Pmc a écrit :

    Bonjour,
    avez vous les fichiers ? commeca j’ai juste a les importer ?
    vu que j’ai crée la table.
    dans la version 1.5.4 dans les dossiers
    /override/classes/
    j’ai pas de fichier PHP

    Juste des dossiers.
    en tout cas merci pour votre blog !

    • admin a écrit :

      Bonjour,

      Je suis désolée mais je ne mets pas de fichiers sources à disposition pour plusieurs raisons :
      – les fichiers sont très susceptibles de changer selon les versions de Prestashop
      – un bête copier-coller ne laisse pas la place à la compréhension de la manipulation
      – mes tutos sont particulièrement orientés vers les développeurs. Avec l’apogée des CMS, beaucoup croient pouvoir s’improviser développeur, or il n’en est rien. Pour du sur mesure, il faut s’adresser à des personnes compétentes. Modifier le coeur de Prestashop n’est pas une tâche anodine. Sachez que je suis aussi auto-entrepreneur, je cherche donc évidemment à monnayer mes services.

      Soyez sûr que ceci n’est pas une critique, mais je ne souhaite pas mâcher le travail pour les raisons évoquées ci-dessus.

      Si vous suivez correctement ce tutoriel, nul doute que vous parviendrez à vos fins.

      Pour créer vos fichiers d’override, réferez-vous à la documentation de Prestashop :
      http://doc.prestashop.com/display/PS15/Overriding+default+behaviors

      Sinon, vous pouvez toujours modifier les fichiers de base si vous ne souhaitez pas mettre à jour votre boutique (fortement décommandé).

  4. Elsa a écrit :

    Bonjour et merci beaucoup pour ce tuto c’est exactement ce que je recherchais !
    Mais dommage pour moi, ça ne fonctionne pas 🙁 J’ai la version 1.5.3.1, ça devrait fonctionner en principe non ?

    Peut être que je me suis trompée dans la 1ere partie (je n’y connais pas grand chose en BDD mais voici comment j’ai procédé) :
    dans Phpmyadmin, j’ai sélectionné la table ps_category_lang, j’ai cliqué sur l’onglet « structure » puis « Ajouter 1 colonne en fin de table » :
    – Colonne: description_2
    – Type: TEXT
    Et j’ai sauvegardé..
    J’ai modifié les autres fichiers en conséquence, mais dès que je clique sur catégorie dans le back-office, je tombe sur une page blanche et sur le site aussi.
    Une idée s’il vous plait ?
    Merci d’avance !!

  5. Elsa a écrit :

    Ou alors l’erreur viens de mon fichier /override/classes/Category.php :
    J’ai copié le code en question après le code :
    <?php
    class Category extends CategoryCore
    { }
    qui figurait déjà dans le fichier… A mon avis ça doit être une petite erreur mais je bloque vraiment depuis 1 heure !
    Merci 🙂

    • admin a écrit :

      Bonjour,

      Si vous obtenez une page blanche, c’est qu’il y a une erreur évidemment.
      Pour que je puisse vous aider au mieux, je vous conseille d’afficher les erreurs en allant dans le fichier /config/defines.inc.php et de changer la première ligne : define(‘_PS_MODE_DEV_’, false); par define(‘_PS_MODE_DEV_’, true);

      D’autre part, suite à votre second commentaire, vous devez insérer le code à l’intérieur des accolades.

  6. Elsa a écrit :

    Bon ben ca se complique encore plus puisque j’ai fais la dernière MAJ de Prestashop (1.5.4), et il n’y a plus les fichiers suivants :
    – /override/controllers/admin/AdminCategoriesController.php.
    -/override/classes/Category.php
    Donc je ne peux même plus suivre votre tuto 🙁 Vraiment dommage, j’espère que vous en ferez un autre pour cette nouvelle version !

    • admin a écrit :

      En fait non, le fonctionnement est absolument le même, c’est simplement que pour une raison qui m’échappe, l’équipe de Prestashop a supprimé les fichiers dans la version de base. Il vous suffit de créer dans le dossier /override/classes un fichier Category.php et d’y insérer le contenu que vous avez publié dans votre second commentaire.

  7. Elsa a écrit :

    Merci, j’ai suivi vos recommandations, mais toujours le même échec. Comme Anne plus haut, le deuxième champ ne s’affiche pas dans le back-office, et sur le front-office j’ai l’erreur suivante :
    Notice: Undefined property: Category::$description_2 in D:\wamp\www\site-test\cache\smarty\compile\8b\41\7d\8b417d5485f88e8d9a352d0f413d8c9369711be6.file.category.tpl.php on line 135
    et à la ligne 135 de ce fichier, je retrouve le code suivant : tpl_vars[‘category’]->value->description_2;?>
    Désolé pour tous mes commentaires en tout cas 😀

    • admin a écrit :

      Pas de problème, c’est un plaisir d’aider.
      Rendez-vous dans votre back-office puis dans Paramètres avancés > Performances.
      Passez le cache à « non ».
      Ceci est préférable lorsque vous modifiez votre site (pensez en revanche à réactiver ce cache lorsque vous passez en ligne pour de meilleurs performances).

      Ensuite, il semble que la variable description_2 ne soit pas déclarée.
      Je parle ici du point 2 de ce tutoriel : la ligne public $description_2; semble inexistante, pouvez-vous vérifier ?

  8. Elsa a écrit :

    J’ai bien désactivé le cache. Après vérification, le point 2 a bien été créé et la ligne en question apparait bien :
    <?php
    class Category extends CategoryCore
    {
    public $description_2;
    public static $definition = array( …

    Et comme le fichier Category.php n'existait plus dans /override/classes/ je l'ai créé moi-même.

      • BAKER a écrit :

        Oui quand je modifie directement dans le fichier /controllers/admin/AdminCategoriesController.php et que je rajoute -> ‘autoload_rte’ => true, dans le tableau qui se trouve dans la Fonction renderForm(). Le textarea se mets en éditeur et en ajoutant un deuxième tableau dans la Fonction __construct(); avec biensure l’ajout dans la bdd le nom de la colonne, l’insertion se fait bien et édition aussi.

        Mais votre méthode (override) je pense qu’il ne fonctionne pas sous 1.5.4.1.
        Bon je m’excuse d’avance j’ai pas testé sous une version antérieure.

        Merci quand même pour les tutos ça rend service.

      • BAKER a écrit :

        Je pense que le soucie viens de se fichier /override/classes/Category.php, pendant l’exécution de (public static $definition) ou pendant la déclaration du variable.

        Je mis penche demain dessus pour voir mais peut être que je me gourd aussi lol, mes excuse par avance.

        Meci.

  9. Dimitri a écrit :

    Bonjour,

    Article très intéressant ! Cette astuce est elle applicable pour les versions prestashop précedente la 1.4 ?
    Car je n’ai pas encore fait le grand saut vers la nouvelle version.

    Au plaisir de vous lire,

  10. Just a écrit :

    Bonjour,
    Merci pour votre tuto et surtout pour le partage.
    Je suis sur Prestashop 1.5.4.1 je voulais rajouter un champs text « name_bis » à la table catégorie donc j’ai procédé comme
    1- J’ai Ajoutez un champ « description_2″ de type « Text ». dans la table ps_category_lang
    2- Dans le fichier /override/classes/Category.php que j’ai crée j’ai rajouté le code:
    self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’);
    parent::__construct($id_category, $id_lang, $id_shop);
    }
    }

    3- Dans le fichier /override/controllers/admin/AdminCategoriesController.php que j’ai créé, j’ai adapter les fonctions: __construct(), getDescriptionClean() et renderForm() comme vous l’aviez préconisé.

    Ce qui ne colle plus c’est pour ajouter le champs pour pouvoir les saisir dans le back office. Vous nous aviez conseillé de prendre exemple sur le cas des produits, mais le fichier /overrides/controllers/admin/templates/categories/informations.tpl n’existe pas dans ma version de PS 1.5.4.1.
    S’il vous plait avez-vous une autre alternative.
    Merci encore.

    • admin a écrit :

      Il n’y a pas de fichier .tpl pour les catégories. Les champs sont construits grâce à la fonction renderForm().
      Si cela ne fonctionne pas, c’est que vous avez du faire une erreur quelque part.
      Par ailleurs, pour le point 2, faites exactement comme dans le tuto. J’avais moi aussi essayer de l’écrire comme vous, mais cela ne fonctionnait pas. En le rajoutant en dur comme ceci dans la classe, çà a ensuite fonctionné.

  11. Alexandre a écrit :

    Bonjour Pauline,
    Tout d’ abord merci pour cette excellent tuto qui marche partiellement avec ma version 1.5.5.
    Mon site est en plusieurs langues (anglais et français) et lorsque le champ description est traduit en anglais, le champ description 2 prend automatiquement les données en anglais. Cela ne marche uniquement si le champ description n’ est pas traduit. Quelqu’ un a-t-il une solution ?

    cordialement

    • admin a écrit :

      Bonjour Alexandre,

      Datant de la version 1.5.3, il est fort probable que la méthode décrite dans ce tuto ne soit plus que partiellement correcte, notamment en ce qui concerne le multilingue.
      Je pense investiguer le problème et écrire un nouveau tuto pour la version 1.5.5, étant donné qu’elle semble être stable et durable.

      Je vous encourage cependant à rechercher quel peut être le problème par vous-même, en activant l’affichage des erreurs notamment.

  12. Rodolphe a écrit :

    Bonjour Pauline,

    Merci pour ce tuto qui m’a aidé à avancer mais qui malheureusement ne marche pas totalement pour moi.

    En effet, pour afficher le champ dans le BO de Prestashop, il a fallu que je remplace « return parent::renderForm() » par « return AdminController::renderForm() » dans l’override du fichier AdminCategoriesController.php.

    De plus, maintenant que mon champ s’affiche correctement en BO, la valeur n’est pas sauvegardée en Bdd.

    Aurais-tu une idée ?

    Merci d’avance.

    • admin a écrit :

      Bonjour,

      Comme dit dans le commentaire ci-dessus, ce tuto était optimisé pour la version 1.5.3, et n’est donc certainement plus très adapté à la version 1.5.5.

      En revanche, je ne suis pas certaine qu’il faille modifier le return de la fonction. C’est peut-être là l’erreur. Avez-vous afficher les erreurs ?

  13. Kaby a écrit :

    Bonjour,

    Je pense que ces modifications dans l’override qui sont censées « écraser » la fonction renderForm() du controller originla sont annulées par la ligne finale « return parent::renderForm() » qui reprend la fonction du parent…

    Ainsi il faut « sauter » l’étape du parent de l’override et appeler plutôt « AdminController::renderForm() ».

    Qu’en pensez-vous ?

      • Guillaume a écrit :

        Bonjour,
        Je crois que Kaby à raison parce que à chaque fois pour moi tout était écrasé, je sais pas s’il y a eu une modif de presta.

        Mais pour la 1.5.6.2 vaut mieux remplacer la dernière linge de la fonction

        renderForm par : return AdminController::renderForm();

  14. Oleo Bio a écrit :

    Bonjour, j’ai effectué toutes les modifications mais j’ai un problème.

    Lorsque je remplis la zone de texte « Description 2 : » dans le BO pour une catégorie et que j’enregistre, c’est le contenu de la zone de texte « Description : » qui remplace la « Description 2 : ».

    Quelqu’un pour m’aider ?

    Merci en tout cas pour ce tuto, j’y suis presque !

  15. Sexyfolix a écrit :

    Bonjour,

    Super efficace, merci pour cette petite astuce, cela peut-être vraiment pas mal pour optimiser le référencement d’une boutique PrestaShop, mais également l’expérience utilisateur en optimisant le texte sur les avantages de la catégorie => pleins d’idées finalement.

  16. ReMi a écrit :

    Bonjour et merci beaucoup pour les 2 tutos (produits et catégories) 🙂

    Par contre, petit soucis, le champs « description_2 » reprends les valeurs du champs « description » lors de l’enregistrement.
    J’ai contrôler et même revu mon code en copiant/collant le votre mais rien n’y fait :/
    Je suis sous prestashop 1.5.6.2
    Une idée? merci

  17. Thibaud a écrit :

    (Re)Bonjour,

    J’ai appliqué la méthode pas à pas, seulement le champ ajouté n’apparait pas dans l’admin de mes catégories. Je suis sous Prestashop 1.5.6.0 la méthode ci-dessus est-elle valable pour cette version ?

    • P.Ghiazza a écrit :

      Oui elle fonctionne très bien. Je vous invite à lire la dernière partie du tuto pour les produits « Ca ne fonctionne pas ? » qui devrait résoudre le problème.

  18. Huon a écrit :

    Bonjour Pauline,

    suite de mon commentaire précédent:
    en m’inspirant de vos articles http://www.paulineghiazza.fr/prestashop-1-5-ajouter-un-champ-pour-les-categories-et-activer-lediteur/ et http://www.paulineghiazza.fr/prestashop-1-5-ajouter-un-champ-pour-les-categories-et-activer-lediteur/, J’ai réussi à ajouter un champs « ancienne référence » à mes produits.

    Cela fonctionne coté back office et niveau front office j’ai bien réussi à afficher ce nouveau champs dans mes pages product.tpl et product-list.tpl, du coup ce champs s’affiche bien dans mes listes de produits par catégorie et dans les pages individuelles de produits, sauf dans la rubrique Nouveaux Produits et dans mes résultats de recherche où j’ai le message :

    Notice: Undefined index: ancienneref in /home/xxxxxx/www/cache/smarty/compile/17/8c/86/178c863e7f2349e0d09b69def5debf490047968c.file.product-list.tpl.php on line 186

    ce qui correspond au code que j’ai ajouté en page product-list.tpl à savoir :

    {if $product.ancienneref} (ancienne réf. {$product.ancienneref}){/if}

    Je pense que le problème vient de mon override de Category.php (?)

    Si quelqu’un veux bien m’aider je fournirai toutes mes modifications.

    De plus, comment faire pour que ce nouveau champs soit indexé dans le moteur de recherche de Prestashop?

    merci d’avance

    Thierry
    ma version de PS: PrestaShop™ 1.6.0.8

    • Med a écrit :

      Bonjour est-ce que je pourrai savoir comment vous avez fait pour afficher ce champ dans les listes de produits sur les pages catégorie svp ? J’ai pu le faire en suivant les tuto mais pour l’affichage en page produit. Merci

  19. jd a écrit :

    Bonjour Pauline et merci pour ce tuto.

    Je suis en train d’appliquer ce tuto sur la 1.6, et j’ai une question?

    Quel template modifier?

    Car j’ai tout applique sauf la partie template, et le champs s’affiche, mais pas l’input.

  20. nison david a écrit :

    bonjour, je suis en 1.6.0.9 ; j’ai suivi le très bon tuto à la lettre et… rien à faire, je ne parviens pas à afficher le contenu de mon nouveau champ sur la page catégorie.
    J’obtiens ceci :
    Notice: Undefined property: Category::$code_iso in /homepages/18/d399255853/htdocs/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()’d code on line 45

    suis preneur de vos conseils et solutions.
    merci d’avance.
    DN

  21. Med a écrit :

    Bonjour Je suis en prestashop 1.6 et j’arrive pas à avoir d’affichage sur la page catégorie. J’ai pourtant vidé le cache de l’autoload à la fin de la manip.

  22. Med a écrit :

    De plus quand j’essaye de mettre à jour les catégories j’ai le message « Une erreur s’est produite pendant la mise à jour de l’objet. category ()  » quand je veux charger une image ou faire une modification.

  23. Med a écrit :

    Je rectifie mes posts précédents .J’ai bien l’affichage du champ en back office mais toujours impossible d’y enregistrer du texte et de faire des modifications dans les catégories.J’ai toujours ce message « Une erreur s’est produite pendant la mise à jour de l’objet. category ()  » quand j’enregistre. Et je n’ai rien en front office.

  24. Med a écrit :

    Bonjour à tous j’ai suivi le tuto à la lettre et j’ai bien le champ en BO mais j’ai toujours ce message d’erreur : « Une erreur s’est produite pendant la mise à jour de l’objet. category ()  » quand je teste une modif , quelqu’un aurait-il une idée de ce qu’est ce problème svp ? J’ai prestashop 1.6 .

  25. GUIBLIN a écrit :

    Nous avons suivi à la lettre le tuto . Les champs description_2 fonctionne et sont sauvegarder par contre nous n’arrivons pas à les afficher en front office en mode sous catégorie . en catégorie tout court, les champs test fonctionne. Si vous avez une solution =) . Voici lextrait du code .

    {foreach from=$subcategories item=subcategory name=subs}

    getCategoryLink($subcategory.id_category, $subcategory.link_rewrite)|escape:’htmlall’:’UTF-8′} » title= »{$subcategory.name|escape:’htmlall’:’UTF-8′} » class= »img »>
    {if $subcategory.id_image}
    getCatImageLink($subcategory.link_rewrite, $subcategory.id_image, ‘category_default’)} » alt= » » width= »{$categorySize.width} » height= »{$categorySize.height} » />
    {else}

    {/if}

    getCategoryLink($subcategory.id_category, $subcategory.link_rewrite)|escape:’htmlall’:’UTF-8′} » class= »cat_name »>{$subcategory.name|escape:’htmlall’:’UTF-8′}
    {if $subcategory.description_2}
    {$subcategory.description_2|truncate:150: »… »}
    {/if}

    {if $smarty.foreach.subs.index mod 2 == 1}

    {/if}
    {/foreach}

    Merci d’avance

  26. CLAF a écrit :

    Bonjour Pauline et grand merci pour ce tuto !

    Je suis sous prestashop 1.6 et je me suis inspirée de ce tuto pour ajouter un champ de description pour les valeurs de caractéristiques. J’ai donc créé un nouveau champ « value_description » dans la table « PREF_feature_value_lang ».
    Tout fonctionne en backoffice (je vois le champ, peut l’éditer, et tout s’enregistre et se met à jour correctement en base de données).

    Mais impossible d’afficher le contenu de mon champ en front office ! Je souhaite l’intégrer à la page produit via le product.tpl.
    Puisque la valeur de caractéristique s’affiche grâce à {$feature.value}, j’ai tenté d’afficher mon nouveau champ avec {$feature.value_description} mais rien n’y fait…

    Je me dis qu’il y peut-être quelque chose à déclarer dans la classe Product.php (?) mais je ne sais pas quoi…

    Auriez-vous une piste ?

    Merci d’avance

  27. Hindi83 a écrit :

    Bonjour Pauline,
    je suis en 1.5.6.2 pour les deux sites (1 site en normal et un en multiboutique/multilangues).

    sur le site normal (1 langue francais) tout est OK !! affichage, saisie et enregistrement OK !!

    sur le multiboutique/multilangues tout est OK au niveau de l’affichage dans BO
    la saisie est ok mais quant on valide il semble que ca enregistre bien les modifs mais le champ « description 2 » se retrouve sous cette forme dans et ce dans toutes les langues :
    « <<<<<<<s and handles hand painted ceramics . Furniture handles ideal for customizing your furniture! Just a hole and the porce "

    il reprend le contenu anglais de "description" et ajoute au début <<<<<<<
    une piste ?

      • Mendil a écrit :

        Problème résolu en renommant le champ « description_2 » par autre-chose comme « description_bis » car les langues génères une incrémentation automatique « description_2, description_3,etc… » .

        Merci pour l’astuce en tout cas !

  28. Seb a écrit :

    Bonjour Pauline,

    merci pour ce super tuto j’aurais été incapable de trouver ces modifs moi même. Pour information, je suis à une version antérieure à la 1.5.3 et il a également fallu que je remplace la dernière ligne de la fonction (return parent::renderForm();) par return AdminController::renderForm(); comme indiqué à la fin de votre article. Sans ca l’éditeur ne s’affichait pas dans le Back Office. Ca pourra servir à d’autres.

  29. Cemo a écrit :

    Bonjour Pauline,
    Merci pour le tuto.

    J’ai effectué les modifications listées.
    Mon nouveau champ apparaît bien dans le formulaire, je peux modifier la valeur, c’est enregistré en base.
    Quand je navigue dans les catégories dans le BO, la nouvelle colonne est bien la, elle affiche les valeurs remplies et je peut l’utiliser pour filtrer les résultats.

    Mais quand je reviens sur le formulaire, l’input reste désespérément vide…
    Je n’arrive pas non plus à récupérer la valeur sur le .tpl en FO.

    Je suis en 1.6

    Quelqu’un aurait une idée ?

    • Marmulet a écrit :

      Bonjour à tous,

      Merci pour ce super tuto.

      J’ai exactement le même problème que toi GEMO. Je cherche une explication depuis plusieurs jours. Impossible de comprendre pourquoi. Je suis également en 1.6.
      Est-ce que par hasard tu aurais résolu le problème et tu te souviendrais comment ?

      Mille fois merci d’avance !

      • P.Ghiazza a écrit :

        Bonjour,

        Si la valeur n’apparaît pas en FO et n’est pas repeuplée en BO, c’est très probablement un problème de déclaration dans la classe Category.
        Vérifiez :
        – La déclaration de la variable « public »
        – L’ajout à la définition
        – La table dans laquelle vous avez ajouté votre champ (category ou category_lang)

  30. Alexandre a écrit :

    Bonjour Pauline,

    Merci pour ce tuto super clair.
    Cependant, j’ai suivi à la lettre les différentes étapes, une par une, en vérifiant soigneusement tout, et rien n’y fait, le champ n’apparaît pas, ni en back, ni en front.
    Je suis en presta 1.6.0.14.

    Une idée ?
    Merci beaucoup !

  31. Alexandre a écrit :

    Bon en fait, c’est un pb de cache je pense.
    Quand je supprime le fichier class_index.php, ça marche, je vois bien le champ description 2 dans mon back
    Par contre, lorsque je remplis ce champ et que j’enregistre, j’ai un message d’erreur « Mauvaise requête SQL
    Unknown column ‘sa.position’ in ‘field list' »

    Et impossible de consulter alors la liste des catégories.
    Il faut que je vide le cache de Presta, en passant par Paramètres Avancés > Performances, pour que les catégories s’affichent de nouveau… mais le champ description 2 disparaît alors.

    Je deviens fou 😮

    Merci bcp !

  32. Alexandre a écrit :

    Non justement, je parle bien de ce tuto, sur l’ajout d’un champ dans les catégories.
    Donc je ne comprends pas ce que vient faire la class Product là dedans. Ou j’ai raté un truc ?

    Merci !

  33. lgm974 a écrit :

    Bonjour,
    suivi vos recommandations à lettres …..et j’ai m^me pas un bug !! lol Prestashop 1.6.0.11
    overide admin controller : AdmincategoryController.php
    bootstrap = true;
    $this->table = ‘category’;
    $this->className = ‘Category’;
    $this->lang = true;
    $this->deleted = false;
    $this->explicitSelect = true;
    $this->_defaultOrderBy = ‘position’;
    $this->allow_export = true;

    $this->context = Context::getContext();

    $this->fieldImageSettings = array(
    ‘name’ => ‘image’,
    ‘dir’ => ‘c’
    );

    $this->fields_list = array(
    ‘id_category’ => array(
    ‘title’ => $this->l(‘ID’),
    ‘align’ => ‘center’,
    ‘class’ => ‘fixed-width-xs’
    ),
    ‘name’ => array(
    ‘title’ => $this->l(‘Name’)
    ),
    ‘description’ => array(
    ‘title’ => $this->l(‘Description’),
    ‘callback’ => ‘getDescriptionClean’,
    ‘orderby’ => false
    ),
    ‘description 2’ => array(
    ‘title’ => $this->l(‘Description 2’),
    ‘callback’ => ‘getDescription2Clean’,
    ‘orderby’ => false
    ),
    ‘position’ => array(
    ‘title’ => $this->l(‘Position’),
    ‘filter_key’ => ‘sa!position’,
    ‘position’ => ‘position’,
    ‘align’ => ‘center’
    ),
    ‘active’ => array(
    ‘title’ => $this->l(‘Displayed’),
    ‘active’ => ‘status’,
    ‘type’ => ‘bool’,
    ‘class’ => ‘fixed-width-xs’,
    ‘align’ => ‘center’,
    ‘orderby’ => false
    )
    );

    $this->bulk_actions = array(
    ‘delete’ => array(
    ‘text’ => $this->l(‘Delete selected’),
    ‘icon’ => ‘icon-trash’,
    ‘confirm’ => $this->l(‘Delete selected items?’)
    )
    );
    $this->specificConfirmDelete = false;

    adminController::__construct();
    }
    public function renderForm()
    {
    $this->initToolbar();
    $obj = $this->loadObject(true);
    $id_shop = Context::getContext()->shop->id;
    $selected_categories = array((isset($obj->id_parent) && $obj->isParentCategoryAvailable($id_shop))? (int)$obj->id_parent : (int)Tools::getValue(‘id_parent’, Category::getRootCategory()->id));
    $unidentified = new Group(Configuration::get(‘PS_UNIDENTIFIED_GROUP’));
    $guest = new Group(Configuration::get(‘PS_GUEST_GROUP’));
    $default = new Group(Configuration::get(‘PS_CUSTOMER_GROUP’));

    $unidentified_group_information = sprintf($this->l(‘%s – All people without a valid customer account.’), ‘‘.$unidentified->name[$this->context->language->id].’‘);
    $guest_group_information = sprintf($this->l(‘%s – Customer who placed an order with the guest checkout.’), ‘‘.$guest->name[$this->context->language->id].’‘);
    $default_group_information = sprintf($this->l(‘%s – All people who have created an account on this site.’), ‘‘.$default->name[$this->context->language->id].’‘);

    if (!($obj = $this->loadObject(true)))
    return;

    $image = _PS_CAT_IMG_DIR_.$obj->id.’.jpg’;
    $image_url = ImageManager::thumbnail($image, $this->table.’_’.(int)$obj->id.’.’.$this->imageType, 350,
    $this->imageType, true, true);
    $image_size = file_exists($image) ? filesize($image) / 1000 : false;

    $this->fields_form = array(
    ‘tinymce’ => true,
    ‘legend’ => array(
    ‘title’ => $this->l(‘Category’),
    ‘icon’ => ‘icon-tags’
    ),
    ‘input’ => array(
    array(
    ‘type’ => ‘text’,
    ‘label’ => $this->l(‘Name’),
    ‘name’ => ‘name’,
    ‘lang’ => true,
    ‘required’ => true,
    ‘class’ => ‘copy2friendlyUrl’,
    ‘hint’ => $this->l(‘Invalid characters:’).’ ;=#{}’,
    ),
    array(
    ‘type’ => ‘switch’,
    ‘label’ => $this->l(‘Displayed’),
    ‘name’ => ‘active’,
    ‘required’ => false,
    ‘is_bool’ => true,
    ‘values’ => array(
    array(
    ‘id’ => ‘active_on’,
    ‘value’ => 1,
    ‘label’ => $this->l(‘Enabled’)
    ),
    array(
    ‘id’ => ‘active_off’,
    ‘value’ => 0,
    ‘label’ => $this->l(‘Disabled’)
    )
    )
    ),
    array(
    ‘type’ => ‘categories’,
    ‘label’ => $this->l(‘Parent category’),
    ‘name’ => ‘id_parent’,
    ‘tree’ => array(
    ‘id’ => ‘categories-tree’,
    ‘selected_categories’ => $selected_categories,
    ‘disabled_categories’ => (!Tools::isSubmit(‘add’.$this->table) && !Tools::isSubmit(‘submitAdd’.$this->table)) ? array($this->_category->id) : null
    )
    ),
    array(
    ‘type’ => ‘textarea’,
    ‘label’ => $this->l(‘Description’),
    ‘name’ => ‘description’,
    ‘autoload_rte’ => true,
    ‘lang’ => true,
    ‘hint’ => $this->l(‘Invalid characters:’).’ ;=#{}’
    ),
    array(
    ‘type’ => ‘textarea’,
    ‘label’ => $this->l(‘Description 2’),
    ‘name’ => ‘description 2’,
    ‘autoload_rte’ => true,
    ‘lang’ => true,
    ‘hint’ => $this->l(‘Invalid characters:’).’ ;=#{}’
    ),
    array(
    ‘type’ => ‘file’,
    ‘label’ => $this->l(‘Image’),
    ‘name’ => ‘image’,
    ‘display_image’ => true,
    ‘image’ => $image_url ? $image_url : false,
    ‘size’ => $image_size,
    ‘delete_url’ => self::$currentIndex.’&’.$this->identifier.’=’.$this->_category->id.’&token=’.$this->token.’&deleteImage=1′,
    ‘hint’ => $this->l(‘Upload a category logo from your computer.’),
    ),
    array(
    ‘type’ => ‘text’,
    ‘label’ => $this->l(‘Meta title’),
    ‘name’ => ‘meta_title’,
    ‘lang’ => true,
    ‘hint’ => $this->l(‘Forbidden characters:’).’ ;=#{}’
    ),
    array(
    ‘type’ => ‘text’,
    ‘label’ => $this->l(‘Meta description’),
    ‘name’ => ‘meta_description’,
    ‘lang’ => true,
    ‘hint’ => $this->l(‘Forbidden characters:’).’ ;=#{}’
    ),
    array(
    ‘type’ => ‘tags’,
    ‘label’ => $this->l(‘Meta keywords’),
    ‘name’ => ‘meta_keywords’,
    ‘lang’ => true,
    ‘hint’ => $this->l(‘To add « tags, » click in the field, write something, and then press « Enter. »‘).’ ‘.$this->l(‘Forbidden characters:’).’ ;=#{}’
    ),
    array(
    ‘type’ => ‘text’,
    ‘label’ => $this->l(‘Friendly URL’),
    ‘name’ => ‘link_rewrite’,
    ‘lang’ => true,
    ‘required’ => true,
    ‘hint’ => $this->l(‘Only letters, numbers, underscore (_) and the minus (-) character are allowed.’)
    ),
    array(
    ‘type’ => ‘group’,
    ‘label’ => $this->l(‘Group access’),
    ‘name’ => ‘groupBox’,
    ‘values’ => Group::getGroups(Context::getContext()->language->id),
    ‘info_introduction’ => $this->l(‘You now have three default customer groups.’),
    ‘unidentified’ => $unidentified_group_information,
    ‘guest’ => $guest_group_information,
    ‘customer’ => $default_group_information,
    ‘hint’ => $this->l(‘Mark all of the customer groups which you would like to have access to this category.’)
    )
    ),
    ‘submit’ => array(
    ‘title’ => $this->l(‘Save’),
    ‘name’ => ‘submitAdd’.$this->table.($this->_category->is_root_category && !Tools::isSubmit(‘add’.$this->table) && !Tools::isSubmit(‘add’.$this->table.’root’) ?  »: ‘AndBackToParent’)
    )
    );

    $this->tpl_form_vars[‘shared_category’] = Validate::isLoadedObject($obj) && $obj->hasMultishopEntries();
    $this->tpl_form_vars[‘PS_ALLOW_ACCENTED_CHARS_URL’] = (int)Configuration::get(‘PS_ALLOW_ACCENTED_CHARS_URL’);
    $this->tpl_form_vars[‘displayBackOfficeCategory’] = Hook::exec(‘displayBackOfficeCategory’);

    // Display this field only if multistore option is enabled
    if (Configuration::get(‘PS_MULTISHOP_FEATURE_ACTIVE’) && Tools::isSubmit(‘add’.$this->table.’root’))
    {
    $this->fields_form[‘input’][] = array(
    ‘type’ => ‘switch’,
    ‘label’ => $this->l(‘Root Category’),
    ‘name’ => ‘is_root_category’,
    ‘required’ => false,
    ‘is_bool’ => true,
    ‘values’ => array(
    array(
    ‘id’ => ‘is_root_on’,
    ‘value’ => 1,
    ‘label’ => $this->l(‘Yes’)
    ),
    array(
    ‘id’ => ‘is_root_off’,
    ‘value’ => 0,
    ‘label’ => $this->l(‘No’)
    )
    )
    );
    unset($this->fields_form[‘input’][2],$this->fields_form[‘input’][3]);
    }
    // Display this field only if multistore option is enabled AND there are several stores configured
    if (Shop::isFeatureActive())
    $this->fields_form[‘input’][] = array(
    ‘type’ => ‘shop’,
    ‘label’ => $this->l(‘Shop association’),
    ‘name’ => ‘checkBoxShopAsso’,
    );

    // remove category tree and radio button « is_root_category » if this category has the root category as parent category to avoid any conflict
    if ($this->_category->id_parent == (int)Configuration::get(‘PS_ROOT_CATEGORY’) && Tools::isSubmit(‘updatecategory’))
    foreach ($this->fields_form[‘input’] as $k => $input)
    if (in_array($input[‘name’], array(‘id_parent’, ‘is_root_category’)))
    unset($this->fields_form[‘input’][$k]);

    if (!($obj = $this->loadObject(true)))
    return;

    $image = ImageManager::thumbnail(_PS_CAT_IMG_DIR_.’/’.$obj->id.’.jpg’, $this->table.’_’.(int)$obj->id.’.’.$this->imageType, 350, $this->imageType, true);

    $this->fields_value = array(
    ‘image’ => $image ? $image : false,
    ‘size’ => $image ? filesize(_PS_CAT_IMG_DIR_.’/’.$obj->id.’.jpg’) / 1000 : false
    );

    // Added values of object Group
    $category_groups_ids = $obj->getGroups();

    $groups = Group::getGroups($this->context->language->id);
    // if empty $carrier_groups_ids : object creation : we set the default groups
    if (empty($category_groups_ids))
    {
    $preselected = array(Configuration::get(‘PS_UNIDENTIFIED_GROUP’), Configuration::get(‘PS_GUEST_GROUP’), Configuration::get(‘PS_CUSTOMER_GROUP’));
    $category_groups_ids = array_merge($category_groups_ids, $preselected);
    }
    foreach ($groups as $group)
    $this->fields_value[‘groupBox_’.$group[‘id_group’]] = Tools::getValue(‘groupBox_’.$group[‘id_group’], (in_array($group[‘id_group’], $category_groups_ids)));

    $this->fields_value[‘is_root_category’] = (bool)Tools::isSubmit(‘add’.$this->table.’root’);

    return AdminController::renderForm();
    }
    public static function getDescriptionClean2($description)
    {
    return strip_tags(stripslashes($description));
    }

    Overide class controller
    ‘category’,
    ‘primary’ => ‘id_category’,
    ‘multilang’ => true,
    ‘multilang_shop’ => true,
    ‘fields’ => array(
    ‘nleft’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘nright’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘level_depth’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘active’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’, ‘required’ => true),
    ‘id_parent’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘id_shop_default’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedId’),
    ‘is_root_category’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’),
    ‘position’ => array(‘type’ => self::TYPE_INT),
    ‘date_add’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),
    ‘date_upd’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),

    // Lang fields
    ‘name’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isCatalogName’, ‘required’ => true, ‘size’ => 64),
    ‘link_rewrite’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isLinkRewrite’, ‘required’ => true, ‘size’ => 64),
    ‘description’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
    ‘description_2’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
    ‘meta_title’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 128),
    ‘meta_description’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
    ‘meta_keywords’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
    ),
    );

    VOIli voilou, bien mis le champs de la bdd, bien modifier le tpl tout en bas apres pagination!! si vous avez reperer un truc … merci d’avance !

    • P.Ghiazza a écrit :

      Olalala va falloir voir à changer de ton tout de suite. Je n’y suis pour rien si vous n’êtes pas compétent pour mettre en place cette modification. C’est d’ailleurs pour ça qu’existent des professionnels. Cette solution fonctionne parfaitement comme le prouvent de nombreux commentaires. Comme de toute évidence, vous n’êtes ni capable d’être respectueux, ni de faire un copier coller, je vous laisse vous débrouiller.

  34. lgm974 a écrit :

    Re bonjour,
    non, c’est pas grave, j ai trouvé la solution en relisant bien tout !! j ‘ai juste oublié une parenthèse dans le mode debug !! excusez moi encore !! c’est les nerfs…je bosse toute la journée comme une dingue ..enfin bref …donc j ai récupérer mon site…et mis le doigt sur quelques erreurs !! c’est vrai que je n’ai pas les compétences, mais je me décourage je vais y arriver !! encore toutes mes excuses et bonnes soirée, c ‘est vrai qu avec le recul c’était pas tres sympa de ma part , voire même super nul!!

  35. lgm974 a écrit :

    Bonjour, pour dire que ça avance …et effectivement, le conseil donné a Alexandre est juste …mais pas evident sur le net de trouver des infos a ce niveau là …cependant j’ai trouvé mais encore qq erreurs de syntaxe …aie aie, qu’il est rigoureux ce PHP §§
    bonne journée ( en mode remise en question!!lol)

  36. Johan a écrit :

    Bonjour Pauline,
    Très bon tuto !
    Il me semble que j’ai le même problème qu’Alexandre.

    Après avoir suivi votre tuto, et avoir activé le mode debug, j’ai l’erreur suivante :
    Unknown column ‘sa.position’ in ‘field list’
    at line 646 in file classes/db/Db.php

    Je ne comprend ce qui se passe… Avez-vous une piste ?

    Merci d’avance
    Johan

    • P.Ghiazza a écrit :

      Bonjour,

      Il semble que le problème soit lié soit à la déclaration de la nouvelle variable dans la classe Category, soit dans l’ajout du champ en BDD. Vérifiez que votre champ soit bien dans la table catergory_lang et que l’attribut « lang » soit à true dans sa définition.

      • Johan a écrit :

        Dans override/classes/Category.php j’ai ajouté :

        public $description_2;
        public static $definition = array(
        ‘table’ => ‘category’,
        ‘primary’ => ‘id_category’,
        ‘multilang’ => true,
        ‘multilang_shop’ => true,
        ‘fields’ => array(
        ‘nleft’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘nright’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘level_depth’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘active’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’, ‘required’ => true),
        ‘id_parent’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘id_shop_default’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedId’),
        ‘is_root_category’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’),
        ‘position’ => array(‘type’ => self::TYPE_INT),
        ‘date_add’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),
        ‘date_upd’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),

        // Lang fields
        ‘name’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isCatalogName’, ‘required’ => true, ‘size’ => 64),
        ‘link_rewrite’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isLinkRewrite’, ‘required’ => true, ‘size’ => 64),
        ‘description’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
        ‘description_2’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
        ‘meta_title’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 128),
        ‘meta_description’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
        ‘meta_keywords’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
        ),
        );

        Et dans la table category_lang j’ai bien ajouté une colonne description_2 en type text.
        Je ne comprends pas …

  37. LULUBERLU a écrit :

    Pour info et pour ceux que ça peut intéresser, voici une solution temporaire (pas la meilleure, mais ça fonctionne) à partir d’une installation toute fraîche.

    ————————-

    Copier le fichier /classes/Category.php dans /override/classes/

    Dans /override/classes/Category.php

    Ajouter une propriété publique comme suit :

    public $mon_champ;

    Modifier la propriété statique $definition en ajoutant n’importe où la ligne comme suit :

    $definition = array(

    ‘mon_champ’ => array(option1, option2, option3), // Ligne à ajouter, ne pas oublier de mettre vos options

    );

    ——————–

    Copier le fichier /controllers/admin/AdminCategoriesController.php dans /override/controllers/admin/

    Dans /override/controllers/admin/AdminCategoriesController.php

    Modifier la définition de variable $this->fields_list dans le constructeur en ajoutant votre champ au tableau :

    $this->fields_list = array(

    ‘mon_champ’ => array(
    ‘title’ => $this->l(‘Mon champ’),
    ‘callback’ => ‘getDescriptionClean’, // La fonction est statique, inutile d’en créer une nouvelle
    ‘orderby’ => false
    ),

    );

    Dans la méthode renderForm(), modifier la définition de variable $this->fields_form en ajoutant votre champ au tableau :

    $this->fields_form = array(

    array(
    ‘type’ => ‘textarea’,
    ‘label’ => $this->l(‘Mon champ’),
    ‘name’ => ‘mon_champ’,
    ‘autoload_rte’ => true,
    ‘lang’ => true,
    ‘hint’ => $this->l(‘Invalid characters:’).’ ;=#{}’
    ),

    );

    ————————-

    Cette solution n’est pas spécialement la meilleure puisqu’elle surcharge l’intégralité de la classe parent.

  38. Emmanuel a écrit :

    Bonjour,
    Super tuto.

    Pour éviter toutes les surcharges du BO et essayer de simplifier les manips, j’ai créé directement dans ma table `ps_category_lang` le champs « description_b » et ai saisi un texte dedans.

    J’ai juste en suite modifié le fichier category.tpl pour afficher ce champs en y mettant :

    {$category->description_b}

    Rien ne s’affiche.
    Par contre, si j’appel une autre valeur de la table, ça marche : ex :

    {$category->meta_title}

    Là il affiche bien le meta title de la catégorie là où je veux dans la page.

    Y a-t-il quelque-chose en plus à déclarer pour que le nouveau champs soit pris en compte ?

    Merci. Emmanuel.

    • P.Ghiazza a écrit :

      Bonjour,

      Dans tous les cas, vous devez surcharger la classe Category afin d’y ajouter votre nouveau champ. Dans le cas contraire, l’objet Category ne sera pas chargé correctement.

      • Emmanuel a écrit :

        J’avais répondu en nouveau sujet.

        J’ai suivi votre tuto et ai surchargé la classe Category :

        J’ai rajouté dans : \override\classes\ le fichier Category.php avec dedans :

        class CategoryCore extends ObjectModel
        {
        public $id;

        public $description_b;

        public static $definition = array(
        ‘table’ => ‘category’,
        ‘primary’ => ‘id_category’,
        ‘multilang’ => true,
        ‘multilang_shop’ => true,
        ‘fields’ => array(
        ‘nleft’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘nright’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘level_depth’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘active’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’, ‘required’ => true),
        ‘id_parent’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
        ‘id_shop_default’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedId’),
        ‘is_root_category’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’),
        ‘position’ => array(‘type’ => self::TYPE_INT),
        ‘date_add’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),
        ‘date_upd’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),

        // Lang fields
        ‘name’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isCatalogName’, ‘required’ => true, ‘size’ => 64),
        ‘link_rewrite’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isLinkRewrite’, ‘required’ => true, ‘size’ => 64),
        ‘description’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
        ‘description_b’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
        ‘meta_title’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 128),
        ‘meta_description’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
        ‘meta_keywords’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
        ),
        );

        }

        Mais rien ne s’affiche pour autant. Suis sous Prestashop 1.6.1.2

  39. Emmanuel a écrit :

    Bonjour,

    Merci.
    J’ai rajouté dans : \override\classes\ le fichier Categoty.php avec dedans :

    class CategoryCore extends ObjectModel
    {
    public $id;

    public $description_b;

    public static $definition = array(
    ‘table’ => ‘category’,
    ‘primary’ => ‘id_category’,
    ‘multilang’ => true,
    ‘multilang_shop’ => true,
    ‘fields’ => array(
    ‘nleft’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘nright’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘level_depth’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘active’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’, ‘required’ => true),
    ‘id_parent’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedInt’),
    ‘id_shop_default’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedId’),
    ‘is_root_category’ => array(‘type’ => self::TYPE_BOOL, ‘validate’ => ‘isBool’),
    ‘position’ => array(‘type’ => self::TYPE_INT),
    ‘date_add’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),
    ‘date_upd’ => array(‘type’ => self::TYPE_DATE, ‘validate’ => ‘isDate’),

    // Lang fields
    ‘name’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isCatalogName’, ‘required’ => true, ‘size’ => 64),
    ‘link_rewrite’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isLinkRewrite’, ‘required’ => true, ‘size’ => 64),
    ‘description’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
    ‘description_b’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => true, ‘validate’ => ‘isString’),
    ‘meta_title’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 128),
    ‘meta_description’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
    ‘meta_keywords’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘size’ => 255),
    ),
    );

    }

    Mais rien ne s’affiche pour autant.

  40. Koi a écrit :

    Merci pour ce tuto,
    je suis en pleine création d’un nouveau site sous prestashop 1.6, quelques modifs ont donc été ajoutées mais rien d’impossible, il faut persévérer…

  41. Chambaud Anthony a écrit :

    Bonjour,

    Tout d’abord bravo pour ce blog, simplement génial. Je profite de ce billet pour vous exposer mon problème, depuis ma mise à jour vers la version 1.6.1.4 je n’arrive plus a faire d’override !

    Les fichiers dans /override/classes/ ne sont plus pris en compte ! Pourtant je vide bien le cache, et supprime bien mon class_index.php

    Auriez-vous une idée ou une piste ?

    Car j’aimerai beaucoup ajouter ce fameux champ pour les catégorie 🙂

    Merci d’avance !

  42. Lilhouh a écrit :

    Bonjour,
    Cet article m’intéresse beaucoup. J’aimerais vraiment réussir à mettre en place cette 2nde description.
    je suis dans le même cas qu’Anthony, commentaire précédent mais qui date déjà.
    J’ai évidemment supprimé le class_index, vider le cache, j’ai vérifié que l’option « surcharges » était bien activée en BO… mais rien n’y fait, aucun autre mce pour cette seconde description ne daigne s’afficher en BO…
    A noter : j’ai aussi tenté la piste trouvée sur un autre site qui conseillait de modifier le classes/PrestaShopAutoload.php
    Mais non.
    Avez-vous d’autres pistes que l’on puisse explorer depuis ?
    merci
    bonne journée

  43. Lilhouh a écrit :

    Re !

    J’avance…
    Le champ s’affiche en BO. Mais se vide à chaque enregistrement de la page.
    L’appel de ma div en front fonctionne également.
    Il est vide? Normal puisque le champ est vide et rien n’est donc inséré en bdd… une idée pour moi svp ? 🙂
    merci

  44. Lilhouh a écrit :

    Bonjour,

    Je reviens ici poster mes observations.
    J’avais abandonné ce tuto parce que je ne parvenais pas à le mettre en place sur mon site.
    J’y suis revenue aujourd’hui. Cela fonctionne.

    Dans ce que j’ai pu observer, je le poste des fois que ça puisse aider d’autres personnes :
    1. Dans le Category.php, si vous le créez vous-même parce qu’il n’existe pas dans votre version de Prestashop, pensez bien à encapsulez tout le code donné par Pauline dans cette classe : class Category extends CategoryCore { …….. }
    2. Commencez évidemment ce fichier par la balise ouverture de php <?php … mais en fin de fichier … ne la fermez pas !
    3. Dans le AdminCategoriesController.php, si vous le créez vous-même parce qu'il n'existe pas dans votre version de Prestashop, pensez bien à encapsulez tout le code donné par Pauline dans cette classe : class AdminCategoriesController extends AdminCategoriesControllerCore { …….. }
    4. La fonction getDescription2Clean donnée par Pauline est, me semble-t-il, à adapter à la nouvelle variable "description_2" que nous souhaitons ici créer, et non pas $description (tout court)

    Voilà pour ma petite contribution 🙂
    Je suis en PS 1.6.1.1 et cela fonctionne très bien.

    Merci encore pour ce tuto qui, en réponse à quelqu'un plus haut qui se demandait l'intérêt d'un tel champ, est absolument indispensable pour optimiser une page de contenu digne de ce nom, sans polluer l'oeil en haut d'écran.
    MERCI !

  45. Leonard a écrit :

    Bonjour,

    Merci pour ce tuto génial !

    Je rencontre un petit problème, celà fonctionne parfaitement sur les catégories et sous catégories, mais les nouvelles catégories et sous catégories sur prestashop crées depuis l’ajout du champs « points forts » ne sont pas prises en compte et celà affiche à la place un message de ce type :

    Notice: Undefined index: pointsforts in /httpdocs/cache/smarty/compile/d6/af/cf/d6afcf4ff95b3561f23bae375daa1e463ada6458.file.product-list.tpl.php on line 212

    Qu’ai-je oublié? merci d’avance de votre aide.

  46. vincent a écrit :

    Nickel, ça joue parfaitement.
    Merci à toi et à Lilhouh pour ce Tuto fort intéressant et qui ouvre le champs des possibles en matière de SEO.
    Pour info, ma version de presta : 1.6.0.14.

    A votre dispo si besoin.

  47. herve a écrit :

    Bonjour Pauline, ce tuto est excellent, mais je bute sur un soucis (ps 1.6.1.11).

    J’ai ajouté un champ ‘text’ (pas ‘textarea’, donc sans ajout de tiny mce)
    Tout fonctionne « presque » bien
    ->
    le contenu de mon champ est bien ajouté dans la DB_lang
    Tous les champs sont bien mis-à-jour (dans les tables `[…]categories` et `categories_lang`
    MAIS j’atterris sur une page blanche (vide) quand je clique sur « Enregistrer » (au lieu d’être redirigé sur la page parent)

    url de la page (blanche):
    [nom de domaine]/admin/index.php?controller=AdminCategories&token=6f1821b08cc8f1b07d8b40a671be93ff
    – le token est ok
    – l’adresse est ok (si je rafraîchis manuellement la page, j’arrive bien sur la page parent = « Catalogue » > « Catégories »)
    – les valeurs ont bien été mis-à-jour (dans la DB donc dans affichage ok dans le FrontOffice aussi)

    …mais toujours cette page blanche au lieu d’une redirection normale
    J’ai farfouillé les codes dans l’espoir d’y trouver un return en trop (sans succès)
    le mode debug ne me donne aucune trace
    bref je n’ai plus aucune idée d’où chercher 🙁

    Z’en auriez pas une? 🙂
    Merci d’avance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *