[Prestashop] Choisir un groupe à l’inscription

J’ai eu pour un client à modifier le processus d’inscription au site pour pouvoir placer automatiquement l’inscrit dans un groupe particulier et ainsi profiter des avantages de celui-ci. J’ai pour cela suivit un thread d’un forum (lien) et l’ai adapté à mes besoins.

Le site accueil 2 groupes de visiteurs :

  • des particuliers qui achètent au prix « public »
  • des professionnels qui bénéficient d’une remise globale.

Jusqu’à présent, il fallait que l’administrateur place l’utilisateur dans le groupe Pro manuellement. Désormais, l’utilisateur est inscrit automatiquement dans le bon groupe. De plus, il doit rentrer le nom de sa société ainsi que son numéro de SIRET, modifiables par l’administrateur.

Je vous propose dans la suite de cet article les étapes à suivre pour arriver à ce résultat. Cela vous permettra d’économiser des roros à ne pas acheter un module tout fait.

Attention : je ne suis absolument pas spécialiste de Prestashop. Il se peut que les modifications que j’ai effectué soient « anarchiques » et pas du tout dans la logique de programmation de cette plateforme. De plus, nous allons toucher à des fichiers core de Prestashop, qui ne manqueront sûrement pas d’être écrasés lors de toute update. Ces modifications ce font donc à vos risques et périls. C’est pour cela que je conseille vivement de mettre en commentaires les lignes modifiées pour garder une trace des originales.

Note : la version de Prestashop à laquelle s’appliquent ces modifications est la 1.4.6.2. La procédure sera certainement différente pour d’autres versions. Et gardez à l’esprit que tout est question d’adaptation : ne « copiez-collez » pas ces codes sans vérifier les informations qu’ils contiennent !

Etape 1 : Créer un nouveau groupe

Rendez-vous dans l’admin, onglet Clients, puis Groupe. Ajoutez un nouveau groupe (par exemple Pro) et notez son ID (par exemple, 2).

Etape 2 : Modifier le formulaire d’inscription

Nous allons ajouter de nouveaux champs au formulaire d’inscription :

  • Le type de compte (professionnel ou particulier)
  • Le nom de la société
  • Le numéro SIRET
  • Une checkbox pour signifier que l’utilisateur a renseigné des informations exactes.

Fichier : /themes/votre-theme/authentication.tpl

Trouvez la dernière balise form (~ligne 280), il correspond au formulaire d’inscription. J’ai placé les lignes suivantes dans le premier fieldset, mais vous pouvez les placer où bon vous semble (remplassez 2 par l’id de votre groupe créé précédemment).

<p class="required radio">
    <span>Type de compte</span>
    <input type="radio" name="id_group" id="id_group2" value="2" {if isset($smarty.post.id_group) && $smarty.post.id_group == '2'}checked="checked"{/if} />
    <label for="id_group2">Professionnel</label>
    <input type="radio" name="id_group" id="id_group1" value="1" {if isset($smarty.post.id_group) && $smarty.post.id_group == '1'}checked="checked"{/if} />
    <label for="id_group1">Particulier</label>
</p>

Nom de la société *

Numéro Siret * 14 chiffres

Informations exactes * Je m'engage sur l'honneur à renseigner des informations exactes. En cas de fausses informations, je m'expose à des poursuites pénales.

Pour un effet kikoo (les champs textes et checkbox sont cachés sauf si Professionnel est coché) et pour vérification, ajoutez ce script à la fin du fichier (ou dans un fichier .js appelé par la page) :

if($('input#id_group2').is(':checked'))
    $('.infosPro').show();
else
    $('.infosPro').hide();
$('input[name=id_group]').change(function() {
    if($(this).val() == '2' && !$('.infosPro').is(':visible'))
        $('.infosPro').slideDown(300);
    else
        $('.infosPro').slideUp(300);
});
$('#submitAccount').click(function(){
    if($('input#id_group2').is(':checked') && !$('#infos_exactes').is(':checked')) {
        alert('Vous devez certifier que vos informations sont exactes.');
        return false;
    }
});

Votre formulaire d’inscription est prêt. Ouvrez dans votre navigateur la page /authentication.php pour vérifier que tout fonctionne.

