Catégorie : Prestashop

[Prestashop 1.6+] Créer un override pour un module

Depuis la version 1.6, les équipes de Prestashop ont mis en place (enfin !) un système d’override des modules, propre et natif.

Dans ce tutoriel, je vais vous montrer comment l’utiliser et vous vous en rendrez compte, c’est très simple.

Admettons que nous souhaitons greffer le module « blocksearch » dans le hook displayFooter.

Commençons par :

  1. Créer un dossier du nom du module (ici « blocksearch ») dans le dossier /override/modules
  2. Dans ce fichier, créer le fichier « blocksearch.php »

 

Nous allons maintenant éditer ce fichier. D’abord, déclarons la classe :

<?php

class BlockSearchOverride extends BlockSearch {


}

Vous noterez que la spécificité de ce nouveau système d’override est ainsi l’ajout du suffixe « Override » au nom de la classe (au lieu de « Core » pour les classes ou les controllers).

 

Enfin, pour ajouter le hook en question, rien de plus simple :

public function hookDisplayFooter($params) {
	return $this->hookTop($params);
}

Il ne vous reste plus qu’à vider le cache de l’autoload en utilisant l’une de ces méthodes :

  • Back-office > Paramètres avancés > Performances : bouton « Vider le cache » en haut à droite
  • Suppression du fichier /cache/class_index.php

Le tour est joué !

[Prestashop] Au secours ! Paypal ne fonctionne plus sur ma boutique !

Si vous êtes ici, c’est que comme toutes les personnes ayant installé le module Paypal sur leur boutique, celui-ci ne fonctionne plus.

Ce qui est sympa pour vous, c’est que je vais vous dire comment y remédier !

 

La cause du bug m’est encore inconnue. Tout ce que je peux vous dire, c’est que Paypal a du modifier son appel API / webservice (que sais-je ?) et ainsi, votre module ne fait plus le lien.

 

La résolution du bug, elle, est facile. Il vous suffit de mettre à jour votre module.

Vous pouvez soit le faire directement depuis votre back-office, soit en passant par Addons.

Pour cela, rendez-vous sur Prestashop Addons et téléchargez le module. Dans votre back-office, uploadez-le ensuite comme n’importe quel module et le tour est joué 😉

 

Important : Normalement, la mise à jour conserve tous vos identifiants Paypal. Sauvegardez tout de même vos identifiants avant de faire la mise à jour.

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

 

[Prestashop 1.4.x] Ajouter un champ sur une fiche produit

Voici une petite astuce Prestashop qui va vous permettre d’ajouter un champ dans votre fiche produit. En clair, cette astuce vous permettra d’ajouter une zone de saisie dans votre back-office afin d’afficher un contenu personnalisé, unique à chaque produit.

Cette astuce est valable pour les versions 1.4.x.

 

La classe ‘Product’

A la racine de votre site, rendez-vous dans /classes/Product.php.

A la suite des variables publiques déclarées, ajoutez

public $monChamp;

 

Allez ensuite à la fonction getTranslationsFieldsChild() et remplacez la valeur de la variable protected $fieldsValidate par :

array( 'id_tax' => 'isUnsignedId', 'id_manufacturer' => 'isUnsignedId', .... couper pour pas faire trop long .... 'active' => 'isBool', 'ean13' => 'isEan13', 'monChamp' => 'isCleanHtml');

Remplacez ensuite la valeur de la variable protected $fieldsValidateLang par :

array( 'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName', 'meta_title' => 'isGenericName', 'link_rewrite' => 'isLinkRewrite', 'name' => 'isCatalogName', 'description' => 'isString', 'description_short' => 'isString', 'available_now' => 'isGenericName', 'available_later' => 'IsGenericName','monChamp' => 'isString');

 

Modification du back-office de Prestashop

Nous allons maintenant devoir créer le champ associé à cette nouvelle variable dans l’administration des produits.

Pour ce faire, allez dans /tabs/AdminProduct.php. et ajouter dans le HTML (à la fin du document) le code suivant :

echo ' '.$this->l('Label de mon champ :').' '; foreach ($this->_languages as $language) echo ' < textarea class="rte" cols="100" rows="20" id="monChamp_'.$language['id_lang'].'" name="monChamp_'.$language['id_lang'].'">'.htmlentities(stripslashes($this->getFieldValue($obj, 'monChamp', $language['id_lang'])), ENT_COMPAT, 'UTF-8').'

 

Ajouter le champ dans la base de données

Enfin, nous devons créer l’endroit ou sera stocké ce contenu dans la base de données.

Ajouter donc le champ monChamp dans la table PREFIXE_product_lang.

Et voilà, votre nouveau champ est créé, il ne nous reste plus qu’a l’appeler dans le template.

 

Affichage du contenu personnalisé

Après avoir ajouter du contenu dans votre nouveau champ texte puis sauvegardé, rendez-vous dans /themes/votre_theme/product.tpl et ajoutez ce code à l’endroit où vous voulez faire apparaître votre contenu :

{$product->monChamp}

 

Voilà pour cette astuce, j’espère qu’elle vous aura été utile. En dérivant légèrement cette méthode, vous pourrez également ajouter un champ dans vos catégories par exemple.