Étiquette : 1.5.2

[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.