Astuces Prestashop 1.6 en vrac

By 24 mai 2017Prestashop, Tutoriels

Au fil du temps, nous avons accumulé tout un tas de petites astuces que nous conservons en lieu sûr pour ne pas réinventer la roue à chaque boutique… 😉 Nous vous les partageons donc aujourd’hui avec vous, il s’agit d’un work in progress que nous allons enrichir au fil du temps (disponible…), n’hésitez pas à en rajouter dans les commentaires.

Afficher le contenu d’une variable dans vos templates

Pour débuguer et afficher le contenu d’une variable dans une template (.tpl) : {$mavariable|print_r}

Web service

Un problème pour vérifier si votre webservice est bien activé ? Il faut ajouter ces lignes dans votre .htaccess à la racine de votre boutique Prestashop :

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

Pour tester ensuite, rendez-vous dans votre boutique à l’url : http://maboutique.com/api/customers/1?ws_key=votre_numero_ici

Activer tous les pays et toutes les zones dans le Back-Office

Si vous voulez faire ça à la main, c’est interminable 😉 Donc, le mieux est de passer par PhpMyAdmin et de saisir les requêtes SQL suivantes :

UPDATE `PREFIX_country` SET `active`=1
UPDATE `PREFIX_zone` SET `active`=1

Activer le débugage de votre boutique

Dans le fichier config/defines.inc.php mettre le flag _PS_MODE_DEV_ à true

/* Debug only */
if (!defined('_PS_MODE_DEV_')) {
    define('_PS_MODE_DEV_', true);
}

Attention : pensez à désactiver sur une boutique en production…

Comment savoir quelle template est utilisée sur une page de votre boutique en ligne ?

Aujourd’hui, une petite astuce bien pratique pour savoir quelle template est utilisée dans la page affichée sous vos yeux. Nous avons ajouté un accordéon Bootstrap pas forcément utile ici mais ça fait l’occasion 😉

Ouvrez le fichier /shop/classes/module/Module.php et cherchez la fonction
public function display($file, $template, $cache_id = null, $compile_id = null)

Après la ligne $this->resetCurrentSubTemplate($template, $cache_id, $compile_id); ajoutez le code

if($result && _PS_MODE_DEV_ === true){
 $tpl_path = $this->getTemplatePath($template);
  $result = '<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-hand-right"></span></a><div class="nav-collapse collapse" style="float:left;background:#f83; color:#000;border:1px solid black; padding:4px; z-index:100;">' . $tpl_path . '</div>' . $result;
}
return $result;

Activez ensuite le mode dev dans /shop/config/defines.inc.php (voir astuce précédente)

Désactiver tous les produits en promotion

Depuis PhpMyAdmin, voici la requête à insérer :

UPDATE ps_product_shop set on_sale=0;

Transformer les noms de vos clients en majuscules automatiquement

Avec un override bien propre : créez un fichier ici override/classes/Customer.php. Ici, on surcharge la classe Customer. Voici le contenu de ce nouveau fichier qui contient deux méthodes surchargées :

<?php
class Customer extends CustomerCore {
public function add($auto_date = true, $null_values = false){
$this->firstname = ucfirst($this->firstname); // on capitalise la première lettre du prénom
$this->lastname = mb_strtoupper($this->lastname);
return parent::add($auto_date, $null_values);
}

public function update($null_values = false){
$this->firstname = ucfirst($this->firstname);
$this->lastname = mb_strtoupper($this->lastname);
return parent::update($null_values);
}
}

Ensuite, vous pouvez avoir besoin de mettre à jour les valeurs déjà présentes dans votre base de données. Voici la requête SQL à utiliser depuis PhpMyAdmin

UPDATE ps_customer SET lastname = UCASE(lastname)

Malheureusement, il n’existe pas d’équivalent MySql pour le ucfirst() de PHP… Donc, si vous ne voulez pas tout faire à la main dans PhpMyAdmin, il vous faudra écrire une petite fonction en php qui récupère les valeurs de votre base et les convertit 😉

Comment réordonner les produits ?

Il suffit d’aller dans le back-office et d’afficher la liste de vos produits en utilisant le filtre Filtrer par catégorie. Choisissez ensuite la catégorie au sein de la quelle vous voulez ordonner vos produits et maintenant une nouvelle colonne Position est visible qui vous permet par simple Drag’n’Drop de changer l’ordre ! Simple non ?

