Jump to content
BVince

[TUTORIAL] DEVFOREVER - Ajouter un champ obligatoire au formulaire d’inscription

Recommended Posts

"AJOUTER UN CHAMP OBLIGATOIRE AU FORMULAIRE D'INSCRIPTION" :

Editons le fichier authentication.tpl disponible dans le dossier de votre thème, nous allons ajouter un champ obligatoire où le client devra saisir sont numéro SIRET. Le numéro de SIRET va être enregistré dans la table customer de la base de donnée et sera donc rattaché au client et non à une adresse.
Nous devons premièrement modifier ce fichier pour ajouter la zone de saisie destinée au client, on va intercaler entre 2 champs existants le code suivant :


{l s='SIRET'}
   <input type="text" class="text" id="siret" name="siret" value="{if isset($smarty.post.siret)}{$smarty.post.siret}{/if}" />
*



A partir de maintenant le client aura une zone SIRET à remplir dans son formulaire d'inscription.

Editons le fichier Customer.php du dossier classes pour réaliser les modifications d'enregistrement de données, on va ajouter le champ SIRET comme champ et comme obligatoire, dans la liste des déclarations de variable, on va ajouter :

public         $siret;



on le rend obligatoire :

protected     $fieldsRequired = array('lastname', 'passwd', 'firstname', 'email', 'siret');



et on définit les paramètres de taille et de type :

protected     $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'siret' => 128);
protected     $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd',
        'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'siret' => 'isGenericName');



Dans la fonction getFields(), on va ajouter la récupération de la donnée SIRET :

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



Maintenant nous allons ajouter un champ nommé "siret" dans la table customer de la base de donnée type VARCHAR taille 128 NOT NULL.

REQUÊTE SQL :
ALTER TABLE prefix_customer ADD `siret` VARCHAR(128) NOT NULL



remplacer prefix par le préfixe que vous avez choisi lors de l’installation de Prestashop.

Le client devra donc saisir obligatoirement le numéro de SIRET pour pouvoir créer un compte.

Editons le fichier identity.tpl disponible dans le dossier de votre thème, nous allons ajouter le champ SIRET pour que le client puisse visualiser et/ou éditer son numéro de SIRET dans son compte, pour ce faire, on va ajouter une zone de saisie dans le formulaire :


{l s='SIRET'}*
   <input type="text" name="siret" id="siret" value="{$smarty.post.siret}" />



Le client pourra à l'aide de ce code, visualiser et modifier son numéro de SIRET, si vous préférez simplement le rendre visualisable, ajoutez READONLY sur le INPUT.

Il peut être judicieux de pouvoir visualiser et/ou modifier cette information en BackOffice, on va donc faire apparaître l'information en BackOffice:
Editons le fichier AdminCustomers.php disponible dans le dossier /admin/tabs, on va modifier le code de la manière suivante pour faire apparaître sous la dernière date de visite le numéro de SIRET, dans la fonction viewcustomer() :

id.'&token;='.$this->token.'">
'.$customer->firstname.' '.$customer->lastname.'
id_gender == 2 ? 'female' : ($customer->id_gender == 1 ? 'male' : 'unknown')).'.gif" style="margin-bottom: 5px" />

email.'" style="text-decoration: underline; color: blue">'.$customer->email.'


   '.$this->l('ID:').' '.sprintf('d', $customer->id).'

   '.$this->l('Registration date:').' '.Tools::displayDate($customer->date_add, intval($cookie->id_lang), true).'

   '.$this->l('Last visit:').' '.($customerStats['last_visit'] ? Tools::displayDate($customerStats['last_visit'], intval($cookie->id_lang), true) : $this->l('never')).'

   '.$this->l('SIRET :').' '.$customer->siret.'



Vous voyez la ligne SIRET en bas du FIELDSET.

Dans la fonction DisplayForm(), on va ajouter la ligne qui va nous permettre d'éditer le code SIRET si besoin, donc la modification suivante est à insérer après un champ existant :

'.$this->l('SIRET:').' 

   <input type="text" size="33" name="siret" value="'.$this->getFieldValue($obj, 'siret').'" /> *



Maintenant on peut éditer le numéro de SIRET du client et le modifier.

Voilà, j'espère que ce TUTORIAL vous paraît clair, et qu'il pourra vous aider.....
;-)

ATTENTION : Tous les clients déjà enregistrés ne pourront plus accéder à leur fiche compte car il n'avait pas de code SIRET avant la mise en place de cette modification, pour leur affecter un code SIRET "bidon" en attendant un remplissage correct, il est nécessaire de lancer cette requête :

REQUÊTE SQL :
UPDATE prefix_customer SET siret= "0123456789" WHERE siret="" OR ISNULL(siret) 



remplacer prefix par le préfixe que vous avez choisi lors de l’installation de Prestashop.

  • Like 3

Share this post


Link to post
Share on other sites

Merci pour ce tuto
a s'avoir que si on veux un deuxieme champs TVA on refait la mpeme manipe et on remplace siret par tva ? si j'ai bien tout suivi

Share this post


Link to post
Share on other sites

Merci pour ce tuto très clair et très intéressant :)

Share this post


Link to post
Share on other sites

Dans la fonction DisplayForm(), on va ajouter la ligne qui va nous permettre d'éditer le code SIRET si besoin, donc la modification suivante est à insérer après un champ existant :

'.$this->l('SIRET:').' 

   <input type="text" size="33" name="siret" value="'.$this->getFieldValue($obj, 'siret').'" /> *



Maintenant on peut éditer le numéro de SIRET du client et le modifier.



Comment ajouter une ligne (dans cette fonction Display Form) qui fait appel à une table différente (ex: afficher le champ société qui est sur la table adress et non customer)?
Comment appeler cette table différente? Avec quel code?

Share this post


Link to post
Share on other sites

Bonjour,

Je viens vers vous car je viens de réaliser ce tutoriel !
Quand je valide j'ai un message "tentative de piratage champs siret empty"...

Aprés quelques recherches, je me suis rendu compte que l'inscription est bien rentré en base de données.
Y a pas de problème !

Seulement le champs SIRET est vide.
Ce qui provoque le message d'erreur...!


Si je renseigne ce champs à la main, et que je rafraichie la page l'erreur disparaît !


Savez-vous pourquoi la valeur passé en base est vide ? :/
Comment est-ce que je peux faire pour résoudre mon soucis ?


D'avance merci
++ :)

Share this post


Link to post
Share on other sites

Bonjour,
ce genre d'erreur peut être du à un problème de nom de champ, en effet il serait bon de vérifier que le mot "siret" est écrit partout de la même manière en respectant la casse...

Share this post


Link to post
Share on other sites

Bonjour,

Merci de ta réponse !
Je vérifie et je tiens au courant ! :)

Share this post


Link to post
Share on other sites

Re,

Je viens de vérifier tout les champs sont absolument identiques, la casse y compris...:/

Une idée ?
++

Share this post


Link to post
Share on other sites

une idée ?
oui, reprendre le tutorial depuis le début et bien vérifier que rien n'a été oublié, j'ai utilisé cette méthode sur plusieurs sites sans jamais obtenir ce problème...

Share this post


Link to post
Share on other sites

J'ai remis exactement le même code. Je n'ai pas rendu le champs obligatoire SIRET c'est tout !
Ca ne fonctionne toujours pas. Quelle version as tu utilisé ?

Si des idées je suis preneur !

++

Share this post


Link to post
Share on other sites

Bonjour

J'ai moi aussi suivi ce tuto à la lettre.
Pas d'erreur en ce qui me concerne affichée sur le site type "Tentative de piratage".
Le client est bien enregistré dans la base de donnée, mais le champ SIRET reste vide !!

Peut être est-ce dû au fait que je n'ai pas pu ajouter le champ à la table avec la requête SQL car cela me générait une erreur : #1064 - You have an error in your SQL syntax;
Du coup, j'ai créé le champ à la main directement dans phpmyadmin.

Une idée ?

Share this post


Link to post
Share on other sites

Bonjour BVince,

Moi je suis super nulle dans ce genre de code donc faut que je sois super certaine de mon affaire avant de jouer dans tout ça.

J'ai besoin d'ajouter le champs Compagnie lors de l'inscription mais il ne doit pas être obligatoire. Le nom de la compagnie doit apparaître sur la facture dans le champs Facturation comme on le voit pour le champs Livraison.

