Comment vérifier l’âge et la date du profil client sur Prestashop ?

Prestashop
1.7

Difficulté
1/4

Durée
20′

 

Vous souhaitez vérifier l’âge et la date de vos clients Prestashop? Vous voulez inclure la date de naissance comme étant un champ obligatoire pour les inscriptions et dans l’interface client au niveau des données personnelles? Le champ date est de plus en plus utilisé par les transporteurs et les modules de paiements. Si ce champ est renseigné ils vérifient qu’il s’agit bien d’une date correctement formée. Voilà pourquoi en garantir le contenu est très important. Nous vous proposons d’y parvenir par la création d’un module Prestashop simple expliqué pas à pas.

Dans ce module nous allons faire un override de la classe Validate pour va s’assurer de la validation du format du champ date, créer un formulaire de configuration pour le back-office et se greffer à un hook pour rendre notre champ date de naissance obligatoire.

Voici les prérequis nécessaires pour suivre ce tutoriel facilement :

  • savoir créer un module de base de Prestashop (méthode : __construct, install, uninstall). Doc Prestashop
  • connaître la structure de fichiers et le fonctionnement de Prestashop. Doc prestashop
  • bien connaitre le langage PHP

Étapes essentielles

pour aboutir à ce résultat il faudra :

  1. Install du module
  2. Vérifier l’âge et la date de vos clients
    • créer l’override de la classe Validate
    • créer notre formulaire pour le back-office et gérer son fonctionnement
  3. Inclure la date de naissance comme étant un champ obligatoire
    • implémenter le hook AdditionalCustomerFormFields

1/ Install du module

Création des variables et installation du hook nécessaire pour ce module. Nous aurons besoin de 3 champs, l’âge minimum, l’âge maximum et un booléen pour la date de naissance obligatoire.

code :

  public function install()
  {
    return parent::install()
      && Configuration::updateValue('MY_AGE_MIN', 18)
      && Configuration::updateValue('MY_AGE_MAX', 92)
      && Configuration::updateValue('MY_REQBIRTHDAY', 0)
      && $this->registerHook('additionalCustomerFormFields');
  }

Comme vous pouvez le voir nous avons fait le choix de mettre des valeurs par défaut  dans les champs de notre formulaire.
Du fait de l’implémentation du hook, pour que ces modifications soient bien prises en compte il faudra réinitialiser le module si vous l’aviez déjà installé sur votre site.

2/ Vérifier l’âge et la date de vos clients

Création de l’override de la Classe Validate

Il est nécessaire de créer un override de la class Validate qui étend de ValidateCore pour vérifier la validité de la date de naissance. Pour cela on crée notre dossier override dans notre architecture de module avec le dossier classes et le fichier Validate.php. Nous allons overrider la méhode isBirthDate($date, $format = ‘Y-m-d’) qui vérifie la validité du champs date. Elle se trouve dans classes/Validate. Nous créons une variable $newDate au format date et deux nouveaux objets dateTime() pour créer un intervalle. L’un sera la date de naissance, l’autre la date du jour. La différence de ces deux dates sera notre variable $diff pour laquelle nous calculerons le delta avec $delta  = $diff->format(‘%y’);.
Nous donnerons également la valeur de configuration à nos champs MY_AGE_MIN et MY_AGE_MAX. Nous vérifierons si le delta est supérieur à $ageMax et inférieur à $ageMin pour que la méthode retourne que la date n’est pas valide.

exemple de code :

     /**
     * Check for birthDate validity.
     *
     * @param string $date birthdate to validate
     * @param string $format optional format
     *
     * @return bool Validity is ok or not
     */
    public static function isBirthDate($date, $format = 'Y-m-d')
    {
        if (empty($date) || $date == '0000-00-00') {
            return true;
        }
      
        $today  = new DateTime();
        $newDate = date("Y-m-d", strtotime($date));
        $birth  = new DateTime($newDate);
        $diff   = $today->diff($birth);
        $delta  = $diff->format('%y');
        $ageMin = Configuration::get('MY_AGE_MIN');
        $ageMax = Configuration::get('MY_AGE_MAX');
        $d = DateTime::createFromFormat($format, $date);

        if (!empty(DateTime::getLastErrors()['warning_count']) || false === $d || $delta > $ageMax || $delta < $ageMin) {
            return false;
        }
        return $d->getTimestamp() <= time();
    }

Créer notre formulaire pour le back-office et gérer les paramètres

Notre formulaire aura 3 champs. Le premier sera pour l’âge minimum, le second sera pour l’âge maximum et le dernier pour rendre ou non obligatoire le champ date de naissance. Les deux premiers champs seront de type ‘text’ et le troisième sera de type ‘switch’. Vous pouvez bien sûr retrouver d’autres types de champs sur la doc de Prestashop

Voici un exemple de code du formulaire :

