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.