Si je suis à la lettre ton tuto en remplaçant siret par compagnie, est-ce qu'il me suffit de ne pas mettre le protected dans le code pour que ce champs ne soit pas obligatoire?


Merci de ton aide

Share this post


Link to post
Share on other sites
Bonjour BVince,

Moi je suis super nulle dans ce genre de code donc faut que je sois super certaine de mon affaire avant de jouer dans tout ça.

J'ai besoin d'ajouter le champs Compagnie lors de l'inscription mais il ne doit pas être obligatoire. Le nom de la compagnie doit apparaître sur la facture dans le champs Facturation comme on le voit pour le champs Livraison.

Si je suis à la lettre ton tuto en remplaçant siret par compagnie, est-ce qu'il me suffit de ne pas mettre le protected dans le code pour que ce champs ne soit pas obligatoire?


Merci de ton aide


Bonjour,

Pour ajouter un champ et ne pas le rendre obligatoire, il suffit de ne pas l'ajouter dans

protected     $fieldsRequired



par contre pour l'affichage sur les factures, il va falloir modifier autre chose dans le fichier PDF.php du dossier "classes"

Share this post


Link to post
Share on other sites

Merci pour ce jolie petit Tuto BVince !

Seule petite remarque, tu as omis le TABLE de la fonction ALTER TABLE =) Rien de bien méchant mais si on veut que ton tuto soit parfait =P

Maintenant nous allons ajouter un champ nommé “siret” dans la table customer de la base de donnée type VARCHAR taille 128 NOT NULL.

Remplacer :
REQUÊTE SQL :
ALTER prefix_customer ADD `siret` VARCHAR(128) NOT NULL 



Par :

REQUÊTE SQL :
ALTER TABLE prefix_customer ADD `siret` VARCHAR(128) NOT NULL 




Encore merci pour ce tuto ^.^

Share this post


Link to post
Share on other sites

Ouin ben pour moi cela n'a pas fonctionné.

J'avais un message d'erreur lors de la création du compte mais aucune idée qu'elle était l'erreur. J'ai tout enlevé pour revenir comme avant.

Cette erreur est venue une fois que j'ai ajouté la requête dans la base et ajouté les codes dans la page classes/Customer.php

Comment faites vous pour faire des tests car moi j'ai épuisé ma banque d'adresse de courriel pour faire des tests et je ne peux essayer à nouveau.



Merci de votre aide

Share this post


Link to post
Share on other sites
Merci pour ce jolie petit Tuto BVince !

Seule petite remarque, tu as omis le TABLE de la fonction ALTER TABLE =) Rien de bien méchant mais si on veut que ton tuto soit parfait =P

Maintenant nous allons ajouter un champ nommé “siret” dans la table customer de la base de donnée type VARCHAR taille 128 NOT NULL.

Remplacer :
REQUÊTE SQL :
ALTER prefix_customer ADD `siret` VARCHAR(128) NOT NULL 



Par :

REQUÊTE SQL :
ALTER TABLE prefix_customer ADD `siret` VARCHAR(128) NOT NULL 




Encore merci pour ce tuto ^.^



Il faudrait dire aussi pour les nuls comme moi qu'il ne faut pas écrire REQUÊTE SQL : mais seulement le code.

Share this post


Link to post
Share on other sites

Je reprends un peu le code donné par BVince =)

Dans le fichier AdminCustomer.php disponible dans le dossier /admin/tabs :

Remplacer :

'.$this->l('SIRET:').' 

   <input type="text" size="33" name="siret" value="'.$this->getFieldValue($obj, 'siret').'" /> *
 



Par :

'.$this->l('SIRET:').' 

 <input type="text" size="33" name="siret" value="'.htmlentities($this->getFieldValue($obj, 'siret'), ENT_COMPAT, 'UTF-8').'" />
 



Les problèmes d'enregistrements dans la base de données devraient être réglés. (en tout cas ils le sont pour moi)

Pour France :
Tu peux même mettre ce code là pour ta compagny afin d'éviter tout caractère spaciaux :

'.$this->l('First name:').' 

                   <input type="text" size="33" name="compagnie" value="'.htmlentities($this->getFieldValue($obj, 'compagnie'), ENT_COMPAT, 'UTF-8').'" />
'.$this->l('Forbidden characters:').' 0-9!<>,;?=+()@#"�{}_$%: 



Pour les adresses e-mails test, j'en utilise des bidons du genre "azaz@az.az" "zeze@ze.ze" etc.

En espérant que ça puisse t'aider ^.^

Share this post


Link to post
Share on other sites

Ah et pour les Requetes SQL... On ne peut pas vraiment appeler ça du code mais plutôt une commande, ou plus précisément une requete :-)

Pour s'attaquer à ce genre de chose j'estime qu'il faut avoir quelques notions dans le domaine tout de même. Des cours très simples sont disponibles sur internet.

Quoi qu'il en soit, cette requette :

ALTER TABLE prefix_customer ADD `siret` VARCHAR(128) NOT NULL



Doit être inséré dans la base de données, tu peux y accéder de différentes façon suivant l'hébergeur où tu es =)

Share this post


Link to post
Share on other sites

Bonjour,

Je suis entrain de reprendre le tuto au début. Tout ce que je veux est d'avoir le champs Compagnie lors de l'inscription et qui ne soit pas obligatoire. Je veux également que le nom de la compagnie soit visible sur la facture du client sous Facturation.

Dans authentification.tpl j'ai mis ça

    {l s='Your personal information'}


{l s='Company'}
               <input type="text" class="text" id="company" name="company" value="{if isset($smarty.post.company)}{$smarty.post.company}{/if}" />



Dans Classes/Customer.php j'ai mis ça juste en dessous de public $secure_key


   /** @var string Company (optional) */
   public         $company;



J'ai mis ça aussi dans la même sous secure_jey

$fields['company'] = pSQL($this->company);




En ce qui concerne cette étape là je ne sais pas trop car mon champs compagnie n'est pas obligatoire donc que dois-je faire?

protected     $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'siret' => 128);
protected     $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd',
        'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'siret' => 'isGenericName'); 





Merci de votre aide

Share this post


Link to post
Share on other sites
Je reprends un peu le code donné par BVince =)

Dans le fichier AdminCustomer.php disponible dans le dossier /admin/tabs :

Remplacer :
'.$this->l('SIRET:').' 

   <input type="text" size="33" name="siret" value="'.$this->getFieldValue($obj, 'siret').'" /> *
 



Par :

'.$this->l('SIRET:').' 

 <input type="text" size="33" name="siret" value="'.htmlentities($this->getFieldValue($obj, 'siret'), ENT_COMPAT, 'UTF-8').'" />
 



Les problèmes d'enregistrements dans la base de données devraient être réglés. (en tout cas ils le sont pour moi)

Pour France :
Tu peux même mettre ce code là pour ta compagny afin d'éviter tout caractère spaciaux :

'.$this->l('First name:').' 

                   <input type="text" size="33" name="compagnie" value="'.htmlentities($this->getFieldValue($obj, 'compagnie'), ENT_COMPAT, 'UTF-8').'" />
'.$this->l('Forbidden characters:').' 0-9!<>,;?=+()@#"�{}_$%: 



Pour les adresses e-mails test, j'en utilise des bidons du genre "azaz@az.az" "zeze@ze.ze" etc.

En espérant que ça puisse t'aider ^.^




Bonjour Jumk

Ces bouts de code c'est pour le back office seulement et/ou pour le front office?


Excuse moi si je n'ai pas pris les bons mots pour d'écrire la requête mais comme je l'ai dit, ce n'est pas une partie sur laquelle je m'y connais.


Merci de ton aide et de ton astuce pour les adresses de courriel.

Share this post


Link to post
Share on other sites

Je vais essayer de te répondre dans l'ordre.

En ce qui concerne cette étape là je ne sais pas trop car mon champs compagnie n’est pas obligatoire donc que dois-je faire?

protected     $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'siret' => 128);
protected     $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd',
        'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'siret' => 'isGenericName');



Merci de votre aide



Oui tu rajoutes ce code même dans le cas où tes champs ne sont pas obligatoires. De la manière suivante :
protected     $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'siret' => 128, 'compagnie' => 128);
protected     $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd',
        'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'siret' => 'isGenericName', 'compagnie' => 'isGenericName');



Ces bouts de code c’est pour le back office seulement et/ou pour le front office?

Excuse moi si je n’ai pas pris les bons mots pour d‘écrire la requête mais comme je l’ai dit, ce n’est pas une partie sur laquelle je m’y connais.

