Jump to content

Ajout de Champs Formulaires & Requêtes


Recommended Posts

Bonjour,

J'ai créé un script qui me permet de cartographier mes vendeurs, ainsi qu'un rayon de vente (vendeurs à domicile). Pour cette carte j'ai besoin, d'un rayon de vente, ainsi que 2 checkbox (un qui permet demande l'accord pour afficher les informations personnelles (nom, prénom, ville, mail) et une autre qui est active seulement si la première est coché, qui permet de donner son accord pour afficher son numéro de portable sur la carte)

Je fais tout ça lors de l'inscription, donc le formulaire est créé sans problème, je récupère sans soucis non plus les informations entrées, ma carte fonctionne très bien.

Maintenant, il faut que je puisse éditer les informations entrées lors de l'inscription (donc le rayon, et les 2 checkbox), donc pour ça je passe par le formulaire "identity.php), idem, j'arrive très bien à transmettre les données pour les enregistrer.

Sauf que (bah, oui, ça serait trop facile sinon, et je serais par conséquent pas là ^^) je voudrais lorsque j'affiche la page "identity.php" récupérer les informations déjà entrées (c'est à dire que si les 2checkbox sont coché lors de l'inscription, lorsque j'édit et que j'arrive sur la page identity.php, les deux checkbox sont cochés et idem que le rayon soit déjà sélectionné dans le select) un peu comme le reste des informations (nom prénom, mail etc...) du formulaire de base.

Voilà le .tpl du formulaire:


Cartograhpie des Ambassadrices


Rayon de vente estimé (autour de votre ville)

-
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125

*(valeurs en Km)





Afficher mes informations sur la Carte*
           <input type="checkbox" name="diffuse" id="diffuse" value="1" {if $smarty.post.diffuse == 1} checked="checked"{/if} />

*Affiche les informations suivantes: Nom, Prénom, Ville et Adresse Email. 
           Cela permet à une Ambassadrice, Manager ou Leader de vous contacter plus facilement (non obligatoire, mais recommandé).



Afficher mon Numéro de Portable*
           <input type="checkbox" name="diffusetel" id="diffusetel" value="1" {if $smarty.post.diffusetel == 1} checked="checked"{/if} checked/>

*Affiche le Numéro de Portable sur la Carte (Permet d'être contacter
           plus facilement par les autres Ambassadrices.

       {literal}
       [removed] 
   function toggleSubmit() { 
       document.getElementById('diffusetel').disabled = !document.getElementById('diffuse').checked; 
   } 
   document.getElementById('diffuse').onclick = toggleSubmit; 
   toggleSubmit(); // Déclenchement au premier affichage 
       [removed] {/literal}


               <input type="submit" class="button" name="submitIdentity" value="{l s='Save'}" />





Ensuite, je voudrais ajouter une requête lorsque j'édite la ville (donc là je suis dans le formulaire address.php) qui, dans un premier lieu, va chercher la ville déjà enregistrée dans la base de donnée correspondant à ce customer (en l’occurrence ici, mon vendeur).

Pour enfin, lorsque je valide le formulaire address.php, comparer si le champs 'city'est différent de la ville précédemment récupérée dans la base de données (qui me permet ensuite de lancer mon script, pour mettre à jour ma carte).

Pour les requêtes, j'ai aucun soucis, je sais contacter ma BDD et tout, mais, j'ignore comment récupérer l'id customer (afin de pouvoir récupérer la ville correspondant à cet id dans la table ps_address) et à quel moment je dois faire ma comparaison.

Des personnes sauraient m'aider? (au moins dans un premier temps, pour la première partie de mon problème)

Geoffrey.

Link to comment
Share on other sites

Salut,

Personne saurais me renseigner la dessus? Au moins, sur la récupération des informations dans la BDD pour le formulaire de la page identity.php qui permet d'afficher les informations déjà saisies par l'utilisateur?

Link to comment
Share on other sites

Si j'ai bien compris, tu as rajouté des champs dans le formulaire d'inscription et la partie Mon Compte, tu arrives à enregistrer les données rentrées par l'utilisateur dans la base de donnée et tu souhaiterait les afficher pré-remplis lorsque l'utilisateur se connecte à la partie Mon Compte ?

Si j'ai bien un compris, un simple Db::getInstance()->ExecuteS (ou getRow) suivi d'un assign au template devrait régler ton problème.
En fait je comprends comment si tu arrives à enregistrer les données, tu n'arrives pas à les ré afficher derrière.

Link to comment
Share on other sites

Re,

Merci pour ta réponse, pourrais-tu me confirmer la syntaxe:

   Db::getInstance()->ExecuteS($smarty->assign('diffuse', $customer->diffuse));



Le soucis, c'est que quand je suis sur la page "indentity.php" donc (Mes données personnels), j'ai bien le formulaire que j'ai rajouté, sauf qu'il est vierge (donc dans le select c'est la première valeur qui apparaît soit "--' au lieu de "25" (valeur qui apparaît dans la BDD), idem pour les checkbox, les deux sont coché (valeur = 1 dans la BDD) or, il sont décoché sur le formulaire de la page).

Si je modifie les valeurs de se formulaire et que j'enregistre, il me sauvegarde bien dans la BDD les nouvelles valeurs, le problème c'est seulement l'affichage des valeurs actuellement enregistrées dans la bdd sur la page du formulaire.

Merci,
Geoffrey.

Link to comment
Share on other sites

Houlà non pas du tout. Db::getInstance()->ExecuteS sert à faire des Select SQL et Smarty a assigné des valeurs dans le template, tu ne peux pas les imbriqués comme cela. Par curiosité peux tu me montrer comment tu enregistres les données en bdd, car tu n'as pas l'air de bien connaitre le fonctionnement de la class Db dans PrestaShop, donc je suis un peu curieux.

Qu'as tu rajouter comme table et comme champs dans ta bdd ?
As tu les rajouté les champs dans l'objet Customer ?

Link to comment
Share on other sites

Re,

Avec le smarty j'ai effectivement beaucoup de mal, voici comment j'ajoute à la BDD:

(fichier classes/Customers.php)

       $fields['rayon'] = (int)Tools::getValue('rayon');        
       $fields['diffuse'] = (int)Tools::getValue('diffuse');    
       $fields['diffusetel'] = (int)Tools::getValue('diffusetel');



J'ai mit les champs "rayon" "diffuse" "diffusetel" dans la table ps_customers.
Pour l'edition des informations, donc sur la page identity.php, je n'ai rien eu besoin de touché simplement à rajouter le formulaire dans le fichier identity.tpl (donc je suppose qu'il utilise la page Customer.php pour enregistrer les données).

Merci,
Geoffrey.

Link to comment
Share on other sites

Ah alors, c'est très simple, je vais te proposer de modifier légèrement ton code.

$fields['rayon'] = (int)Tools::getValue('rayon');        
$fields['diffuse'] = (int)Tools::getValue('diffuse');    
$fields['diffusetel'] = (int)Tools::getValue('diffusetel'); 


Par

$fields['rayon'] = (int)$this->rayon;
$fields['diffuse'] = (int)$this->diffuse;    
$fields['diffusetel'] = (int)$this->diffusetel; 



Ensuite il suffit de rajouter les champs rayon, diffuse et diffusetel à l'objet Customer (parmi les variables déclarés au début de l'objet).

   public        $rayon;
   public        $diffuse;
   public        $diffusetel;



Une fois ces variables chargés, le code

 $customer = new Customer((int)(self::$cookie->id_customer)); 

récupérera automatiquement les informations en base de données, et il sera possible d'y accéder en php de la manière suivante :

 $customer->rayon 



Pour ce qui est de smarty, dans le controller de Identity, on recopie directement les valeurs de l'objet dans POST comme tu peux le voir ici

$_POST = array_map('stripslashes', $customer->getFields());



Tu peux donc accéder à la valeur dans smarty à l'aide du code suivant :

{$smarty.post.rayon}



Voilà, je pense tu devrais réussir à faire ce que tu veux :)

Link to comment
Share on other sites

Re,

Merci,
pour les variables suivante, je les avait bien, j'avais oublié de le préciser dans mon précédent post

public        $rayon;
   public        $diffuse;
   public        $diffusetel;





Le code suivant, apparaît déjà au début du fichier identity.php n'est-ce pas?

$customer = new Customer((int)(self::$cookie->id_customer));



J'ai donc rajouté à la suite:

$rayon = $customer->rayon;



ensuite à la fin j'ai rajouté:

   'rayon' => $rayon



ce qui donne (je sais pas si j'ai bien fait de l'insérer ici):

$smarty->assign(array(
   'need_identification_number' => $need_identification_number,
   'years' => Tools::dateYears(),
   'sl_year' => $birthday[0],
   'months' => Tools::dateMonths(),
   'sl_month' => $birthday[1],
   'days' => Tools::dateDays(),
   'sl_day' => $birthday[2],
   'errors' => $errors,
   'rayon' => $rayon));


donc avec ton code, je récupère bien les checkbox, par contre le rayon reste sur la valeur "--" dans le tpl j'ai pour le select le code suivant:



Rayon de vente estimé (autour de votre ville)

-
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150

*(valeurs en Km)



Je ne suis pas du tout sûr de ce que j'ai fait, et visiblement, j'ai raison, puisque ça ne fonctionne qu'à moitié


Merci de l'aide que tu m'apportes, désolé si j'ai du mal ^^'
Geoffrey.

Link to comment
Share on other sites

Bonjour, c'est normal que tu ai "-" à chaque fois tu ne précises pas lequel doit être sélectionné...

90



ensuite tu es en smarty et je vois que value est 1000* le nombre qui est à coté donc pourquoi ne pas utiliser une boucle ?

{foreach from=$liste_rayons   item=id_rayon}
{$id_rayon}
{/foreach}



Et maintenant les 2 ensembles:


{foreach $liste_rayons  item=id_rayon}
{$id_rayon}
{/foreach}



J'espère que je ne me suis pas trompé ;)


---------------
EDIT : si tu es en smarty 3, utilise la boucle for:


{for $id_rayon=5 to 150 step 5}
{$id_rayon}
{/for}

Link to comment
Share on other sites

Relis bien mes réponses, tu n'as rien besoin d'assigner à Smarty.

As tu bien remplacer le code que je t'ai demandé ?

$fields['rayon'] = (int)Tools::getValue('rayon');        
$fields['diffuse'] = (int)Tools::getValue('diffuse');    
$fields['diffusetel'] = (int)Tools::getValue('diffusetel'); 


Par

$fields['rayon'] = (int)$this->rayon;
$fields['diffuse'] = (int)$this->diffuse;    
$fields['diffusetel'] = (int)$this->diffusetel; 




Je ne t'ai jamais demandé de rajouter ces lignes là :

   $rayon = $customer->rayon;


   'rayon' => $rayon




Et oui ce code est déjà present (comme précisé dans mon message)

$customer = new Customer((int)(self::$cookie->id_customer));




Relis ce que j'ai fait et applique chaque étape. Mon message est très clair, tu devrais pouvoir t'en sortir.
Mais il est important que tu lises toute ma réponse et que tu l'appliques complètement (et non en partie). Sinon cela marchera à moitié (comme tu l'as dit :) )