Etape 3 : Modification du contrôleur

Pour récupérer les informations ajoutées dans le formulaire nous allons devoir modifier le contrôleur de l’inscription.

Fichier : /controllers/AuthController.php.

Ajouter les lignes suivantes pour récupérer les informations envoyées en POST (~ ligne 80, après $customer = new Customer()) :

$id_group = (Tools::getIsset('id_group')) ? Tools::getValue('id_group') : 1;
if($id_group == '2') {
    if(!Tools::getValue('societe'))
        $this->errors[] = Tools::displayError('Merci de renseigner le nom de votre société.');
    else
        $customer->societe = $_POST['societe'];

    if(!Tools::getValue('siret') || strlen(Tools::getValue('siret') != 14)
        $this->errors[] = Tools:displayError('Merci de renseigner un numéro SIRET valide à 14 chiffres.');
    else
        $customer->siret = $_POST['siret'];
}

Ces lignes permettent de vérifier les informations, le cas échéant renverront une erreur au formulaire d’inscription.

Modifiez maintenant cette ligne (~170) :

$customer->active = 1;
if(!$customer->add())

en :

$customer->active = 1;
if(!$customer->add(true, true, $id_group))

Etape 4 : Modification du model

Il va falloir modifier la méthode Customer::add() pour prendre en compte l’identifiant du groupe.

Fichier : /classes/Customer.php

Modifier cette ligne (~ 30) :

public $id;

en :

public $id;
public $societe;
public $siret;

Modifier dans la méthode getFields() :

$fields['deleted'] = (int)($this->deleted);

en

$fields['deleted'] = (int)($this->deleted);
$fields['societe'] = pSQL($this->societe);
$fields['siret'] = pSQL($this->siret);

Remplacer la méthode add() par la suivante :

public function add($autodate = true, $nullValues = true, $id_group) {
    $this->birthday = (empty($this->years) ? $this->birthday : (int)($this->years).'-'.(int)($this->months).'-'.(int)($this->days));
    $this->secure_key = md5(uniqid(rand(), true));
    $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_FRONT').'minutes'));

    if(!parent::add($autodate, $nullValues))
        return false;

        $row = array('id_customer' => intval($this->id), 'id_group' => $id_group);
        $result = Db::getInstance()->ExecuteS('UPDATE '._DB_PREFIX_.'customer SET id_default_group = '.$id_group.'  WHERE id_customer = '.intval($this->id));
        $result = Db::getInstance()->AutoExecute(_DB_PREFIX_.'customer_group', array('id_customer' => intval($this->id), 'id_group' => 1), 'INSERT');
        return Db::getInstance()->AutoExecute(_DB_PREFIX_.'customer_group', $row, 'INSERT');
}

Etape 5 : Modification dans la base de donnée

Rendez-vous dans votre base de donnée et ajoutez 2 lignes à la table ps_customer :

  • societe en VARCHAR(32) NULL
  • siret en VARCHAR(14) NULL

A priori, désormais quand un professionnel s’inscrit et remplit toutes ses informations, il sera placé directement dans le bon groupe.

Etape 6 : Modification dans l’administration

Pour que l’administrateur puisse accéder au champs Société et SIRET dans l’ajout ou la modification d’un client.

Fichier : /admin/tabs/AdminCustomers.php

Ajouter dans la méthode displayForm() les lignes suivantes, un peu où bon vous semble (cela génère les formulaires) :

echo '
<label>Professionnel : </label>

Vous pouvez renseigner ces informations à titre informatif.

<label>Société </label>
getFieldValue($obj, 'societe'), ENT_COMPAT, 'UTF-8').'" />
<label>SIRET </label>
getFieldValue($obj, 'siret'), ENT_COMPAT, 'UTF-8').'" />

14 chiffres

Améliorations

Il y a certainement des améliorations à prévoir. En effet, l’utilisateur n’a pas accès à l’information SIRET et Société depuis son compte.

En faire un module administrable serait aussi un plus.

Conclusion

Si vous avez testé ces modifications, n’hésitez pas à me faire un retour en commentaire (positif ou négatif !)

Merci !!

Laisser un commentaire