Merci de ton aide et de ton astuce pour les adresses de courriel.

Je ne comprends pas encore totalement le fonctionnement du moteur Prestashop mais les bouts de code sont apparemment pour le Front et le Back office oui. Dans mon cas, cela permet d'afficher à mon client son numéro SIRET dans sa page de récapitulatif de ses informations personnelles et d'enregistrer les données.

J'espère t'éclairer un peu dans tout ça.

Bonne nuit =)

Share this post


Link to post
Share on other sites

J'ai toujours le même problème :-( Une erreur s'est produit lors de la création de votre compte

Le problème c'est que je ne sais pas c'est quoi l'erreur.

Récapitulatif de ce que j'ai fait


Dans authentification.tpl j'ai mis ça

{l s='Your personal information'}


{l s='Company'}
               <input type="text" class="text" id="company" name="company" value="{if isset($smarty.post.company)}{$smarty.post.company}{/if}" />
 




Dans Classes/Customer.php j’ai mis ça juste en dessous de public $secure_key

/** @var string Company (optional) */
   public         $company;



J’ai mis ça aussi dans la même page sous secure_jey

$fields['company'] = pSQL($this->company); 




Et ça toujours dans la même page (j'ai mis en rouge ici le petit bout ajouté)

     protected     $fieldsRequired = array('lastname', 'passwd', 'firstname', 'email');
    protected     $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, [color=red]'compagnie' => 128);[/color]
    protected     $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd',
        'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', [color=red]'compagnie' => 'isGenericName');[/color]




Et dans AdminCustomer.php que l'on retrouve dans admin/tabs j'ai mis ça juste au dessus de la ligne pour le label Last name. J'ai enlevé ce bout de code et refait un test et j'ai toujours l'erreur.

'.$this->l('Company:').' 

                   <input type="text" size="33" name="compagnie" value="'.htmlentities($this->getFieldValue($obj, 'compagnie'), ENT_COMPAT, 'UTF-8').'" />
'.$this->l('Forbidden characters:').' 0-9!<>,;?=+()@#"�{}_$%: 
 




Ma requête SQL a été ajouté avec succès

ALTER TABLE ps_customer ADD `company` VARCHAR(128) NOT NULL



Si j'enlève ce que j'ai ajouté dans Customer.php je n'ai plus l'erreur d'enregistrement sauf que le nom de la compagnie ne reste pas affiché.


Comment faire pour trouver où est l'erreur? Je ne connais rien dans ce style de code. :-(

Merci de votre aide

Share this post


Link to post
Share on other sites

Bonjour,
dans le fichier authentication.tpl, il y a déjà un INPUT company, je ne vois pas pourquoi tu veux en ajouter un deuxième ?

Share this post


Link to post
Share on other sites

Essaie ça tout simplement dans AdminCustomer.php :

'.$this->l('Compagnie :').' 

                   <input type="text" size="33" name="siret" value="'.htmlentities($this->getFieldValue($obj, 'compagnie'), ENT_COMPAT, 'UTF-8').'" />
 



Mais BVince à raison, si tu veux simplement un champ société... Il existe déjà =)

Share this post


Link to post
Share on other sites

Bonjour BVince et Jumk


J'ajoute ce champs car, pour les clients qui ont une compagnie, le nom de la compagnie doit figurer sur la facture sous Facturation. Présentement le nom de la compagnie apparaît seulement sous Livraison.


Merci de votre aide

Share this post


Link to post
Share on other sites

Donc tu n'as pas besoin d'ajouter un champ dans la fiche d'inscription mais de modifier l'édition de la facture....

Share this post


Link to post
Share on other sites

Mais si le nom de la compagnie pour la facturation diffère du nom de la compagnie pour la livraison il faut que le client puisse modifier ça. Le champs Facturation ne doit pas prendre automatiquement le nom de la compagnie qui est sous Livraison.

C'est pour ça que je pensais qu'il me fallait ajouter un champs compagnie pour l'inscription car je pense que les informations personnelles sont celles qui sont ajoutées sous Facturation dans la facture.


Si je n'ai pas besoin d'ajouter un champs pour la compagnie, que dois-je changer dans le PDF.php pour ajouter le nom de la compagnie sous Facturation?


Merci de ton aide

Share this post


Link to post
Share on other sites

Dans Prestashop, on peut créer plusieurs adresses pour un même compte client, pour chacune d'entre elles, on peut mettre un nom de société différent, et lors de la validation de la commande, on peut choisir quelle adresse sera celle de facturation et celle de livraison, ensuite ces informations apparaissent correctement sur la facture...un nom de société sous FACTURATION et un autre sous LIVRAISON, je ne vois pas ce que tu as besoin de modifier puisque c'est intégré à Prestashop (testé sur une 1.2.5 et 1.3) ?????

Share this post


Link to post
Share on other sites

Tu as raison. Le client peut choisir différentes adresses pour la livraison et changer le nom de la compagnie.


Ce qui apparaît sous Facturation se sont les informations personnelles et comme il n'y a pas de champs lors de l'inscription pour mettre le nom de la compagnie celle-ci n'apparait pas sur la facture. Je peux te montrer une capture d'écran si tu ne me crois pas :-))

Il faut que le nom de la compagnie apparaisse sous Facturation donc que faut-il ajouter et à quel endroit pour que le nom de la compagnie apparaisse sous Facturation sans pour autant enlever le nom et prénom du client?


Merci de ton aide

Share this post


Link to post
Share on other sites

Bon,
je reprends, comme il faut choisir 1 adresse pour la facturation et 1 adresse pour la livraison, les noms des sociétés correspondantes apparaissent en dessous de chacun d'entre eux...Maintenant si tu préfères camper sur tes positions et passer des heures à refaire quelque chose qui existe déjà, je n'y vois pas d'inconvénients....

Share this post


Link to post
Share on other sites

Bonjour BVince

C'est une de mes clientes qui m'a fait remarqué ceci sur sa facture (voir pièce jointe) et je ne suis pas allée voir les autres factures précédentes provenant de d'autres compagnies.

Je viens de retourner voir toutes les factures précédentes des autres clients qui ont des compagnies et effectivement ils ont le nom de leur compagnie sous Facturation. Donc, millessssssssss excusessssssssssss mais pourquoi sur la facture en pièce jointe le nom de la compagnie n'apparait pas sous Facturation ? Pourtant il y a bien un nom de compagnie pour la livraison.

Perso, c'est sur cette facture que je me suis fiée et décidé d'ajouter le nom de la compagnie pour qu'il apparaisse sous Facturation. J'ai cru pendant quelques instants que je l'avais rêvé ou que je devenais folle suite à tes propos. Ouf! Une chance que j'ai cette preuve sinon... je m'en allais à l'hosto pour me faire enfermer! :-))


Merci de ton aide

27187_JeSr5XaJ92NTUImkEc3G_t

Share this post


Link to post
Share on other sites

Bonjour,
Le champ société n'est pas un champ obligatoire, je pense simplement que ton client n'avait pas de nom de société au moment ou il a fait sa commande, il est même possible qu'il n'en ait toujours pas, peut être pourrais tu modifier le code pour rendre obligatoire la saisie du nom de la société...

Share this post


Link to post
Share on other sites

Bonjour BVince

Bien sûr que le client avait un nom de société. C'est La marguerite fruitée et on le voit sous Livraison.

Je ne peux pas rendre ce champs obligatoire car j'ai des clients qui n'ont pas de société. Je vends principalement à "monsieur madame tout le monde" mais j'ai des clients qui ont une compagnie qui viennent acheter chez moi car j'ai des produits que l'on ne retrouve pas ici au Québec et même au Canada.


Je vais surveiller de plus près les autres commandes en provenance de compagnie afin de voir si le problème se reproduit c'est-à-dire que le nom de la compagnie ne s'affiche pas sous Facturation.


Merci de ton aide

Share this post


Link to post
Share on other sites
"AJOUTER UN CHAMP OBLIGATOIRE AU FORMULAIRE D'INSCRIPTION" :

Editons le fichier authentication.tpl disponible dans le dossier de votre thème, nous allons ajouter un champ obligatoire où le client devra saisir sont numéro SIRET. Le numéro de SIRET va être enregistré dans la table customer de la base de donnée et sera donc rattaché au client et non à une adresse.
Nous devons premièrement modifier ce fichier pour ajouter la zone de saisie destinée au client, on va intercaler entre 2 champs existants le code suivant :


