Étiquette : champ

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

[Prestashop 1.5+ | 1.6+] Ajouter un champ zone de texte (textarea) produit

Voici aujourd’hui une solution pour ajouter un champ de type « textarea » dans la gestion des produits sur Prestashop 1.5+.

Cette technique fonctionne à partir de la version 1.5.3 de Prestashop. Pour les versions 1.4.x, consultez ce tutoriel : Ajouter un champ avec éditeur sur la page produit de Prestashop 1.4.x

Ce tuto est fonctionnel pour les versions 1.5 et 1.6.

Voici donc comment nous allons pouvoir rajouter un champ « Points Forts » sur les fiches produit.

 

I ) Ajout du champ dans la base de données

Rendez-vous dans votre base de données et ajoutez un champ « pointsforts » de type « Text » dans la table PREFIX_product_lang.

 

II ) Modification de la classe Product

Versions 1.5.3.x : Rendez-vous dans /override/classes/Product.php. Ajoutez-y les lignes suivantes :

public $pointsforts;

public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
  Product::$definition['fields']['pointsforts'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString');
  parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
}

 

Versions 1.5.4+ : Si vous avez une version de Prestashop supérieure ou égale à celle-ci, vous devez créer le fichier d’override « Product.php » dans /override/classes/. Son contenu doit ressembler à cela dans le cas présent :

<?php

class Product extends ProductCore
{
	public $pointsforts;

	public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
	{
	  Product::$definition['fields']['pointsforts'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString');
	  parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
	}

}

 

III ) Modifier la vue backoffice

Rendez-vous dans admin/themes/default/template/controllers/products/informations.tpl et copiez ce fichier.

Collez-le ensuite dans /override/controllers/admin/templates/products/informations.tpl

En s’inspirant de la ligne 290, collez le code suivant, qui va créer le champ texte :

<tr>
	<td class="col-left">
		{include file="controllers/products/multishop/checkbox.tpl" field="pointsforts" type="tinymce" multilang="true"}
		<label>{$bullet_common_field} {l s='Points forts :'}<br /></label>
		<p class="product_description">({l s='Les points forts du produit'})</p>
	</td>
	<td style="padding-bottom:5px;">
		{include file="controllers/products/textarea_lang.tpl" languages=$languages
			input_name='pointsforts'
			input_value=$product->pointsforts
		}
		<p class="clear"></p>
	</td>
</tr>

 

IV ) Affichage en front-office

Il ne vous reste plus qu’à afficher ce champ en front-office. Pour ce faire, modifiez le fichier /themes/votre_theme/product.tpl et ajoutez ce qui suit à l’endroit que vous souhaitez :

{$product->pointsforts}

Si vous souhaitez afficher la valeur de votre nouveau champ sur la page des catégories, rendez-vous dans /classes/Category.php et copiez la fonction getProducts() (ligne 742 approximativement).

Collez cette fonction dans le fichier /override/classes/Category.php (à créer s’il n’existe pas), et modifiez-y la requête ($sql) , en rajoutant pl.pointsforts dans le SELECT.

 

Çà ne fonctionne pas ?

Solution 1

En cas de problème, vérifiez que la compilation est bien désactivée.

Pour cela, rendez-vous dans Paramètres avancés > Performances et modifiez les options suivantes :

  • Cache des templates : Forcer la compilation à chaque appel
  • Cache : Non (X)
  • Pour les versions 1.5.6, cliquez aussi sur le bouton « Effacer le cache de Smarty et le cache de l’Autoload ».

Une fois cela fait, réessayez. Cela devra fonctionner.

Si tout est bon, pensez cependant à re-modifier ces informations et de les remettre sur :

  • Cache des templates : Ne jamais recompiler les fichiers de templates
  • Cache : Oui

Sans quoi, votre site va se mettre à ramer horriblement.

 

Solution 2

De plus, si vous venez de créer les fichiers overridés spécifiquement pour ce tuto, il est impératif de vider le cacher de l’autoload.

Pour ce faire, vous pouvez :

  • supprimer le fichier class_index.php dans le dossier /cache
  • en 1.5.5+, aller dans Préférences > Performances et en cliquant sur « Vider le cache » dans la toolbar

Si vous rencontrez toujours un problème, n’hésitez pas à laisser un commentaire ci-dessous.