Snippets

...

PrestaShop

Filtrer suivant le groupe de client

Depuis un contrôleur, un module ou autre, on peut réaliser une condition sur le groupe du client. On identifie le groupe de client par son ID. Dans l'exemple, l'ID est 999. La variable $in_group est à true si le client est dans le bon groupe.

$this->context = Context::getContext();
$in_group = in_array(999, Customer::getGroupsStatic($this->context->customer->id)) ? true : false;

Checker si un client est connecté

Classique, on a régulièrement besoin de s'assurer si un client est bien connecté pour accéder à certaines parties de la boutique. Depuis un contrôleur ou un module, on peut réaliser ce type de condition de la manière suivante :

$this->context = Context::getContext();
if((bool)$this->context->customer->isLogged())
   echo 'Client connecté';
else
   echo 'Client pas connecté';

Récupérer le tableau des langues

Dans bien des cas, il est impératif de récupérer les langues activées ou non sur une boutique. Les lignes de code ci-après permettent de répondre à ce besoin.

// Liste des langues de la boutique
$lang = Language::getLanguages();

// Liste des langues activées de la boutique
$lang = Language::getLanguages(true);

// Liste de toutes les langues de la boutique avec l'ID = 2 (seulement en multi-boutique)
$lang = Language::getLanguages(false, 2);

// Liste des langues activées de la boutique avec l'ID =  2 (seulement en multi-boutique)
$lang = Language::getLanguages(true, 2);

Le fichier class_index.php ne s'actualise pas

Dans les versions 1.6.0.9 et 1.6.1.14 de PrestaShop, le fichier class_index.php ne s'actualise pas. C'est très gênant quand on cherche à faire des overrides de classes ou de contrôlleurs. Il y a une erreur dans le chemin du fichier. Pour corriger ce pépin, il faut modifier le fichier classes/PrestaShopAutoload.php de la manière ci-après. Seulement la ligne 35 est à modifier.

// Originale
const INDEX_FILE = 'cache/class_index.php';

// Modification
const INDEX_FILE = '/cache/class_index.php';

Récupérer les mots-clés (tags) sur PrestaShop 1.7

Dans la version 1.7 de PrestaShop, par défaut, les mots-clés ne sont pas affichés sur la boutique (front-office). On peut bien les ajouter côté administration (back-office), mais rien côté boutique. Ils continuent de fonctionner pour la recherche mais pas d'affichage sur la fiche produit. Pour récupérer les tags sur la fiche produit, il faut passer par un override du contrôleur Product (/override/controllers/front/ProductController.php). Ci-après le contenu de l'override.

<?php
   class ProductController extends ProductControllerCore {
      public function initContent() {
         parent::initContent();
         $this->context->smarty->assign('tags', $this->product->tags[$this->context->language->id]);
      }
   }
?>

Désactiver l'autoresize TinyMce sur PrestaShop

Cette modification modifie le coeur du CMS PrestaShop. Pour effectuer cette modification, il faut modifier dans le fichier /js/admin/tinymce.inc.js la ligne plugins:. Il faut supprimer la dernière valeur autoresize. On se retrouve donc avec la ligne suivante :

plugins: "align colorpicker link image filemanager table media placeholder advlist code table",

L'administration de la boutique (back-office) n'est plus accessible sur PrestaShop 1.7

Dans cette version de PrestaShop, qui embarque le framework Symfony, il arrive que le cache déraille. L'administration de la boutique n'est plus accessible avec un message d'erreur du type comme ci-dessous :

Fatal error: require(): Failed opening required '/home/testtest/www/var/cache/prod/ContainerVpkyxyx/removed-ids.php' (include_path='/home/testtest/www/tools/htmlpurifier/standalone:/home/testtest/www/vendor/pear/pear_exception:/home/testtest/www/vendor/pear/console_getopt:/home/testtest/www/vendor/pear/pear-core-minimal/src:/home/testtest/www/vendor/pear/archive_tar:.:/usr/local/php7.0/lib/php') in /home/testtest/www/var/cache/prod/ContainerVpkyxyx/appProdProjectContainer.php on line 860

Pour remédier au problème, il faut vider les dossiers du cache via le FTP aux chemins ci-dessous :

  • /www/var/cache/dev
  • /www/var/cache/prod

Supprimer une commande sur PrestaShop 1.6 ou 1.7

Dans le cadre du développement d'une boutique, de nombreux tests sont réalisés pour s'assurer du bon fonctionnement du tunnel de commande. En résulte, des commandes de tests. Avant de lancement d'une boutique e-commerce en production, il peut s'avérer pertinent de supprimer ces résidus de tests pour faire plus propre. Il n'existe par défaut pas la possibilité depuis le BO pour le faire : aucun bouton ou lien. Cependant, la méthode est bien disponible dans le code. Il suffit de modifier depuis la page de détails d'une commande le lien de la manière suivante :

  • https://site.com/admin/index.php?controller=AdminOrders&id_order=1&vieworder&token=blabla
  • https://site.com/admin/index.php?controller=AdminOrders&id_order=1&deleteorder&token=blabla

Afficher les différents patterns pour le back-office PrestaShop 1.7

Une page cachée existe et permet d'afficher les différentes solutions proposées en terme de patterns pour concevoir des nouvelles pages/modules en back-office : https://boutique.fr/admin/index.php?controller=AdminPatterns

Renommer le champ passwd dans les erreurs PrestaShop 1.6

Il faut ajouter la traduction dans le fichier au chemin suivant : /translations/fr/fields.php

$_FIELDS['Customer_76a2173be6393254e72ffa4d6df1030a'] = 'Mot de passe';

Mondial Relay erreur API 38 : Numéro de téléphone incorrect

