Champ téléphone obligatoire dans Prestashop

Champ téléphone obligatoire dans Prestashop

Petite astuce si vous souhaitez forcer le numéro de téléphone obligatoire dans une adresse client. Il suffit de créer une surcharge de la classe AddressFormatCore :

<?php
// override/classes/AddressFormat.php

class AddressFormat extends AddressFormatCore
{
    public static function getFieldsRequired()
    {
        $return = parent::getFieldsRequired();
        $return[] = 'phone';

        return $return;
    }
}

Ne pas oublier de vider le cache pour prendre en compte les modifications.

Champ téléphone obligatoire dans Prestashop

Créer un employé « programmatiquement »

Créer un compte

Avec un acces ssh, il est très facile de créer un compte employé. Commencez par créer un fichier createEmployee.php :

#!/usr/bin/env php
<?php
require(dirname(__FILE__) . '/config/config.inc.php');
try {
    $employee = new Employee();
    $employee->firstname = "Nicolas";
    $employee->lastname = "PETITJEAN";
    $employee->id_lang = (int)Configuration::get('PS_LANG_DEFAULT');
    $employee->id_profile = _PS_ADMIN_PROFILE_;
    $employee->default_tab = Tab::getIdFromClassName('AdminDashboard');
    $employee->email = "nicolas@domain.com";
    $employee->passwd = Tools::encrypt("randompassword");
    $employee->save();
    echo "\nEmployee added. Id: {$employee->id}\n";
} catch (Exception $exception) {
    echo "\n{$exception->getMessage()}\n";
}

Exécutez simplement ce code en ligne de commande :

$ ./createEmployee.php
Employee added. Id: 43

Supprimer un compte

Le code précédent fourni l’Id du compte créé. On peut donc facilement écrire ce bout de code pour supprimer le compte employé :

#!/usr/bin/env php
<?php
require(dirname(__FILE__) . '/config/config.inc.php');
try {
    $employee = new Employee(43);
    $employee->delete();
    echo "\nEmployee deleted.\n";
} catch (Exception $exception) {
    echo "\n{$exception->getMessage()}\n";
}
Champ téléphone obligatoire dans Prestashop

Utiliser des transactions dans Prestashop

Un des gros points faible de l’actuel gestionnaire de base de données est qu’il ne propose pas la possibilité de faire des transactions. Voyons comment simplement remédier à ce problème.

Dans un contrôleur

Dans un contrôleur, car c’est ici que la plupart du temps on fait des appels vers la base de données, l’implantation est hyper simple :

public function fooAction()
{
    $db = Db::getInstance();
    $db->query("SET AUTOCOMMIT = 0");
    $db->query("START TRANSACTION");
    
    try {
        // Awesome stuff here
    } catch(Exception $e) {
        // Rollback database
        $db->query("ROLLBACK");
    }

    // If we reach this point, save data
    $db->query("COMMIT");
}

Références externes

Champ téléphone obligatoire dans Prestashop

Connexion impossible au BO

Les symptômes sont frustrants : on se connecte au back-office et Prestahop ré-affiche le formulaire de connexion sans aucuns messages d’erreur.

Le problème vient du fait que Prestashop vérifie l’intégrité du cookie en vérifiant l’ip du serveur à partir du nom de domaine. Il est possible que pour diverses raisons, cette vérification échoue. Pour accéder de nouveau back office normalement, il faut modifier le Core de Prestashop (Boo c’est mal), à savoir Employee::isLoggedBack dans le fichier classes/Employee.php :

/* classes/Employee.php */

public function isLoggedBack()
{
    if(!Cache::isStored('isLoggedBack' . $this->id)) {
        /* Employee is valid only if it can be load and if
        cookie password is the same as database one */
        $result = (
            $this->id
            && Validate::isUnsignedId($this->id)
            && Employee::checkPassword($this->id, Context::getContext()->cookie->passwd)
            /*&& (
                !isset(Context::getContext()->cookie->remote_addr)
                || Context::getContext()->cookie->remote_addr == ip2long(Tools::getRemoteAddr())
                || !Configuration::get('PS_COOKIE_CHECKIP'))*/
        );
        Cache::store('isLoggedBack' . $this->id, $result);

        return $result;
    }

    return Cache::retrieve('isLoggedBack' . $this->id);
}

Il suffit de commenter la condition qui vérifie l’ip du nom de domaine.

Champ téléphone obligatoire dans Prestashop

Lenteur extrême du back office