{l s='SIRET'}
   <input type="text" class="text" id="siret" name="siret" value="{if isset($smarty.post.siret)}{$smarty.post.siret}{/if}" />
*


A partir de maintenant le client aura une zone SIRET à remplir dans son formulaire d'inscription.



Comment faire cependant pour rendre cet enregistrement de "Siret" dans une autre table que "prefixe_customer" ?
Par exemple sous la table "prefixe_societe".

J'ai vu que quelqu'un a posé la question sur ce topic, mais personne n'ayant repondu , je me permet de relancer cette demande.

Share this post


Link to post
Share on other sites

Petite précision pour rendre le champs obligatoire avec un contrôle de sa saisie et un retour erreur, il faut aussi ajouter le champs dans l'objet.
Exemple avec le customer:
/classes/Customer.php
protected $fieldsRequired = array('lastname', 'passwd', 'firstname', 'email', 'votrenouveauchamps');

Share this post


Link to post
Share on other sites

Airclic : L'information du $fieldsRequired est dans le tutorial.
Ricky6DK : Il faudrait que la table societe existe, mais on peut trés bien imaginé d'insérer les informations dans la table address, dans ce cas, il faut suivre la même logique.

Share this post


Link to post
Share on other sites

J'ai instalez hier la 1.4 alpha, ils ont prévu pour le Numéro tva au moment du paiement.
cela serait bien qu'il pense a mettre à l'inscription le champs TVA ou siret non obligatoire ou avec une option pour rendre les champs obligatoire.
j'ai bien voulu mettre dans un poste pour proposer cette option d'origine dans la version final 1.4 mais pas trouver le bon poste sauf en anglais.

Share this post


Link to post
Share on other sites

Merci pour le tuto, exactement ce que je cherchais.
Par contre j'ai bataillé à cause du module hide price. Pour que ca marche il faut désinstaller ce module, remettre les fichiers d'origine de Prestashop (ceux qui sont à modifier dans ce tuto identity.tpl, Admincustumers...etc), faire les modifs de ce tuto et reinstaller Hideprice et ca marche ...
Ca peut servir à quelqu'un pour éviter la galère...

Share this post


Link to post
Share on other sites

Bonjour,

J'avais déjà fait la procédure pour les SIRET et TVA sans problème.

Là, je veux créer un troisième champ et cela ne marche pas.

Les deucx parties back office, pas de souci.

Mais les deux tpl, rien à faire, les changements ne sont pas pris en compte.

Est ce du à un problème de version, un problème de module qui gène ?

J'ai fait un essai en changement l'intitulé de SIRET en SIRETTTT et même cela n'est pas apparu.

J'ai pensé que je ne transférait pas dans le bon thème, mais je n'en ai qu'un.



{l s='SOCIETE'}

           <input type="text" class="text" id="societe" name="societe" value="{if isset($smarty.post.societe)}{$smarty.post.societe}{/if}">
*



Je flanche !

Share this post


Link to post
Share on other sites

Bonjour,

dans le cas des TPL front Office, il se peut que Smarty y soit pour quelque chose, je te conseillerai de vider le cache de smarty avant de faire d'autres modifications....

Share this post


Link to post
Share on other sites

Bonsoir
J'ai suivi ton conseil... et bien ça change rien.
J'avais un espoir...
Merci

Ah si, pardon, je m'y prenais mal.

Il faut vider le cache juste avant d'envoyer le nouveau fichier et ça marche.

Enfin ! Je n'y croyais plus !

Un grand merci à toi.

Share this post


Link to post
Share on other sites

Finalement, tous est bien qui finit bien... bon courage pour la suite...

Share this post


Link to post
Share on other sites

Bonjour,

Merci bien.

La suite, va compliquer un peu les choses car je vais essayer de rajouter une série de boutons ratio à saisie obligatoire et une série de case à cocher avec choix multiple.

Les tpl ne sont pas durs à faire mais la retransmission des informations en back ne me parait pas évidente.

En BtoB, il est fort pratique pour l'enregistreur d'un nouveau compte d'avoir les informations de statut juridique et de ou des activité commerciales du client. Cela peut représenter 1/4 heure par inscription de gagné.

Je vais donc m'acharner à cette tâche aujourd'hui et si cela marche, j'en ferai sûrement un tuto.

Share this post


Link to post
Share on other sites

Bonjour,
Tout d'abord merci pour le tutoriel.
Je l'ai suivi pour ajouter 4 champs sur ma page d'inscription.
Pour le champ checkbox et les 2 champs textes, tout marche bien par contre pour le champ de type date il n'est pas enregistré en base de données.
Je pense que le problème vient du tpl peut être de cette partie:


-
               {foreach from=$years item=year}
{$year|escape:'htmlall':'UTF-8'}  
               {/foreach}


J'ai défini f_days, f_months, f_years ainsi que la date correspondante dans Customer.php
Est ce que quelqu'un aurait une piste à me donner?
Merci

Share this post


Link to post
Share on other sites

Désolé pour le dérangement, en fait j'avais oublié de définir le post dans le authentication.php.

$customer->f_birthday = (empty($_POST['f_years']) ? '' : intval($_POST['f_years']).'-'.intval($_POST['f_months']).'-'.intval($_POST['f_days']));

Share this post


Link to post
Share on other sites

Bonjour et merci beaucoup de ce tutorial qui m'en a appris beaucoup dans la gestion des fichers "clients" sur prestashop.
Malheureusement je rencontre un problème en effet :

Je voudrais rendre obligatoire le champ qui apparait quand "Requiert un numéro d'identification fiscale" ou la variable 'dni'
cela SEULEMENT si le client y est soumis (client étranger défini par choix du pays = paye en HT = n° de TVA intra)

Je n'arrive qu'à le rendre obligatoire en rajoutant 'dni' dans Customers.php/protected files que pour TOUS les clients y compris les français qui n'ont pas à fournir ce n°
J'ai juste réussi à ajouter la petite étoile de champs requis mais si ils ne mettent rien ça valide quand même.

J'espère avoir été clair?!

Si quelqu'un a la solution...
Merci beaucoup d'avance!

Share this post


Link to post
Share on other sites

Bonjour,

Est-ce que je peux ajouter un champ "adresse e-mail" dans le formulaire d'ajout d'adresse de livraison avec cette méthode ?
en modifiant le fichier adress.tpl et classes/Adress.php si j'ai bien compris ?

Share this post


Link to post
Share on other sites

Bonjour,

Bon finalement je me suis lancé en test local. Vraiment super ton tuto.
Donc pour ceux qui veulent ajouter un champ sur une adresse il faut suivre le tuto avec quelques modifications :

-Dans le fichier adress.tpl il faut ajouter une valeur pour permettre de visualiser l'entrée quand on revient sur l'adresse donc pas besoin de modifier le fichier identity.tpl :

{else}{$address->email|escape:'htmlall':'UTF-8'}


comme ceci :

<input type="text" class="text" id="email" name="email" value="{if isset($smarty.post.email)}{$smarty.post.email}{else}{$address->email|escape:'htmlall':'UTF-8'}{/if}" />



- Il faut éditer le fichier Adress.php et non pas Customer.php

- la table à incrémenter c'est prefixe_address au lieu de prefixe_customer


Réaliser sur prestashop 1.3.6

Share this post


Link to post
Share on other sites

Bonjour,
Juste une question.
Que se passe t'il si j'effectue ces modifications et qu'ensuite nous voulons faire une maj de prestashop ?

Share this post


Link to post
Share on other sites

Idéalement tu utilises un outil Diff/Merge pour réintégrer tes modifs avant chaque Maj.

Pour ça tortoise svn est top, conjointement au repository de prestashop :

tu remplaces le fichier à jour du dossier svn par celui modifié, puis un clic droit dessus et Tortoise SVN -> Diff.

Il est alors super facile de réintégrer les modifications faites , car elles sont mises en valeur par l'outil.

Share this post


Link to post
Share on other sites

Bonjour,

Bravo pour le tuto, ces ressources sont tellement rares qu'on les apprècie à leur juste valeur quand on tombe dessus !

Pour ma part j'ai réussi à rajouter beaucoup de champ dans plusieurs tables de la BDD en suivant les étapes à la lettre.

Mon problème aujourd'hui est que j'ai aussi rajouté des champs de type select et je n'arrive pas à récupérer leur valeur pour l'insérer en BDD.

