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.