Si le module Mondial Relay renvoie l'erreur API 38 : Numéro de téléphone incorrect, c'est qu'il y a un soucis au niveau du numéro de téléphone du client dans les adresses. Il faut regarder l'id_address lié à la commande. Ensuite fouiller dans la table ps_address et faire les modifications.

Rediriger le client sur la page mon compte après l'inscription

Après une inscription en front-office sur une boutique PrestaShop 1.7, le client est redirigé sur la page d'accueil. Si on souhaite le rediriger sur la page mon compte, il faut ajouter la ligne de code ci-après dans le fichier /themes/templates/customer/_partials/customer-form.tpl.

<input type="hidden" name="back" value="{$urls.pages.my_account}" />

Erreur lors de l'installation de PrestaShop, étape Installation des modules Addons

Lors de l'installation de PrestaShop, il arrive qu'on rencontre une erreur à l'étape de l'installation des modules Addons. On peut obtenir les messages suivants :

  • Error sent by Addons. You may need to be logged
  • Impossible d'installer le module "XXX"

En version 1.7, on peut également obtenir une trace du problème dans le fichier au chemin /var/logs/prod.log. On obtient alors un message du type : Data from PrestaShop Addons is invalid, and cannot fallback on cache.

Ce problème peut provenir de plusieurs sources. La première, la plus évidente, le serveur de addons.prestashop.com est KO, et il est impossible de télécharger les modules depuis ce serveur pour l'installation. La deuxième, seul un ou N modules posent soucis et bloquent l'installation. Dans le premier cas, il faudra patienter le rétablissment du serveur pour installer. Dans le deuxième cas, il est possible d'aller modifier les fichiers d'installatiosn pour exclure les modules qui posent soucis. Pour ce faire, il faut modifier le fichier suivant : /prestashop/src/PrestaShopBundle/Install/Install.php.

Il faut modifier deux fonctions : installModules() et installModulesAddons(). Au niveau de la boucle foreach() de chaque fonction, il faut ajouter la ligne de code suivante : if($module_name == 'XXX') continue;. Il faut bien évidemment remplacer XXX par le nom du module qui pose problème. Si plusieurs modules impactes négativement l'installation de PrestaShop, il faudra alors modifier la condition pour les ajouter tous.

Erreur Bad Request : Your browser sent a request...

Rencontrer cette erreur n'a rien d'agréable. Plus en détails, l'erreur affiche le texte suivant :
Your browser sent a request that this server could not understand. Size of a request header field exceeds server limit.

Pour résoudre, cette erreur, une seule solution : vider le cache et effacer tous les cookies du domaine où est installé PrestaShop.

Rechercher les commandes dont le client a été supprimé

Il est possible dans PrestaShop de supprimer un compte client. Il est important de vérifier avant de supprimer un compte client que ce dernier n'a pas réalisé de commande. En effet, si ce dernier a validé des commandes (ps_orders), cela va provoquer une incohérence. On va retrouver des commandes sans client. Pour identifier les commandes qui ne possèdent plus de client, on peut utiliser la requête SQL ci-dessous :

SELECT o.id_order, c.id_customer FROM ps_orders o LEFT JOIN ps_customer c ON (c.id_customer = o.id_customer);

Si la colonne id_customer a pour valeur NULL alors le compte client de la commande a été supprimé.

WordPress

Désactiver la corbeille

Pour limiter l'espace qu'occupe votre base de données ou pour toute autre raison, vous pouvez désactiver la corbeille. Ainsi, un article supprimé ne passera pas par l’étape corbeille mais sera détruit immédiatement. Il faut ajouter la ligne ci-dessous dans le fichier wp-config.php qui se situe à la racine de votre site. Vous pouvez également décider de la vider de manière récurrente, comme par exemple avec la deuxième ligne. Cette dernière vide la corbeille toutes les semaines.

define('EMPTY_TRASH_DAYS', 0);
define('EMPTY_TRASH_DAYS', 7);

Impossible d'afficher la boîte méta champs personnalisés dans WordPress

Dans ACF version 5.5.13, ils ont ajouté un paramètre pour supprimer la métabox de champ personnalisé WordPress par défaut afin d'accélérer les temps de chargement sur la page de publication. L'idée étant que vous ne devriez pas avoir besoin de la métabox par défaut puisque vous utilisez ACF. Il y a bien une option d'écran qui permet de faire apparaitre cette boite mais avec la version d'ACF rien se passe.

Cependant, si vous devez activer la métabox de champ personnalisé WordPress par défaut, vous devez ajouter le code suivant au fichier functions.php de votre thème WordPress.

Cela résoudra le problème manquant de l'option de champs personnalisés dans WordPress. Car il y a bien une option d'écran qui permet de faire apparaitre cette boite mais avec la version d'ACF rien se passe.

add_filter('acf/settings/remove_wp_meta_box', '__return_false');

MySQL

Afficher tous les noms des tables d'une base de données

SHOW tables;

Dupliquer une table avec les données

CREATE TABLE table_nouveau LIKE table_a_dupliquer;
INSERT INTO  table_nouveau SELECT * FROM table_a_dupliquer;

PHP

Afficher la date et l'heure du jour en français en PHP

<?php 
   date_default_timezone_set('Europe/Paris');
   setlocale(LC_TIME, 'fr_FR');
   echo utf8_encode(strftime('Nous sommes le %A %e %B %Y et il est %Hh%M', time()));
?>
Résultat
Nous sommes le mercredi 29 septembre 2021 et il est 04h30

Compter rapidement le nombre de lignes d'un fichier CSV en PHP

<?php
   $n = count(file('fichier.csv'));
?>

Afficher un champ input de type number en acceptant les nombres décimaux (float)

<input type="number" step="0.01" />