Quelle est la syntaxe à utiliser dans ce cas-là?

Share this post


Link to post
Share on other sites

Bonjour,

J'ai revérifié plusieurs fois les manips, et j'ai toujours le même problème.

mon champ TVA dans la BdD reste désespérément vide :(

Aucune erreur lors de la création du compte client, le champ est bien obligatoire, le compte se créé, mais TVA est vide (donc lors de la suppression de la fiche client, j'ai droit à "hack attempt ...")

je ne vois vraiment pas ou ça cloche !

EDIT : ce qui est étrange c'est lorsque je modifie le Numero de TVA du client dans le back-office, ça fonctionne

EDIT 2 : Lors de l'inscription, le champ TVA est bien vérifié !

Est-ce cette ligne qui pose problème

$fields['ntva'] = pSQL($this->ntva); 



(j'ai bien remplacer "siret" par "ntva" partout !)

Share this post


Link to post
Share on other sites

C'est top!
Merci BVince pour ce tuto très bien fait.
Pour ceux qui se demandent, ça fonctionne parfaitement sur PrestaShop 1.4 !

Share this post


Link to post
Share on other sites

Bonjour à tous,

Je ne sais pas pourquoi mais le champ SIRET n'apparaît pas dans le formulaire d'inscription ?
J'ai bien vidé le cache mais rien.
Et quand je veux valider mon inscription j'ai bien "SIRET obligatoire" dans les erreurs ?
Est-ce que quelqu'un sait d'où cela peut venir ?

Je tiens à préciser que j'utilise le template "prestashop 1.4 alternative". Et aussi que le champ apparaît correctement dans le backoffice ...

Merci de votre aide.

EDIT :
C'est bon, je ne savais pas qu'il fallait aller supprimer les fichiers dans prestashop/tool/smarty/compile/
Je vidais seulement le cache à partir du navigateur.
Merci encore pour ce super tuto !

Share this post


Link to post
Share on other sites

Bonjour,

Je viens de mettre en place ce tuto, mais le champs n'apparaît pas dans le formulaire d'inscription, je l'ai placé juste en dessous du camps "Société". J'utilise la version 1.4, thème par défaut.

J'ai vider tout le cache possible, /compile, /cache de smarty, celui de mon navigateur. J'ai aussi forcer la compilation et désactivé le cache dans les performance du BO.
Je ne sais plus quoi faire, quelqu'un à une idée ?

Merci

Share this post


Link to post
Share on other sites

bonjour

je suis dans l impasse j'ai suivi le tuto 3 fois au pied de la lettre

mais quand je veux faire l'inscription je tombe sur page blanche et rien se passe après.

un petite aide a se sujet?

en effet je veux mettre un champ domaine (nom de domaine)

Version de Prestashop: 1.4.2.5

Share this post


Link to post
Share on other sites

Bonjour à tous.
Je rencontre ce genre d'erreur dans le back office de l'onglet client: "Parse error: syntax error, unexpected '=' in /htdocs/public/www/admin34/tabs/AdminCustomers.php on line 164".

J'ai respecté toutes les marches à suivre mais je ne vois pas comment résoudre ce problème.

Merci infiniment pour votre aide.

Voici le partie du code qui pose problème:



'.$customer->firstname.' '.$customer->lastname.'
id_gender == 2 ? 'female' : ($customer->id_gender == 1 ? 'male' : 'unknown')).'.gif" style="margin-bottom: 5px" />


email.'" style="text-decoration: underline; color: blue">'.$customer->email.'

 

Share this post


Link to post
Share on other sites

bonjour, j'ai suivi ce tuto a la lettre mais rien, le champs ajouter ne saffiche pas. j'utilise prestashop 1.4.2.5. Quand je fini de remplir les champs pendant l'inscription, je recois une erreur comme quoi le champ N° Compte Client (champs ajouté) n'est pas complété. D'ou peut venir le probléme. Pourquoi ca saffiche pas?

  • Like 1

Share this post


Link to post
Share on other sites

Un immense merci pour ce tutorial très bien expliqué !!!

Il m'a permis d'ajouter plusieurs champs sans aucune difficulté.

Encore merci ! :)

Share this post


Link to post
Share on other sites
Bonjour,

Bon finalement je me suis lancé en test local. Vraiment super ton tuto.
Donc pour ceux qui veulent ajouter un champ sur une adresse il faut suivre le tuto avec quelques modifications :

-Dans le fichier adress.tpl il faut ajouter une valeur pour permettre de visualiser l'entrée quand on revient sur l'adresse donc pas besoin de modifier le fichier identity.tpl :
{else}{$address->email|escape:'htmlall':'UTF-8'}


comme ceci :

<input type="text" class="text" id="email" name="email" value="{if isset($smarty.post.email)}{$smarty.post.email}{else}{$address->email|escape:'htmlall':'UTF-8'}{/if}" />



- Il faut éditer le fichier Adress.php et non pas Customer.php

- la table à incrémenter c'est prefixe_address au lieu de prefixe_customer


Réaliser sur prestashop 1.3.6




Bonjour,

Suite à l'ajout de l'adresse e-mail de livraison j'aimerai que celle-ci apparaisse également dans le mail de confirmation de commande, comment dois-je procéder ? merci..

Share this post


Link to post
Share on other sites
Bonjour,

Bon finalement je me suis lancé en test local. Vraiment super ton tuto.
Donc pour ceux qui veulent ajouter un champ sur une adresse il faut suivre le tuto avec quelques modifications :

-Dans le fichier adress.tpl il faut ajouter une valeur pour permettre de visualiser l'entrée quand on revient sur l'adresse donc pas besoin de modifier le fichier identity.tpl :
{else}{$address->email|escape:'htmlall':'UTF-8'}


comme ceci :

<input type="text" class="text" id="email" name="email" value="{if isset($smarty.post.email)}{$smarty.post.email}{else}{$address->email|escape:'htmlall':'UTF-8'}{/if}" />



- Il faut éditer le fichier Adress.php et non pas Customer.php

- la table à incrémenter c'est prefixe_address au lieu de prefixe_customer


Réaliser sur prestashop 1.3.6




Bonjour,

Suite à l'ajout de l'adresse e-mail de livraison j'aimerai que celle-ci apparaisse également dans le mail de confirmation de commande, comment dois-je procéder ? merci..



Je viens d'essayer bêtement '{delivery_email}' => $email dans le fichier mailalerts.php du module mailalerts mais sa ne fonctionne pas ...

Share this post


Link to post
Share on other sites

Merci beaucoup pour ce tuto !

J'ai eu pas mal de mal à l'adapter à mon besoin, mais il m'a été d'une très grande aide car m'a donné les bases de réflexion.

 

Merci encore !

Share this post


Link to post
Share on other sites

UN Trés grand Merci :)

 

super le tuto m' a beaucoup aidé j'ai juste passe 2 jours avant de comprendre qu'il faut aller dans le dossier compile de smarty et supprimer le fichier qui comporte authentication dans son nom <_<

Share this post


Link to post
Share on other sites

J'ai découvert ce très bon tutoriel et je me pose une question, à quel moment vous vérifiez le contenu du champ "Siret" ?

 

D'après mes tests, on entre un ou deux chiffres dans le champ et on peut valider le formulaire ! je me trompe ?

 

Avez-vous entendu parlé de l'algorithme de Luhn pour vérifier ce champ ? :huh:

 

VÉRIFICATION DE LA VALIDITÉ DES CODES SIRET ET SIREN (ALGO. DE LUHN)

Share this post


Link to post
Share on other sites

Bonjour

 

Je me permets de répondre à ce topic en croisant les doigts pour qu'il ne soit pas déplacé ou fermé. Si c'est le cas, je m'en excuse ;-)

 

Je viens donc de réaliser ce tuto, pas pour le siret, mais pour VAT NUMBER. Bref, tout a fonctionné. Le seul problème qui survient c'est dans mon back office.

 

Lorsque je suis dans l'onglet "Clients",sur une fiche client donc, et que je souhaite ajouter manuellement son numéro de TVA, je clique sur "enregistrer" mais ça ne prend pas mon ajout en compte.

Lorsque je retourne sur sa fiche, le champ reste vide.

 

Je souhaite ajouter à la main le numéro de TVA des clients qui ne l'ont pas rempli lors de leur inscription. Je n'ai pas voulu le rendre obligatoire pour ne pas bloquer les clients français, qui n'ont pas besoin de remplir ce champ.

 

