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é (PrestaShop 1.6)

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

Rechercher les produits via l'EAN13 (code-barre) dans la page Stock en back-office

Depuis toujours dans l'administration d'une boutique PrestaShop en 1.7, il est impossible de rechercher sur la page Stock un produit via son code EAN13 (code-barre). Pour modifier ce comportement, il faut toucher aux fichiers du coeur. Une PR (Pull request) est en préparation pour faire évoluer la solution dans ce sens.

  • /src/PrestaShopBundle/Entity/Repository/StockRepository.php
  • /src/PrestaShopBundle/Entity/Repository/StockManagementRepository.php
  • /src/PrestaShopBundle/Api/QueryParamsCollection.php

QueryParamsCollection.php, ajouter '{product_ean13} LIKE :keyword_%d OR ' . dans la fonction appendSqlSearchFilter().

StockManagementRepository.php, ajouter '{product_ean13}' => 'product_ean13', dans la fonction having().

StockRepository.php, ajouter IF(COALESCE(p.ean13, "") = "", "N/A", p.ean13) AS product_ean13, dans la fonction selectSql().

Pour le côté FO, il faut aller regarder dans les fichiers /admin/themes/new-theme/js/app/pages/stock/ avec le fichier product-line.vue et products-table.vue

Traduction dans \src\PrestaShopBundle\Translation\Api\StockApi.php

Le module statsvisits ne fonctionne pas

Dans les anciennes versions 1.6 de PrestaShop, il arrivait que le module ne fonctionne pas bien. Il faut modifier avec les modifications suivantes :

private $query = '';

par

private $query = array();

La recherche sur PrestaShop 1.6 ne fonctionne plus

Il arrive sur certaines boutiques PrestaShop en version 1.6 que les résults de recherches ne s'affichent plus. Pour résoudre ce problème, il y a deux solutions à essayer :

  1. Le plus simple est d'essayer de reconstruire l'index intégralement depuis le back-office (Préférences > Recherche).
  2. Si la première solution n'a pas fonctionné, il est peu-être nécessaire de vider manuellement deux tables : ps_search_index et ps_search_word. Une fois cette action réalisée, relancer la construction de l'index de recherche intégralement.

Ajouter une clé DKIM pour l'authentification des emails sur PrestaShop 1.7

Ajouter une clé DKIM (DomainKeys Identified Mail) à un serveur pour l'envoi d'e-mails offre plusieurs avantages en termes de sécurité et de fiabilité des e-mails sortants. DKIM permet d'authentifier l'identité de l'expéditeur d'e-mails en associant un nom de domaine à chaque message envoyé. Cela aide à vérifier que l'e-mail provient effectivement du domaine qu'il prétend représenter. L'authentification DKIM aide également à améliorer la délivrabilité des emails.

Avant de modifier PrestaShop, il est nécessaire de générer une paire de clé publique/privée. Vous pouvez utiliser le service suivant : SocketLabs.

Exemple avec le domaine : supertest.io

Il faut s'assurer avant de choisir un sélecteur que ce dernier est disponible. Pour l'exemple, nous utiliserons dkim.

Il est conseillé d'utiliser une longueur de clé de 2048 minimum. Une fois le couple de clé généré, il faut ajouter l'enregistrement TXT dans la zone DNS. C'est cette enregisrement qui contient la clé publique utile pour le déchiffrement. Dans notre exemple, l'entrée TXT doit être placée à l'emplacement : dkim._domainkey.supertest.io

La clé privée sera utile dans PrestaShop. Dans notre exemple, elle est stockée dans le fichier : dkim.key

Il est nécessaire d'override la classe Mail.php.

/* Construct multiple recipients list if needed */
$message = new Swift_Message();

$privateKey = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/../dkim.key');
$signer = new Swift_Signers_DKIMSigner(
    $privateKey,
    'supertest.io',
    'dkim'
);
$message->attachSigner($signer);

Deux liens utiles pour vérifier les enregistrements dans la zone DNS et vérifier le bon fonctionnement :

Impossible de modifier les tranches de poids d'un transporteur sous PrestaShop 1.7

Il arrive que PrestaShop s'emmêle les pinceaux dans les enregistrements des tranches de poids ou de prix pour un transporteur. Pour corriger le problème, il suffit de vider les tranches pour le transporteur sélectionné dans les tables : ps_range_weight et ps_range_price.

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 11 décembre 2024 et il est 20h44

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

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

Calculer le temps d'execution d'un script PHP

<?php
   $time_start = microtime(true);

   // Coeur du script PHP

   $time_end = microtime(true);
   $time_total = $time_end - $time_start;

   $page_load_time = number_format($time_total, 3);
   echo 'Début du script : '.date('H:i:s', $time_start).'<br>';
   echo 'Fin du script : '.date('H:i:s', $time_end).'<br>';
   echo 'Temps exécution : ' . $page_load_time . ' s';
?>

Pourquoi la variable $_POST est vide ?

Il y a de multiples raisons qui peuvent expliquer pourquoi la variable $_POST est vide en PHP. Une raison peu évidente au premier abord, provient de la configuration PHP. En effet, si les données envoyées par l'utilisateur dépassent la limite des 3 variables de configuration suivante, alors $_POST devient vide.

  • max_input_vars
  • upload_max_filesize
  • post_max_size

Obtenir le chemin absolu d'un dossier en PHP

Deux solutions équivalentes :

<?php
    echo realpath($_SERVER["DOCUMENT_ROOT"]);
    echo __DIR__;
?>

Trouver les URL dans une chaine de caractères et les transformer en lien en PHP

<?php
    $txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit https://aymeric-auberton.fr esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
    $txt_with_links = preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s\<])?)?)@', '<a href="$1" rel="nofollow" target="_blank">$1</a>', $txt);
    echo $txt;
    echo '<hr />';
    echo $txt_with_links;
?>
Résultat
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit https://aymeric-auberton.fr esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit https://aymeric-auberton.fr esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

HTML

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

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

Web

Créer un fichier au format .pem

Les fichiers au format .pem sont utilisés pour stocker des clés cryptographiques et généralement les certificats SSL. Ils contiennent notamment les clés privées associées au certificat nécessaire au bon fonctionnement. Pour obtenir un fichier .pem correct, il est nécessaire de renseigner plusieurs clés dans un ordre précis. Ci-après l'ordre :

-----BEGIN RSA PRIVATE KEY-----
(Clé privée : domain.key)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(Certificat SSL principal : domain.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Certificat intermédiaire : authority.crt)
-----END CERTIFICATE-----
-----CERTIFICAT DE DÉBUT-----
(Certificat racine : root.crt)
-----END CERTIFICATE-----

Le certificat de racine n'est pas obligatoire. Une fois le fichier correctement concaténé, le fichier .pem est prêt à être utilisé sur un hébergement web.

Le service suivant permet de s'assurer le bon fonctionnement du certificat SSL : SSL Labs.