Jump to content

Personnalisation du formulaire d'enregistrement.


Recommended Posts

Désolé pour les modos, j'ai posté le message initial dans le forum anglais :P

Bonjour,
Voici mon dilemne:
Je souhaite véritablement personnaliser le formulaire d’inscription des clients.
Je peux ajouter un champ cependant je souhaite implémenter une liste déroulante sur leur adresse en fonction de leur choix précédent (listes liées): – Pays – Région – Département – Ville

A priori tout se passe dans adress.tpl et authentification.tpl
————————-

idSelectedCountry = {if isset($smarty.post.id_region)}{$smarty.post.id_region|intval}{else}false{/if};
countries = new Array();
{foreach from=$countries item='country'}
   {if isset($country.states)}
       countries[{$country.id_country|intval}] = new Array();
       {foreach from=$country.states item='state' name='states'}
           countries[{$country.id_country|intval}]['{$state.id_state|intval}'] = '{$state.name}';
       {/foreach}
   {/if}
{/foreach}
$(function(){ldelim}
   $('.id_state option[value={if isset($smarty.post.id_state)}{$smarty.post.id_state}{else}{$address->id_state|escape:'htmlall':'UTF-8'}{/if}]').attr('selected', 'selected');
{rdelim});
//]]>
[removed]


—————————
Cependant ce code reste obscur pour moi, où sont gérées les tables ?
Je pars sur des tables – country (pour les pays) – region (liée par id_country) – département qui sera liée par id_region
et villes liée par id_departement

Comment modifier ce code pour faire appel à mes tables ?
Merci !!!!

Yann.

Link to comment
Share on other sites

Bonjour,
personnellement je suis entraine de faire de modification sur le module fabricant pour l'adapter et intégrer de select liées pour faire un module de recherche personnaliser car je pas trouver ce module pour l'acheter j'avoue il me reste beaucoup de chose a faire vu que j'ai de difficulté avec smarty aussi bon courage.

Link to comment
Share on other sites

Bonsoir sunwares,

J'y travaille et je me bidouille pour trouver une solution pour créer un autre formulaire plus court.
Je m'explique : il faut créer un compte pour accéder au prix et je voudrai que le formulaire soit court (Titre, Nom, Prénom, email, mot de passe, date de naissance).
Quand le visiteur passe une commande, il faudrait que l'autre partie du formulaire de départ s'affiche (reprise du nom et prénom puis adresse, cp...).
J'ai réussi à créer un authentication_short.tpl et un authentication_short.php (ok c'est encore un peu en bidouillage) mais j'ai un souci avec la class adress.php
Je continue à faire des tests....

Link to comment
Share on other sites

Bonjour Monvidedressing,
j'avais trouvé des infos sympas pour ajouter des champs obligatoires (ou pas) dans un formulaire.
Il y a pas mal de fichiers à modifier, je te poste ça ci dessous:

/themes/prestashop/authentification.tpl – this adds the actual fields in the registration form
/classes/Address.php – this makes the addresses management, it tells the form how to handle the submitted info
/admin/tabs/AdminAddresses.php – this allows the back office to retrieve and edit the submitted info
/themes/prestashop/addresses.tpl

Voici le cheminement pour l'ajout d'un champ obligatoire (en anglais):

1. /themes/prestashop/authentification.tpl

This is an example of a custom textfield added. You need to add this between two paragraphs as needed, in the account-creation_form form.

{l s=‘C.I.F.’} <input type=“text” class=“text” id=“cif” name=“cif” value=”{if isset($smarty.post.cif)}{$smarty.post.cif}{/if}” />




2. /classes/Address.php

In this file there are several places in witch code needs to be added:

In class “Address extends ObjectModel” you need to add :

/** @var string C.I.F. (optional) */ 
public $cif;



In “protected $fieldsSize = array” you need to add:

‘cif’=>32



In “protected “$fieldsValidate” you need to add:

‘cif’ => ‘isGenericName’