Voilà, j'espère que quelqu'un pourra m'éclairer ... et que j'ai expliqué assez clairement mon problème.

 

Merci !

Share this post


Link to post
Share on other sites

Bonjour, merci pour ce tuto

 

Je galère pour ajouter un nouveau champ "Date d'accouchement", si quelqu'un peut m'aider ça serai gentil

j'ai fait les décalrations suivantes :

 

    public         $accouchement = NULL;


   public        $annees;
   public        $jours;
   public        $mois;

 

Dans $fieldsValidate :

'accouchement' => 'isBirthDate'

 

Dans getFields() :

$fields['birthday'] = pSQL($this->accouchement);

 

 

Dans add($autodate = true, $nullValues = true) :

$this->accouchement= (empty($this->annees) ? $this->accouchement: (int)($this->annees).'-'.(int)($this->mois).'-'.(int)($this->jours));

 

Merci d'avance.

Share this post


Link to post
Share on other sites

Bonjour,

 

Je cherche à ajouter le siret (obligatoire) lors de l'inscription (presta 1.4.6.2)

j'ai suivi scrupuleusement le tuto mais j'ai toujours l'erreur :

  1. une erreur s'est produite pendant la création de votre compte

Pourtant le compte est bien créé avec toutes les données, mais pas l'adresse puisque le message d'erreur intervient juste avant, sur la fonction $customer->add().

Je peux modifier les données (client) en FrontEnd comme en BackEnd sans problème.

 

Bref, je n'arrive pas à trouver où ça coince !

 

J'avais déjà fait ce type d'ajout (grâce à ce tuto) sans aucune difficulté sur une version 1.3.7, mais là, impossible sur une version 1.4.6.2 !

 

Vous avez une petite idée ?

 

Merci d'avance pour votre aide.

Share this post


Link to post
Share on other sites

J'ai découvert ce très bon tutoriel et je me pose une question, à quel moment vous vérifiez le contenu du champ "Siret" ?

 

D'après mes tests, on entre un ou deux chiffres dans le champ et on peut valider le formulaire ! je me trompe ?

 

Avez-vous entendu parlé de l'algorithme de Luhn pour vérifier ce champ ? :huh:

 

VÉRIFICATION DE LA VALIDITÉ DES CODES SIRET ET SIREN (ALGO. DE LUHN)

je reprends cette remarque car elle est intéréssante, j'envisage de mettre en place ce tuto mais j'ai 2 question:

1. le nombre de caractère necessaires pour valider le champ est il paramétrable et comment, et sinon comment vérifier la validiter du siret?

2. d'où ma 2e question, si je dois vérifier les siret manuellement pour pouvoir ensuite basculer le client dans un compte pro, comment vais je être informée que l'un de mes clients à rempli le champ "siret" car si j'ai 50 inscriptions dans une journée, il faudrait tous les jours les ouvrir un à un pour vérifier la présence d'un siret...

 

donc comment mettre en place l'envoi auto d'un mail (comme pour les commandes) lorsque ce champ est rempli, avec indication du nom du client dans le mail, afin de pouvoir valider son compte en tant que pro et le basculer dans le bon groupe.

 

merci de vos réponses.

Share this post


Link to post
Share on other sites

Bonjour,

Je viens de lire ce sujet très intéressant, mais malheureusement, je ne trouve pas de réponse à ma question.

Vendant des pièces auto, je souhaiterai que le client puisse avoir, au moment du récapitulatif des noms et adresses, 4 ou 5 champs (exemple marque du véhicule, modèles, motorisation, année, spécificités...) et peut-être des bandeaux déroulants.

Vous pensez qu'il est nécessaire de modifier tout ça aussi, ou rajouter de simples champs au niveau du formulaire des noms et adresse et suffisant ?

Share this post


Link to post
Share on other sites

Salut,

 

voici un aperçu des modifs (par rapport au TUTO de BVInce) que j'ai mis en place pour l'ajout d'un numéro SIRET. Dans cet exemple, j'ajoute aussi le nom de la société du client (car je travaille essentiellement en BtoB) donc j'attribue ces deux champs à un client donné et non pas à son adresse. Je travaille sous Prestashop v1.4.6.2.

 

J'ai d'abord créé un champ "siret" char(14) et "customer_company" varchar(64) dans la table customers.

 

J'ai surchargé la classe Customer.php. J'ai donc créé ce fichier override/classes/Customer.php, avec ce code :

 

class Customer extends CustomerCore
{
/** @var number Siret */
public  $siret;
public  $customer_company;
 protected  $fieldsRequired = array('lastname', 'passwd', 'firstname', 'email');
 protected  $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'note' => 65000, 'siret' => 14, 'customer_company' => 64);
 protected  $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd',
  'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'note' => 'isCleanHtml', 'is_guest' => 'isBool', 'siret' => 'isSiret');
public function getFields()
{
 parent::validateFields();
 if (isset($this->id))
  $fields['id_customer'] = (int)($this->id);
 $fields['secure_key'] = pSQL($this->secure_key);
 $fields['note'] = pSQL($this->note, true);
 $fields['id_gender'] = (int)($this->id_gender);
 $fields['id_default_group'] = (int)($this->id_default_group);
 $fields['lastname'] = pSQL($this->lastname);
 $fields['firstname'] = pSQL($this->firstname);
 $fields['birthday'] = pSQL($this->birthday);
 $fields['email'] = pSQL($this->email);
 $fields['newsletter'] = (int)($this->newsletter);
 $fields['newsletter_date_add'] = pSQL($this->newsletter_date_add);
 $fields['ip_registration_newsletter'] = pSQL($this->ip_registration_newsletter);
 $fields['optin'] = (int)($this->optin);
 $fields['passwd'] = pSQL($this->passwd);
 $fields['last_passwd_gen'] = pSQL($this->last_passwd_gen);
 $fields['active'] = (int)($this->active);
 $fields['date_add'] = pSQL($this->date_add);
 $fields['date_upd'] = pSQL($this->date_upd);
 $fields['siret'] = pSQL($this->siret);
 $fields['customer_company'] = pSQL($this->customer_company);
 $fields['is_guest'] = (int)($this->is_guest);
 $fields['deleted'] = (int)($this->deleted);
 return $fields;
}
}

 

J'ai donc deux nouveaux champs : siret et customer_company.

 

Dans ce cas, je ne veux pas que ces champs soient obligatoires car j'accepte les clients non-professionnels aussi. Dans le cas contraire, ajouter ces champs dans :


protected  $fieldsRequired = ...


 

Comme le disait ChristopheS ici :


J'ai découvert ce très bon tutoriel et je me pose une question, à quel moment vous vérifiez le contenu du champ "Siret" ?

D'après mes tests, on entre un ou deux chiffres dans le champ et on peut valider le formulaire ! je me trompe ?

Avez-vous entendu parlé de l'algorithme de Luhn pour vérifier ce champ ? 

VÉRIFICATION DE LA VALIDITÉ DES CODES SIRET ET SIREN (ALGO. DE LUHN)


 

On peut effectivement vérifié la validité du SIRET grâce à l'algo de Luhn (pour ceux que ça intéresse : voir wikipédia). J'ai donc surchargé la classe Validate.php pour ajouter une fonction qui vérifiera l'exactitude du siret.

 

Ce qui donne, override/classes/Validate.php :

class Validate extends ValidateCore
{
//Fonction algorithme de Luhn
function isSiret($num)
{
	//longueur de la chaine $num
	$length = strlen($num);

	//resultat de l'addition de tous les chiffres
	$tot = 0;
	for($i=$length-1;$i>=0;$i--)
	{
		$digit = substr($num, $i, 1);

		if ((($length - $i) % 2) == 0)
		{
			$digit = $digit*2;
			if ($digit>9)
			{
				$digit = $digit-9;
			}
		}
		$tot += $digit;
	}

	return (($tot % 10) == 0);
}

}

 

Cette fonction est nécessaire dans le cas où l'on renseigne, dans Customer.php ceci :


protected  $fieldsValidate = array(.......'siret' => 'isSiret');


 

Dans le cas d'un numéro SIRET bidon, une erreur s'affichera au moment de la validation du formulaire.

 

J'ai aussi surchargé le controller AuthController, ce qui donne override/controllers/AuthController.php :