public function displayForm()
  {
    // Récupère la langue par défaut
    $defaultLang = (int)Configuration::get('PS_LANG_DEFAULT');
    // Initialise les champs du formulaire dans un tableau
    $form = array(
      'form' => array(
        'legend' => array(
          'title' => $this->l('Settings'),
        ),
        'input' => array(
          array(
            'type' => 'text',
            'label' => $this->l('Age minimum'),
            'name' => 'MY_AGE_MIN',
            'size' => 20,
            'required' => true
          ),
          array(
            'type' => 'text',
            'label' => $this->l('Age maximum'),
            'name' => 'MY_AGE_MAX',
            'size' => 20,
            'required' => true
          ),
          array(
            'type' => 'switch',
            'label' => $this->l('Require birthday:'),
            'name' => 'MY_REQBIRTHDAY',
            'values' => array(
              array(
                'id' => 'birthday_on',
                'value' => 1,
                'label' => $this->l('Yes')
              ),
              array(
                'id' => 'birthday_off',
                'value' => 0,
                'label' => $this->l('No')
              ),
            ),
          ),
        ),
        'submit' => array(
          'title' => $this->l('Save'),
          'name'  => 'btnSubmit'
        )
      ),
    );

    $helper = new HelperForm();
    // Module, token et currentIndex
    $helper->module = $this;
    $helper->name_controller = $this->name;
    $helper->token = Tools::getAdminTokenLite('AdminModules');
    $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;
    // Langue
    $helper->default_form_language = $defaultLang;
    // Charge la valeur de NS_MONMODULE_PAGENAME depuis la base
    $helper->fields_value['MY_AGE_MIN']     = Configuration::get('MY_AGE_MIN');
    $helper->fields_value['MY_AGE_MAX']     = Configuration::get('MY_AGE_MAX');
    $helper->fields_value['MY_REQBIRTHDAY'] = Configuration::get('MY_REQBIRTHDAY');
    return $helper->generateForm(array($form));
  }

Nos trois champs apparaissent dans la configuration de notre module. Pour gérer le fonctionnement lors l’utilisation du formulaire, il faut instancier,  dans une méthode ici getContent(), une variable résultat à null et tester si le bouton de sauvegarde du formulaire a été soumis. Si oui on peut dire que nos valeurs ageMin et ageMax (champs 1 et 2) sont égal à la valeur rempli dans le formulaire. Cette valeur sera de type string. Ensuite nous testerons si nos deux champs existent et ne sont pas vides, qu’ils aient une valeur numérique et surtout que la valeur converti en integer soit égale à la valeur numérique de la chaîne de caractère. Si oui, on met à jour la valeur des champs du formulaire et on renvoie le message « configuration sauvegardée » , sinon on affiche un message d’erreur avec notre variable résultat. Pour finir nous ferons un dernier test pour le cas où un ageMin est supérieur à un ageMax. Si cela se vérifie, on affiche « l’age minimum ne peut pas être supérieur à l’age maximum ». Enfin il ne reste qu’à retourner notre variable résultat et le formulaire.

voici un exemple de code pour la gestion des messages d’erreurs dans le back-office :

  public function getContent()
  {
    $output = null;
    if (Tools::isSubmit('btnSubmit')) {
      $ageMin = trim(strval(Tools::getValue('MY_AGE_MIN')));
      $ageMax = trim(strval(Tools::getValue('MY_AGE_MAX')));
      if (!$ageMin || empty($ageMin) || !$ageMax || empty($ageMax) || (int)($ageMin) != $ageMin ||  (int)($ageMax) != $ageMax 
         || !(is_numeric($ageMin) || !(is_numeric($ageMax)))) {
           $output .= $this->displayError($this->l('Invalid Configuration value'));
      } else if ((int)$ageMin >= (int)$ageMax) {
        $output .= $this->displayError($this->l('The minimum age cannot be greater than or equal to the maximum age'));
      } else {
        Configuration::updateValue('MY_AGE_MIN', abs($ageMin));
        Configuration::updateValue('MY_AGE_MAX', abs($ageMax));
        Configuration::updateValue('MY_REQBIRTHDAY', Tools::getValue('MY_REQBIRTHDAY'));
        $output .= $this->displayConfirmation($this->l('Settings updated'));
      }
    }

    return $output . $this->displayForm();
 }

2/ Rendre la date de naissance comme étant un champ obligatoire

Implémenter le hook AdditionalCustomerFormFields

Pour mettre en place cette obligation nous allons utiliser le hook additionalCustomerFormFields. Attention ce hook n’est reconnu qu’à partir de la version 1.7.7.x de Prestashop. Ce hook ajoute des champs au formulaire Client et permet de définir de nouveaux attributs à un champ existant. Il renvoie un tableau des champs et leurs attributs et se situe dans : /classes/form/CustomerFormatter.php. Celui qui nous intéresse est $format[‘birthday’]. Pour commencer il nous faut accéder à ce champ en définissant la variable $format = $params[‘fields’]; On test ensuite si le champ birthday existe dans le formulaire et si notre champ reqBirthday à pour valeur 1 (correspond à oui) si c’est le cas on précise que ce champs sera désormais obligatoire avec la méthode booléenne setRequired(true);

Voici un exemple de l’implémentation du code :

 /*
    We use this hook just to set the field birdthday required
    if required by user configuration.
  */
  public function hookAdditionalCustomerFormFields($params)
  {
    $format = $params['fields'];
    if (isset($format['birthday']) && Configuration::get('MY_REQBIRTHDAY')) {
      $format['birthday']->setRequired(true);
    }

    return null;
  }

Conclusion

Vous pouvez désormais vérifier que l’âge et la date de vos client Prestashop correspondent à des formats date viables et rendre le champ date de naissance obligatoire. Sûr de son contenu, vous pourrez éviter que ce champ ne pose un problème avec les modules de transport ou de paiement et contrôler l’enregistrement à votre site.
Retrouvez notre exemple du module disponible gratuitement :

Où l’ensemble de nos modules pour Prestashop Nos modules Prestashop

Besoin d’un module sur mesure ou d’un développement particulier ? N’attendez plus   Contactez-nous!
A bientôt pour de nouveaux tutoriels avec Com’onsoft !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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