In “public function getFields() { parent::validateFields(); if (isset($this->id))”

you need to add:

$fields[‘cif’] = pSQL($this->cif);



3. /admin/tabs/AdminAddresses.php

You need to add in the code that makes the form for the BackOffice address management, in my case line 238, after the Company text field:

’.$this->l(‘C.I.F.’).’
 <input type=“text” size=“33” name=“cif” value=”’.htmlentities($this->getFieldValue($obj, ‘cif’), ENT_COMPAT, ‘UTF-8’).’” > ’.$this->l(‘Invalid characters:’).’ <>;=#{} 



4. /addresses.tpl

Just after : “ {if $address.company}

{$address.company}{/if} “ on line 21 ( i guess ) you must add :

{if $address.cif}{$address.cif}{/if}
{if $address.recom}{$address.recom}{/if}



En espérant que cela t'aide.
De mon côté, je n'arrive toujours pas à créer de listes liées dans le formulaire d'inscription.
Yann.

Link to comment
Share on other sites

Bonjour Yann,

D'abord, j'aimerai que tu m'expliques exactement ce que tu souhaites.
Tu veux ajouter un champ, lequel ?
Lié à quel autre champs ? Liaison en cascade ?

Ensuite, mille merci pour tes informations. Je les avais déjà puisque j'ai déjà fait quelques modifications. Ajouter ou enlever un champs, j'avais les infos.
Le but étant de supprimer l'obligation de fournir l'adresse lors d'une simple inscription, je me demande si en mettant {if logged} ça ne résoudrait pas mon problème. Je vais faire des tests.

Link to comment
Share on other sites

En fait je souhaite créer un formulaire d'enregistrement avec les éléments suivants:
- Région
- Département
- Ville
Ces 3 listes étant liées en cascade via 3 tables distinctes.

Et partant de ce principe, ajouter 2 autres champs liés:
- Modèle
- Marque (voiture).

J'ai tenté de m'appuyer sur le script qui gère les pays et états dans address.tpl et authentification.tpl mais je n'arrive pas à l'adapter à mes tables. En fait, je ne vois pas où il est fait appel aux tables dans ce script.

idSelectedCountry = {if isset($smarty.post.id_region)}{$smarty.post.id_region|intval}{else}false{/if};
countries = new Array();
{foreach from=$countries item='country'}
   {if isset($country.states)}
       countries[{$country.id_country|intval}] = new Array();
       {foreach from=$country.states item='state' name='states'}
           countries[{$country.id_country|intval}]['{$state.id_state|intval}'] = '{$state.name}';
       {/foreach}
   {/if}
{/foreach}
$(function(){ldelim}
   $('.id_state option[value={if isset($smarty.post.id_state)}{$smarty.post.id_state}{else}{$address->id_state|escape:'htmlall':'UTF-8'}{/if}]').attr('selected', 'selected');
{rdelim});
//]]>



J'ai aussi remarqué que dans le répertoire des classes, il y avait 2 fichiers:
- country.php et state.php qui vraisemblablement jouent un rôle dans le script de liste liées.

exemple de state.php:

<?php

/**
 * State class, State.php
 * States management
 * @category classes
 *
 * @author PrestaShop 
 * @copyright PrestaShop
 * @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0
 * @version 1.2
 *
 */

class        State extends ObjectModel
{
   /** @var integer Country id which state belongs */
   public         $id_country;

   /** @var integer Zone id which state belongs */
   public         $id_zone;

   /** @var string 2 letters iso code */
   public         $iso_code;

   /** @var string Name */
   public         $name;

   /** @var interger Tax behavior */
   public        $tax_behavior;

   /** @var boolean Status for delivery */
   public        $active = true;

    protected     $fieldsRequired = array('id_country', 'id_zone', 'iso_code', 'name', 'tax_behavior');
    protected     $fieldsSize = array('iso_code' => 4, 'name' => 32);
    protected     $fieldsValidate = array('id_country' => 'isUnsignedId', 'id_zone' => 'isUnsignedId', 'iso_code' => 'isStateIsoCode', 'name' => 'isGenericName', 'tax_behavior' => 'isUnsignedInt', 'active' => 'isBool');

   protected     $table = 'state';
   protected     $identifier = 'id_state';

   public function getFields()
   {
       parent::validateFields();
       $fields['id_country'] = intval($this->id_country);
       $fields['id_zone'] = intval($this->id_zone);
       $fields['iso_code'] = pSQL(strtoupper($this->iso_code));
       $fields['name'] = pSQL($this->name);
       $fields['tax_behavior'] = intval($this->tax_behavior);
       $fields['active'] = intval($this->active);
       return $fields;
   }

   public static function getStates($id_lang, $active = false)
   {
       return Db::getInstance()->ExecuteS('
           SELECT `id_state`, `id_country`, `id_zone`, `iso_code`, `name`, `tax_behavior`, `active`
           FROM `'._DB_PREFIX_.'state`
           '.($active ? 'WHERE active = 1' : '').'
           ORDER BY `name` ASC');
   }

   /**
   * Get a state name with its ID
   *
   * @param integer $id_state Country ID
   * @return string State name
   */
   static public function getNameById($id_state)
   {
       $result = Db::getInstance()->getRow('
       SELECT `name`
       FROM `'._DB_PREFIX_.'state`
       WHERE `id_state` = '.intval($id_state).'');

       return $result['name'];
   }

   /**
   * Get a state id with its name
   *
   * @param string $id_state Country ID
   * @return integer state id
   */
   static public function getIdByName($state)
   {
         $result = Db::getInstance()->getRow('
       SELECT `id_state`
       FROM `'._DB_PREFIX_.'state`
       WHERE `name` LIKE \''.pSQL($state).'\'');

       return (intval($result['id_state']));
   }    
}

?>



Merci à toi pour ton aide :)

Link to comment
Share on other sites

Re,

Attention je ne suis pas une informaticienne.. je donne des idées ou des pistes ou des suggestions....... je fais ce que je peux pour aider mon prochain.

Ce qui me vient à l'esprit à froid :

D'abord, les pays sont tous enregistrés pour les proposer en choix. Il va donc falloir commencer par là. Il faudrait peut-être aller dans les listes Etat, Pays et Zone pour assurer la partie cascade.

Ensuite, les voitures, est-ce un produit de ta boutique ? si non, il faudrait peut-être créer une table dans la BDD...

Je t'ai aidé là ???? ;-)

Link to comment
Share on other sites

Je fais ce que je peux mais ne serait pas à ce niveau :


Class State...... dessous les différents champs de cette table (j'ai vérifié ça correspond!)
Peut-être partir d'un double state.php, l'adapter pour les voitures et appeler le script dans le formulaire......

Link to comment
Share on other sites

Après beaucoup de tests de modification, j'ai remarqué que ce bout de code dans country.php gère l'apparition du choix des 'states':

$states = Db::getInstance()->ExecuteS('
       SELECT s.*
       FROM `'._DB_PREFIX_.'state` s
       ');



Quand je modifie FROM `'._DB_PREFIX_.'state` s en FROM `'._DB_PREFIX_.'region` s (le nom de ma table), ça ne marche pas.
Quelqu'un peut m'aider à décoder ?
notemment :
SELECT s.*
ça correpond à quoi?
et pourquoi y'a un s après le nom de la table dans:
FROM `'._DB_PREFIX_.'state` s
Merci à tout les dev !

Link to comment
Share on other sites

  • 1 year later...

Bonjour

Souvent des clients s'inscrivent sans bien regarder les cases, et ne choisissent pas leur pays en laissant le pays par défaut

 

Donc je souhaite ne pas proposer aux clients un pays par defaut dans la liste pendant l'inscription, afin de leur obliger à choisir leur pays.

 

Je voudrais donc afficher " ------------- " au lieu de " France " dans la liste des pays à choisir.

 

Quelqu'un pour m'aider ?

 

Merci par avance !

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...