class AuthController extends AuthControllerCore
{
public function preProcess()
{
 if (self::$cookie->isLogged() AND !Tools::isSubmit('ajax'))
  Tools::redirect('my-account.php');
 if (Tools::getValue('create_account'))
 {
  $create_account = 1;
  self::$smarty->assign('email_create', 1);
 }
 if (Tools::isSubmit('SubmitCreate'))
 {
  if (!Validate::isEmail($email = Tools::getValue('email_create')) OR empty($email))
   $this->errors[] = Tools::displayError('Invalid e-mail address');
  elseif (Customer::customerExists($email))
  {
   $this->errors[] = Tools::displayError('An account is already registered with this e-mail, please fill in the password or request a new one.');
   $_POST['email'] = $_POST['email_create'];
   unset($_POST['email_create']);
  }
  else
  {
   $create_account = 1;
   self::$smarty->assign('email_create', Tools::safeOutput($email));
   $_POST['email'] = $email;
  }
 }
 if (Tools::isSubmit('submitAccount') OR Tools::isSubmit('submitGuestAccount'))
 {
  $create_account = 1;
  if (Tools::isSubmit('submitAccount'))
   self::$smarty->assign('email_create', 1);
  /* New Guest customer */
  if (!Tools::getValue('is_new_customer', 1) AND !Configuration::get('PS_GUEST_CHECKOUT_ENABLED'))
   $this->errors[] = Tools::displayError('You cannot create a guest account.');
  if (!Tools::getValue('is_new_customer', 1))
   $_POST['passwd'] = md5(time()._COOKIE_KEY_);
  if (isset($_POST['guest_email']) AND $_POST['guest_email'])
   $_POST['email'] = $_POST['guest_email'];
  /* Preparing customer */
  $customer = new Customer();
  $lastnameAddress = $_POST['lastname'];
  $firstnameAddress = $_POST['firstname'];
  $_POST['lastname'] = $_POST['customer_lastname'];
  $_POST['firstname'] = $_POST['customer_firstname'];

  $customer->siret = $_POST['siret'];
  $customer->customer_company = $_POST['customer_company'];

  if (!Tools::getValue('phone') AND !Tools::getValue('phone_mobile'))
   $this->errors[] = Tools::displayError('You must register at least one phone number');
  if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) AND !(Tools::getValue('months') == '' AND Tools::getValue('days') == '' AND Tools::getValue('years') == ''))
   $this->errors[] = Tools::displayError('Invalid date of birth');
  $customer->birthday = (empty($_POST['years']) ? '' : (int)($_POST['years']).'-'.(int)($_POST['months']).'-'.(int)($_POST['days']));
  $this->errors = array_unique(array_merge($this->errors, $customer->validateControler()));
  /* Preparing address */
  $address = new Address();
  $_POST['lastname'] = $lastnameAddress;
  $_POST['firstname'] = $firstnameAddress;
  $address->id_customer = 1;
  $this->errors = array_unique(array_merge($this->errors, $address->validateControler()));
  /* US customer: normalize the address */
  if ($address->id_country == Country::getByIso('US'))
  {
   include_once(_PS_TAASC_PATH_.'AddressStandardizationSolution.php');
   $normalize = new AddressStandardizationSolution;
   $address->address1 = $normalize->AddressLineStandardization($address->address1);
   $address->address2 = $normalize->AddressLineStandardization($address->address2);
  }
  $zip_code_format = Country::getZipCodeFormat((int)(Tools::getValue('id_country')));
  if (Country::getNeedZipCode((int)(Tools::getValue('id_country'))))
  {
   if (($postcode = Tools::getValue('postcode')) AND $zip_code_format)
   {
 $zip_regexp = '/^'.$zip_code_format.'$/ui';
 $zip_regexp = str_replace(' ', '( |)', $zip_regexp);
 $zip_regexp = str_replace('-', '(-|)', $zip_regexp);
 $zip_regexp = str_replace('N', '[0-9]', $zip_regexp);
 $zip_regexp = str_replace('L', '[a-zA-Z]', $zip_regexp);
 $zip_regexp = str_replace('C', Country::getIsoById((int)(Tools::getValue('id_country'))), $zip_regexp);
 if (!preg_match($zip_regexp, $postcode))
  $this->errors[] = '<strong>'.Tools::displayError('Zip/ Postal code').'</strong> '.Tools::displayError('is invalid.').'<br />'.Tools::displayError('Must be typed as follows:').' '.str_replace('C', Country::getIsoById((int)(Tools::getValue('id_country'))), str_replace('N', '0', str_replace('L', 'A', $zip_code_format)));
   }
   elseif ($zip_code_format)
 $this->errors[] = '<strong>'.Tools::displayError('Zip/ Postal code').'</strong> '.Tools::displayError('is required.');
   elseif ($postcode AND !preg_match('/^[0-9a-zA-Z -]{4,9}$/ui', $postcode))
 $this->errors[] = '<strong>'.Tools::displayError('Zip/ Postal code').'</strong> '.Tools::displayError('is invalid.');
  }
  if (Country::isNeedDniByCountryId($address->id_country) AND (!Tools::getValue('dni') OR !Validate::isDniLite(Tools::getValue('dni'))))
   $this->errors[] = Tools::displayError('Identification number is incorrect or has already been used.');
  elseif (!Country::isNeedDniByCountryId($address->id_country))
   $address->dni = NULL;
  if (!sizeof($this->errors))
  {
   if (Customer::customerExists(Tools::getValue('email')))
 $this->errors[] = Tools::displayError('An account is already registered with this e-mail, please fill in the password or request a new one.');
   if (Tools::isSubmit('newsletter'))
   {
 $customer->ip_registration_newsletter = pSQL(Tools::getRemoteAddr());
 $customer->newsletter_date_add = pSQL(date('Y-m-d H:i:s'));
   }

   if (!sizeof($this->errors))
   {
 if (!$country = new Country($address->id_country, Configuration::get('PS_LANG_DEFAULT')) OR !Validate::isLoadedObject($country))
  die(Tools::displayError());
 if ((int)($country->contains_states) AND !(int)($address->id_state))
  $this->errors[] = Tools::displayError('This country requires a state selection.');
 else
 {
  $customer->active = 1;
  /* New Guest customer */
  if (Tools::isSubmit('is_new_customer'))
   $customer->is_guest = !Tools::getValue('is_new_customer', 1);
  else
   $customer->is_guest = 0;
  if (!$customer->add())
   $this->errors[] = Tools::displayError('An error occurred while creating your account. plop');
  else
  {
   $address->id_customer = (int)($customer->id);
   if (!$address->add())
    $this->errors[] = Tools::displayError('An error occurred while creating your address.');
   else
   {
    if (!$customer->is_guest)
    {
	 if (!Mail::Send((int)(self::$cookie->id_lang), 'account', Mail::l('Welcome!'),
	 array('{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{passwd}' => Tools::getValue('passwd')), $customer->email, $customer->firstname.' '.$customer->lastname))
	  $this->errors[] = Tools::displayError('Cannot send email');
    }
    self::$smarty->assign('confirmation', 1);
    self::$cookie->id_customer = (int)($customer->id);
    self::$cookie->customer_lastname = $customer->lastname;
    self::$cookie->customer_firstname = $customer->firstname;
    self::$cookie->passwd = $customer->passwd;
    self::$cookie->logged = 1;
    self::$cookie->email = $customer->email;
    self::$cookie->is_guest = !Tools::getValue('is_new_customer', 1);
    /* Update cart address */
    self::$cart->secure_key = $customer->secure_key;
    self::$cart->id_address_delivery = Address::getFirstCustomerAddressId((int)($customer->id));
    self::$cart->id_address_invoice = Address::getFirstCustomerAddressId((int)($customer->id));
    self::$cart->update();
    Module::hookExec('createAccount', array(
	 '_POST' => $_POST,
	 'newCustomer' => $customer
    ));
    if (Tools::isSubmit('ajax'))
    {
	 $return = array(
	  'hasError' => !empty($this->errors),
	  'errors' => $this->errors,
	  'isSaved' => true,
	  'id_customer' => (int)self::$cookie->id_customer,
	  'id_address_delivery' => self::$cart->id_address_delivery,
	  'id_address_invoice' => self::$cart->id_address_invoice,
	  'token' => Tools::getToken(false)
	 );
	 die(Tools::jsonEncode($return));
    }
    if ($back = Tools::getValue('back'))
	 Tools::redirect($back);
    Tools::redirect('my-account.php');
   }
  }
 }
   }
  }
  if (sizeof($this->errors))
  {
   if (!Tools::getValue('is_new_customer'))
 unset($_POST['passwd']);
   if (Tools::isSubmit('ajax'))
   {
 $return = array(
  'hasError' => !empty($this->errors),
  'errors' => $this->errors,
  'isSaved' => false,
  'id_customer' => 0
 );
 die(Tools::jsonEncode($return));
   }
  }
 }
 if (Tools::isSubmit('SubmitLogin'))
 {
  Module::hookExec('beforeAuthentication');
  $passwd = trim(Tools::getValue('passwd'));
  $email = trim(Tools::getValue('email'));
  if (empty($email))
   $this->errors[] = Tools::displayError('E-mail address required');
  elseif (!Validate::isEmail($email))
   $this->errors[] = Tools::displayError('Invalid e-mail address');
  elseif (empty($passwd))
   $this->errors[] = Tools::displayError('Password is required');
  elseif (Tools::strlen($passwd) > 32)
   $this->errors[] = Tools::displayError('Password is too long');
  elseif (!Validate::isPasswd($passwd))
   $this->errors[] = Tools::displayError('Invalid password');
  else
  {
   $customer = new Customer();
   $authentication = $customer->getByEmail(trim($email), trim($passwd));
   if (!$authentication OR !$customer->id)
   {
 /* Handle brute force attacks */
 sleep(1);
 $this->errors[] = Tools::displayError('Authentication failed');
   }
   else
   {
 self::$cookie->id_compare = isset(self::$cookie->id_compare) ? self::$cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);
 self::$cookie->id_customer = (int)($customer->id);
 self::$cookie->customer_lastname = $customer->lastname;
 self::$cookie->customer_firstname = $customer->firstname;
 self::$cookie->logged = 1;
 self::$cookie->is_guest = $customer->isGuest();
 self::$cookie->passwd = $customer->passwd;
 self::$cookie->email = $customer->email;
 if (Configuration::get('PS_CART_FOLLOWING') AND (empty(self::$cookie->id_cart) OR Cart::getNbProducts(self::$cookie->id_cart) == 0))
  self::$cookie->id_cart = (int)(Cart::lastNoneOrderedCart((int)($customer->id)));
 /* Update cart address */
 self::$cart->id_carrier = 0;
 self::$cart->id_address_delivery = Address::getFirstCustomerAddressId((int)($customer->id));
 self::$cart->id_address_invoice = Address::getFirstCustomerAddressId((int)($customer->id));
 // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated
 self::$cart->secure_key = $customer->secure_key;
 self::$cart->update();
 Module::hookExec('authentication');
 if (!Tools::isSubmit('ajax'))
 {
  if ($back = Tools::getValue('back'))
   Tools::redirect($back);
  Tools::redirect('my-account.php');
 }
   }
  }
  if (Tools::isSubmit('ajax'))
  {
   $return = array(
 'hasError' => !empty($this->errors),
 'errors' => $this->errors,
 'token' => Tools::getToken(false)
   );
   die(Tools::jsonEncode($return));
  }
 }
 if (isset($create_account))
 {
  /* Select the most appropriate country */
  if (isset($_POST['id_country']) AND is_numeric($_POST['id_country']))
   $selectedCountry = (int)($_POST['id_country']);
  /* FIXME : language iso and country iso are not similar,
   * maybe an associative table with country an language can resolve it,
   * But for now it's a bug !
   * @see : bug #6968
   * @link:http://www.prestashop.com/bug_tracker/view/6968/
  elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
  {
   $array = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
   if (Validate::isLanguageIsoCode($array[0]))
   {
 $selectedCountry = Country::getByIso($array[0]);
 if (!$selectedCountry)
  $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT'));
   }
  }*/
  if (!isset($selectedCountry))
   $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT'));
  if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES'))
   $countries = Carrier::getDeliveredCountries((int)self::$cookie->id_lang, true, true);
  else
   $countries = Country::getCountries((int)self::$cookie->id_lang, true);

  self::$smarty->assign(array(
   'countries' => $countries,
   'sl_country' => (isset($selectedCountry) ? $selectedCountry : 0),
   'vat_management' => Configuration::get('VATNUMBER_MANAGEMENT')
  ));
  /* Call a hook to display more information on form */
  self::$smarty->assign(array(
   'HOOK_CREATE_ACCOUNT_FORM' => Module::hookExec('createAccountForm'),
   'HOOK_CREATE_ACCOUNT_TOP' => Module::hookExec('createAccountTop')
  ));
 }
 /* Generate years, months and days */
 if (isset($_POST['years']) AND is_numeric($_POST['years']))
  $selectedYears = (int)($_POST['years']);
 $years = Tools::dateYears();
 if (isset($_POST['months']) AND is_numeric($_POST['months']))
  $selectedMonths = (int)($_POST['months']);
 $months = Tools::dateMonths();
 if (isset($_POST['days']) AND is_numeric($_POST['days']))
  $selectedDays = (int)($_POST['days']);
 $days = Tools::dateDays();
 self::$smarty->assign(array(
  'years' => $years,
  'sl_year' => (isset($selectedYears) ? $selectedYears : 0),
  'months' => $months,
  'sl_month' => (isset($selectedMonths) ? $selectedMonths : 0),
  'days' => $days,
  'sl_day' => (isset($selectedDays) ? $selectedDays : 0)
 ));
 self::$smarty->assign('newsletter', (int)Module::getInstanceByName('blocknewsletter')->active);
}
}

 