Depuis quelques temps, l’api de Prestashop a quelques soucis, ce qui (peut) ralentir le back-office (avec une erreur 500 dans le pire des cas). On est même gratifié d’un timeout dans les logs, ce qui n’aide pas vraiment. Pas de panique, la solution est simple. On commence par faire un tour dans classes/Tools.php, et on modifie la fonction addonsRequest comme suit :

public static function addonsRequest($request, $params = array())
{
    return false;
    ...
}

Ensuite, on peut même supprimer le plugin Expertise PrestaShop (gamification).

Champ téléphone obligatoire dans Prestashop

Prestashop 1.7, multi-boutique et ip étrangères

Le nec plus ultra pour faire du e-commerce à l’international est d’avoir des urls étrangères pour chaque langue étrangère. Mais ce n’est pas suffisant. Il faut aussi associer une ip étrangère à chaque domaine (par exemple, une ip anglaise pour le domaine anglais dans le cas de la langue anglaise). Dans Prestashop, le recours au multi-boutique est LA solution.
Mais là apparait un soucis de taille : toutes les langues sont disponibles dans toutes les boutiques, et en plus elles sont toutes indépendantes (comprenez : si vous modifiez le français de la boutique anglaise, cela n’affectera pas le français de la boutique française). Voyons comment parvenir à ne garder qu’une langue par boutique.

Installation

La première étape est simple :

  • activer le multi-boutique dans Configurer > Paramètres de la boutique > Paramètres Généraux
  • ensuite on crée au moins une boutique supplémentaire avec une url complètement différente

Et voilà le multi-boutique est actif.

Une langue par boutique

Supposons que nous ayons deux langues installées (anglais et français) et deux boutique, A étant la boutique française (url: http://www.boutiqueA.fr) et B la boutique anglaise (url: http://www.boutiqueB.en).  Comme je le disais plus haut, les deux langues sont disponibles dans les deux boutiques, à savoir qu’un produit peut s’afficher :

  • en français dans la boutique française (http://www.boutiqueA.fr/fr/produit)
  • en anglais dans la boutique française (http://www.boutiqueA.fr/en/product)
  • en français dans la boutique anglaise (http://www.boutiqueB.en/fr/product)
  • en anglais dans la boutique anglaise (http://www.boutiqueB.en/en/product)

Ce qui va donner 4 urls différentes là où on en veut que 2. Pas idéal pour le référencement ! La solution est simple, il suffit de rediriger les pages (dans un .htaccess) anglaises de  la boutique française vers la boutique anglaise (autrement dit, les pages anglaises de la boutique A vers la boutique B) :

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.(boutiqueA.fr)$
    RewriteRule ^en/(.*)$ http://www.boutiqueB.en/en/$1 [L,R=301]
</IfModule>

Et on fait le même travail avec les pages françaises : on rediriger les pages françaises de  la boutique anglaise vers la boutique françaises (autrement dit, les pages françaises de la boutique B vers la boutique A) :

<IfModule mod_rewrite.c>
    RewriteEngine on
    # Redirect english pages
    RewriteCond %{HTTP_HOST} ^www.(boutiqueA.fr)$
    RewriteRule ^en/(.*)$ http://www.boutiqueB.en/en/$1 [L,R=301]
    # Redirect french pages
    RewriteCond %{HTTP_HOST} ^www.(boutiqueB.en)$
    RewriteRule ^fr/(.*)$ http://www.boutiqueA.fr/fr/$1 [L,R=301]
</IfModule>

Une 3ème boutique

Quid d’une troisième boutique ? Ajoutons la boutique C, en italien. On comprend mieux le rôle des parenthèses :

<IfModule mod_rewrite.c>
    RewriteEngine on
    # Redirect english pages
    RewriteCond %{HTTP_HOST} ^www.(boutiqueA.fr|boutiqueC.it)$
    RewriteRule ^en/(.*)$ http://www.boutiqueB.en/en/$1 [L,R=301]
    # Redirect french pages
    RewriteCond %{HTTP_HOST} ^www.(boutiqueB.en|boutiqueC.it)$
    RewriteRule ^fr/(.*)$ http://www.boutiqueA.fr/fr/$1 [L,R=301]
    # Redirect italian pages
    RewriteCond %{HTTP_HOST} ^www.(boutiqueB.en|boutiqueA.fr)$
    RewriteRule ^it/(.*)$ http://www.boutiqueC.it/it/$1 [L,R=301]
</IfModule>

Langue par défaut

Il nous reste un dernier réglage : nous voulons que chaque boutique  affiche sa langue par défaut :

  • le français pour la boutique française
  • l’anglais pour la boutique anglaise
  • l’italien pour la boutique italienne

Prestashop a la mauvaise manie de détecter la langue du navigateur et de servir cette langue. Un petit tour dans International > Localisation section paramètres