Comment surcharger un fichier JS dans un module ?

La surcharge (override en Anglais) est un (bon) principe qui permet de customiser un module ou une template sans toucher aux fichiers originaux ce qui pourrait être risqué en cas de mise à jour… La procédure exacte est assez bien décrite dans la doc officielle mais il y a un problème cependant avec les fichiers javascript. Voici la solution, il faut placer le fichier JS dnas le chemin suivant en recréant au besoin les répertoires manquants : boutique/themes/votre_theme/js/modules/votre_module/views/js/votre_fichier.js

Élémentaire non ? 😉

Comment mettre à jour le prix de vos produits en masse ?

Il y a 2 tables à mettre à jour (pour le multistore). Si vous n’avez qu’une boutique, les 2 tables sont remplies avec des données identiques 😉

Ici on augmente tous les prix de 12% pour la catégorie 1.

UPDATE ps_product_shop SET price = price*1.12 WHERE id_category_default=1
UPDATE ps_product SET price = price*1.12 WHERE id_category_default=1

Comment intégrer Fancybox à vos pages CMS ?

On suppose que Fancybox est déjà chargé dans l’en-tête de la page, voici le code à insérer dans /themes/votretheme/js/global.js

$(document).ready(function(){
    $(".fancybox").fancybox();
});

Ensuite, dans votre page cms, passez en mode code source et ajoutez la classe suivante sur un lien

<a href="image.jpg" class="fancybox"><img src="image.jpg" class="img-thumbnail" /></a>

Et voilà, vos images s’affichent dans une jolie popup 😉

Edit : si vous devez charger Fancybox, c’est un peu plus compliqué… Pour faire propre, il faudrait créer une surcharge du contrôleur CMSController.php dans override/controllers/front/

public function setMedia(){
    parent::setMedia();
    $this->addJqueryPlugin('fancybox');
}

Valider un numéro de téléphone à l’inscription

Un client nous a demandé de rendre obligatoire la saisie d’un numéro de téléphone français. Devant la variété des possibilités de saisie (1234567890, +33123456789, 12-34-56-78-90 etc.), nous avons choisi d’obliger le visiteur à saisir 10 chiffres (et seulement 10). Voici la démarche à suivre.

Fichier classes/Customer.php

Vérifiez que vous avez bien la dernière ligne du code ci-après

'fields' => array(
'secure_key' => array('type' => self::TYPE_STRING, 'validate' => 'isMd5', 'copy_post' => false),
'lastname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32),
'firstname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32),
'email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true, 'size' => 128),
'telephone' => array('type' => self::TYPE_STRING, 'validate' => 'isPhoneNumber', 'required' => true, 'size' => 32),

Cette ligne demande à ce que le téléphone soit obligatoire (‘required’) et invoque la méthode isPhoneNumber(), que nous allons modifier maintenant.

Fichier classes/Validate.php remplacer

public static function isPhoneNumber($number)
{
    return preg_match('/^[+0-9. ()-]*$/', $number);
}

par

public static function isPhoneNumber($number)
{
    return preg_match('/^[0-9]{10}$/', $number);
}

Pour que le formulaire valide au fur et à mesure de la saisie, il faut aussi modifier le fichier javascript js/validate.js

Remplacez

function validate_isPhoneNumber(s)
{
   var reg = /^[+0-9. ()-]+$/;
   return reg.test(s);
}

par

function validate_isPhoneNumber(s)
{
    var reg = /^[+0-9. ()-]+$/;
    return (reg.test(s) && s.length == 10);
}

Pour finir, dans themes/default-bootstrap/authentication.tpl, on indique au visiteur ce qui est attendu 😉

<div class="required form-group">
<label for="telephone" class="required"> {l s='Téléphone (<strong>10 chiffres exactement sans espaces ni tirets !</strong>)'}</label>
<input type="texte" class="is_required validate form-control" data-validate="isPhoneNumber" id="telephone" name="telephone" value="{if isset($smarty.post.telephone)}{$smarty.post.telephone}{/if}" />
</div>

Et voilà, comme toujours, pour faire propre, il vaudrait mieux surcharger… Pourquoi ne le faisons-nous pas ? Parce qu’on ne mettra pas à jour le core Prestashop 😉

À suivre…

Artcompix

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.