Et pour finir, j'ai ajouté les deux champs dans le formulaire d'inscription et dans celui de "Mon compte".

 

Dans themes/mon_theme/identity.tpl et themes/mon_theme/authentification.tpl :

Ajouter (ou vous voulez en repérant le champ "id_gender" par exemple) :

<p class="text">
<label for="customer_company">{l s='Company'} </label>
<input type="text" class="text" id="customer_company" name="customer_company" value="{if isset($smarty.post.customer_company)}{$smarty.post.customer_company}{/if}" />
  </p>
  <p class="text">
<label for="siret">{l s='SIRET'} </label>
<input type="text" class="text" id="siret" name="siret" value="{if isset($smarty.post.siret)}{$smarty.post.siret}{/if}" />
  </p>

 

!!! ATTENTION : Si vous utilisez le onepagecheckout, il faut modifier deux autres fichiers !!

Dans themes/js/order-opc.js, ajouter ceci l.518 (environ):

  params += 'siret='+encodeURIComponent($('#siret').val())+'&';
  params += 'customer_company='+encodeURIComponent($('#customer_company').val())+'&';

 

Et dans themes/mon_theme/order-opc-new-account.tpl :

<p class="text">
 <label for="customer_company">{l s='Company'} </label>
 <input type="text" class="text" id="customer_company" name="customer_company" onblur="$('#company').val($(this).val());" value="{if isset($guestInformations) && $guestInformations.customer_company}{$guestInformations.customer_company}{/if}" />
   </p>
   <p class="text">
 <label for="siret">{l s='SIRET'} </label>
 <input type="text" class="text" id="siret" name="siret" value="{if isset($guestInformations) && $guestInformations.siret}{$guestInformations.siret}{/if}" />
   </p>

 

En cas de champs obligatoires, rajouter un required dans la classe du <p>, comme ceci :

<p class="required text">

 

J'ai testé ce code avec ET sans le onepagecheckout et cela fonctionne bien pour moi. Il y aura peut-être qq arrangements à faire si vous acceptez les comptes invités.

 

Enjoy ;)

Edited by GhosToM (see edit history)

Share this post


Link to post
Share on other sites

Bonjour,

je remercie chaleureusement Bvince et GhosToM pour ce tutoriel et optimisation.

Sa faisait pas mal de temps que je cherchais comment faire

Edited by locean67 (see edit history)

Share this post


Link to post
Share on other sites

Bonjour,

je me permet de revenir j'ai une erreur qui se produit.

Quand un utilisateur s'enregistre, lorsqu'il envoie ses données il obtient ce message "une erreur s'est produite pendant la création de votre compte".

Le hic c'est que son enregistrement c'est bien passé puisqu'il apparait dans la base de donnée mais il n'arrive pas à se connecter.

 

Dans la partie administration lorsque je veux éditer les informations d'un client je ne peux pas mettre à jour les modifications car on me dis de donner un numéro de siret (même si ce dernier n'est pas vide)

Share this post


Link to post
Share on other sites