Link to comment
Share on other sites

Re,

Bin j'avais compris ça au début, j'avais remplacé uniquement le code:

$fields['rayon'] = (int)Tools::getValue('rayon');        
$fields['diffuse'] = (int)Tools::getValue('diffuse');    
$fields['diffusetel'] = (int)Tools::getValue('diffusetel');



Et comme ça ne fonctionnait pas, je me suis dit que j'avais mal compris et que j'avais oublié quelque chose, donc j'ai rajouté les bout de codes.

Pour le .tpl, avec le code


{foreach $liste_rayons  item=id_rayon}
{$id_rayon}
{/foreach}



Il y a 2 petites erreurs:

{foreach $liste_rayons  item=id_rayon}


devient

{foreach from=$liste_rayons  item=id_rayon}



Et

{$id_rayon}


devient

{$id_rayon}



Par contre, la liste est vide, donc je pense qu'il faut définir les valeurs de "$liste_rayons", dans le smarty3 on définie les valeurs en donnant le début, la fin et les étapes, mais ici, je la définie comment?

Merci de ta patience (et il en faut parfois avec mes problèmes ^^')

Geoffrey.

Link to comment
Share on other sites

Re,

Merci, donc j'arrive à afficher la liste et à afficher la valeur enregistrée j'ai modifié le code de coeos.pro de la manière suivante:


-
               {foreach from=$liste_rayons item=id_rayon}
{$id_rayon}
               {/foreach}



sans l'ajout du "*1000" dans le if, il n'affiche pas la valeur enregistrée.

Merci à vous deux, vous m'avez bien aidé.


Je vais encore abuser de votre temps si ça ne vous dérange pas ^^

Je voudrais que lorsqu'un client modifie la ville de son adresse (donc dans la page address.php) il m'exécute un script php.
Sauf que j'ignore comment effectuer la comparaison.

Il me faudrait un truc du genre

if ($oldcity != $city){ //$oldcity = ville lors de l'ouverture de la page address.php et $city ville présente dans le champs city lors de la validation)
 mon code
}



Ce que je pensais faire c'est lors de l'ouverture, récupérer la valeur dans la colonne "city", de l'enregistrer dans la variable $oldcity mais j'ignore comment récupérer cette valeur?

ça peut être?:

$oldcity = $address->city;



Et ensuite, à quel endroit placer ma condition dans le fichier address.php?

En tout cas, merci beaucoup pour l'aide que vous m'avez apportez jusqu'ici.

Link to comment
Share on other sites

J'ai peut être parlé trop vite, en fait, lorsque j'édit mes informations depuis identity.php les valeurs des checkbox s'actualisent bien dans la base de données, par contre, maintenant, via la page "authentication.php, les valeurs des checkbox ne s'enregistrent plus dans la base de données.

Voici mon code dans le tpl:



Afficher mes informations sur la Carte*
           <input type="checkbox" name="diffuse" id="diffuse" value="1" {if $smarty.post.diffuse == 1} checked="checked"{/if} />

*Affiche les informations suivantes: Nom, Prénom, Ville et Adresse Email. 
           Cela permet à une Ambassadrice, Manager ou Leader de vous contacter plus facilement (non obligatoire, mais recommandé).



Afficher mon Numéro de Portable*
           <input type="checkbox" name="diffusetel" id="diffusetel" value="1" {if $smarty.post.diffusetel == 1} checked="checked"{/if} />

*Affiche le Numéro de Portable sur la Carte (Permet d'être contacter
           plus facilement par les autres Ambassadrices).

       {literal}
       [removed] 
   function toggleSubmit() { 
       document.getElementById('diffusetel').disabled = !document.getElementById('diffuse').checked; 
   } 
   document.getElementById('diffuse').onclick = toggleSubmit; 
   toggleSubmit(); // Déclenchement au premier affichage 
       [removed] {/literal}



Une idée?

Geoffrey.

Link to comment
Share on other sites

le ' y est bien, j'ai dû faire une bêtise en collant le code, ou alors le forum me l'a gobé en validant.

Je suis en smarty 2.6, donc le soucis ne vient pas de là, de plus j'avais supprimé la partie javascript pour faire des essais, j'ai même essayé en recopiant tout le fieldset du formulaire de la page "identity.php" pensant que c'était mon formulaire qui avec un erreur, puisque celui de identity.php fonctionne, mais ça change absolument rien, il ne veut absolument pas m'enregistrer les valeurs des checkbox.

Link to comment
Share on other sites

Salut,
Merci des réponses, j'ai essayé 4 manières différentes selon vos codes:

           <input type="checkbox" name="diffuse" id="diffuse" value="1" {if isset($smarty.post.diffuse) AND $smarty.post.diffuse == 'on'} checked="checked"{/if} />


           <input type="checkbox" name="diffuse" id="diffuse" {if isset($smarty.post.diffuse) AND $smarty.post.diffuse == 'on'} checked="checked"{/if} />


           <input type="checkbox" name="diffuse" id="diffuse" value="1" {if isset($smarty.post.diffuse) AND $smarty.post.diffuse eq 'on'} checked="checked"{/if} />


           <input type="checkbox" name="diffuse" id="diffuse" {if isset($smarty.post.diffuse) AND $smarty.post.diffuse eq 'on'} checked="checked"{/if} />



Et aucune ne fonctionne. Je ne comprends vraiment pas. Mais, le fait d'avoir mit "== 1" au lieu de " == 'on' " ça devrait rien changer, puisque cette syntaxe fonctionne pour le formulaire sur la page identity.php et puis ça fonctionnait avant que je change:

$fields['rayon'] = (int)Tools::getValue('rayon');        
$fields['diffuse'] = (int)Tools::getValue('diffuse');    
$fields['diffusetel'] = (int)Tools::getValue('diffusetel');



Par:

$fields['rayon'] = (int)$this->rayon;
$fields['diffuse'] = (int)$this->diffuse;    
$fields['diffusetel'] = (int)$this->diffusetel;



Donc je vois pas du tout d'où ça peut provenir. Par curiosité, j'ai repris le tpl d'origine et incorporé le fieldset pour voir si ce n'était pas un soucis du formulaire qui viendrait avant (un guillemet, une accolade oublié etc...) mais le résultat est le même.

Je pense que le soucis provient plus de Customer.php que de authentication.tpl

Edit:
J'ai essayé de remettre pour les checkbox:

$fields['diffuse'] = (int)Tools::getValue('diffuse');    
$fields['diffusetel'] = (int)Tools::getValue('diffusetel');



Là, il m'enregistre bien ce qu'il faut, cependant, on revient au même soucis du début pour les checkbox, à savoir que lors de l'affichage de "identity.php" les checkbox ne sont pas sur la bonne configuration (celle enregistrée dans la BDD)

Merci,
Geoffrey.

Link to comment
Share on other sites

Re,

Bon et bien, j'ai résolu mon problème en ajoutant les lignes suivantes dans le fichier "authentication.php":

       if (Tools::isSubmit('diffuse'))
       {
           $customer->diffuse = (int)Tools::getValue('diffuse');;
       }

       if (Tools::isSubmit('diffusetel'))
       {
           $customer->diffusetel = (int)Tools::getValue('diffusetel');;
       }



Juste avant:

       $customer->birthday = (empty($_POST['years']) ? '' : intval($_POST['years']).'-'.intval($_POST['months']).'-'.intval($_POST['days']));



Merci de votre aide en tout cas.

Vous auriez une idée pour ça sinon?
http://www.prestashop.com/forums/viewreply/473476/

(Ma question avant que je reviennes sur le formulaire)

Merci
Geoffrey.

Link to comment
Share on other sites

Salut,
Personne pour ce soucis:

Je voudrais que lorsqu'un client modifie la ville de son adresse (donc dans la page address.php) il m'exécute un script php.
Sauf que j'ignore comment effectuer la comparaison.

Il me faudrait un truc du genre

if ($oldcity != $city){ //$oldcity = ville lors de l'ouverture de la page address.php et $city ville présente dans le champs city lors de la validation)
 mon code
}



Ce que je pensais faire c'est lors de l'ouverture, récupérer la valeur dans la colonne "city", de l'enregistrer dans la variable $oldcity mais j'ignore comment récupérer cette valeur?

ça peut être?:

$oldcity = $address->city;



Et ensuite, à quel endroit placer ma condition dans le fichier address.php?

Ou alors, peut être y a-t-il directement un moyen de savoir avec smarty si le champs a été modifié?


Geoffrey.

Link to comment
Share on other sites

  • 2 months later...

Salut,

 

Je viens de m'apercevoir d'un soucis, c'est que dans le BO quand je veux éditer un utilisateur (donc on se retrouve dans le fichier AdminCustomers.php) il me met une erreur "le champs rayon est requis" donc j'ai décidé de rajouter le champs et les checkbox, pour les checksbox tout c'est bien passer, mais pour le select, je n'arrive pas à afficher la liste

 

Pour rappel, voici le code du tpl:

 

<select id="rayon" name="rayon">
			<option value="">-</option>
			{foreach from=$liste_rayons item=id_rayon}
			<option value="{$id_rayon}000" {if $smarty.post.rayon == $id_rayon *1000}selected="selected"{/if}>{$id_rayon}</option>
			{/foreach}
	</select>

 

 

Et voici maintenant le code PHP du AdminCustormers.php que j'ai mit:

 


               echo '<label>Rayon de vente estimé</label>
                     <div class="margin-form">
                     <select id="rayon" name="rayon">
                       <option value="">-</option>'; 
                       foreach ($liste_rayons as $id_rayon)
                           echo '<option value="'.$id_rayon.' 000" '.($rayon == $id_rayon ? 'selected="selected"' : '').'>'.$id_rayon.'</option>';
                   echo '</select>
               </div>';

 

Voyez-vous ce qui ne va pas?

 

 

Merci d'avance pour l'aide.

 

 

Geoffrey.

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...