Conserver l'affichage des saisies d'1 formulaire

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Conserver l'affichage des saisies d'1 formulaire

Par clend  -  15 reponses  -  Le 14/01/2016 14:49  -  Editer  - 

Bonjour,

De façon naturelle, quand l'utilisateur clique sur le bouton associé à l'ordre "submit", les données qu'il vient de saisir sont exploitées par le script qui suit ET elles sont systématiquement toutes automatiquement effacées du formulaire.
Ma question : comment conserver l'affichage des données dans le formulaire même après validation ?

ps : ceci permettrait à l'utilisateur de procéder à maintes simulations sans avoir à tout ressaisir systématiquement.

Merci pour votre aide.

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 14/01/2016 16:04  -  Haut de page  - 

Salut Clend,
en fait, la méthode est relativement simple : dans la mesure où l'enregistrement original crée en quelque sorte une fiche sur un élément donné, ré-afficher le formulaire avec les données de cette fiche implique que, lorsque la page est demandée, on a l'identifiant de cette fiche, et donc on peut commencer par récupérer ces informations dans la base et pré-alimenter les champs du formulaire.

Voici un exemple assez schématique de la méthode :

    <?php  
    $f_id = (isset($_GET['f'])) ? $_GET['f'] : null;  
    $aInfos = array(  
        'col_x' => null,  
        'col_y' => null,  
        'col_z' => null  
    );  
    if(!is_null($f_id))  
    {  
        $requete_sql = "SELECT col_x, col_x, col_z FROM table_t WHERE col_id = ";  
        // exécuter la requête et récupérer le résultat de la ligne dans $aInfos  
    }  

    /* Construction du formulaire */  
    ?>  
    <form>  
      <p>  
        <label for="col_x">Valeur de X</label>  
        <input type="text" id="col_x" name="col_x" value="<?php echo($aInfos['col_x']); ?>" />  
      </p>  
      <p>  
        <label for="col_y">Valeur de Y</label>  
        <input type="text" id="col_y" name="col_y" value="<?php echo($aInfos['col_y']); ?>" />  
      </p>  
      <p>  
        <label for="col_Z">Valeur de Z</label>  
        <input type="text" id="col_z" name="col_z" value="<?php echo($aInfos['col_z']); ?>" />  
      </p>  
      // ...  
    </form>
 
Par clend  -  Le 14/01/2016 16:56  -  Haut de page  - 

Merci cyrano pour cette réponse très rapide.
Ton idée de code php dans "value" est excellente. Mais je n'ai pas tout compris, notamment ton passage par la "table".
Je viens de m'en sortir avec une écriture simplifiée toujours sur "value" :

    <label><span style="color:green">Précisez votre "ville d'arrivée" (également obligatoire) : <input type="text" name="y" required size="20" value="<?php if (isset($_POST['y'])){echo $_POST['y'];} ?>"/></label>
 
Par Cyrano  -  Le 14/01/2016 17:08  -  Haut de page  - 

Salut,
j'ai supposé que les données étaient enregistrées dans une base de données, ce qui est somme toute relativement courant.

Mais ça peut parfaitement provenir d'une autre source. L'idée reste la même.

Par contre, j'évite toujours de faire ce genre de choses :

value="<?php if (isset($_POST['y'])){echo $_POST['y'];} ?>"

Pour une meilleure lisibilité du code, je définis une variable avant, comme montré dans l'exemple initial.

$y = (isset($_POST['y'])) ? $_POST['y'] : null;
//... reste de code PHP si besoin est ...
// début du formulaire et dans le champ :
value="<?php echo $y ?>"
 
Par clend  -  Le 20/01/2016 17:38  -  Haut de page  - 

J'arrive bien à solutionner ainsi tous les "input" de type "txt" ... mais pas moyen d'y arriver avec des "input" de type "radio" ?
Qui connaît la solution ? Merci.

 
Par Cyrano  -  Le 20/01/2016 17:54  -  Haut de page  - 

Ce n'est guère plus compliqué.

Un groupe de boutons radios ont chacun un attribut id avec une valeur distincte, mais un attribut name avec la même valeur pour tous. Ensuite, on ajoute à l'un ou l,autre l'attribut checked="checked".

Donc, imaginons par exemple trois boutons radios pour indiquer la civilité : M, Mme et Melle. On va avoir pour attribut name la valeur « civilite » et on utilisera les identifiants civilite_m, civilite_mme et civilite_melle. Ce qu'il faut faire maintenant, c'est définir lequel va être coché.

$civilite = (isset($_POST['civilite'])) ? $_POST['civilite'] : 'M';

Maintenant, on définit l'attribut checked pour chacun des trois boutons :

$checked_m     = ($civilite == 'M')     ? ' checked="checked"' : '';
$checked_mme   = ($civilite == 'Mme')   ? ' checked="checked"' : '';
$checked_melle = ($civilite == 'Melle') ? ' checked="checked"' : '';

Il n'y a plus maintenant qu'à insérer ça dans le HTML :

<label for="civilite_m">Monsieur</label>
<input type="radio" id="civilite_m" name="civilite" value="M" <?php echo($checked_m); ?> />
<label for="civilite_mme">Madame</label>
<input type="radio" id="civilite_mme" name="civilite" value="Mme" <?php echo($checked_mme); ?> />
<label for="civilite_melle">Mademoiselle</label>
<input type="radio" id="civilite_melle" name="civilite" value="Melle" <?php echo($checked_melle); ?> />

Et voilà, au premier affichage avant d'avoir envoyé le formulaire, le bouton « Monsieur » est coché par défaut, et si on envoie le formulaire et qu'il s'affiche à nouveau, alors le bouton qui aura été coché sera à nouveau coché.

Est-ce que ça répond à ta question ?

 
Par clend  -  Le 20/01/2016 18:21  -  Haut de page  - 

Absolument, et grand merci Cyrano !
ps : j'aime ton humour quand tu écris "ce n'est guère plus compliqué". J'avoue humblement que je pressentais cette forme de soultion, mais j'étais bien incapable de l'écrire correctement.
Bonne soirée !

 
Par Cyrano  -  Le 20/01/2016 18:24  -  Haut de page  - 

Comme toute programmation, quel que soit le langage, il y a trois règles impératives suivre : la logique, la logique et surtout, la logique ;)

 
Par clend  -  Le 23/01/2016 07:51  -  Haut de page  - 

@ cyrano :

Bonjour,
Grâce à tes conseils précédents, tout est ok pour mon formulaire sauf un problème de saisie de 2 dates.
J'ai besoin d'autoriser la saisie d'une "date mini" & d'une "date maxi". Dans le formulaire affiché, j'aimerais que les 2 valeurs par défaut -avant toute saisie- s'affichent avec la "date du jour" (puis ultérieurement reconduite des données précédentes).
Voici ce que j'ai écrit, mais qui ne m'affiche pas les dates du jour avant toute saisie :

    <label>Précisez la date mini du départ : <input type="date" name="choix_date1" required value="  

    <?php  
    if (isset($_POST['choix_date1'])) {  
       echo $_POST['choix_date1'];  
    }else{  
       $cejour = new DateTime();  
       echo $cejour->format('d/m/Y');  
    }  
    ?>" et la date maxi : <input type="date" name="choix_date2" required value="  

    <?php  
    if (isset($_POST['choix_date2'])) {  
       echo $_POST['choix_date2'];  
    }else{  
       $cejour = new DateTime();  
       echo $cejour->format('d/m/Y');  
    }  

    ?>" ></label>  

nb : pas d'erreurs en retour, mais simplement sans effet !

Merci pour tes bons conseils (qui peuvent attendre la fin du weekend).

 
Par Cyrano  -  Le 23/01/2016 09:50  -  Haut de page  - 

Il y a une petite erreur dans le code, une des balises input n'est pas fermée.

C'est pour ce genre d'erreur que je recommande toujours de définir des variables en amont et d'éviter de mettre trop de logique PHP dans le code HTML.

Voici comment modifier ce code et le rendre nettement plus facile à lire (et à corriger au besoin) :

    <?php  
    $cejour = new DateTime();  
    $aujourdhui = $cejour->format('d/m/Y');  
    $date1 = (isset($_POST['choix_date1'])) ? $_POST['choix_date1'] : $aujourdhui;  
    $date2 = (isset($_POST['choix_date2'])) ? $_POST['choix_date2'] : $aujourdhui;  
    ?>  
    <label>  
      Précisez la date mini du départ :  
      <input type="date" name="choix_date1" required value="<?php echo($date1); ?>">  
      et la date maxi :  
      <input type="date" name="choix_date2" required value="<?php echo($date2); ?>">  
    </label>  

Et là, ça devient tout de suite plus clair, non ?

 
Par clend  -  Le 23/01/2016 11:39  -  Haut de page  - 

Bonjour et merci cyrano,

J'ai bien compris mon erreur.
Mais, même en appliquant ta méthode, je n'obtiens -dès le lancement- que le masque traditionnel des dates à savoir "jj/mm/aaaa" (et non pas la date du jour attendue).
J'ai pensé que c'était peut-être provoqué par une librairie php de niveau insuffisant : mais le test de la fonction DateTime() répond fort bien sur mon ordinateur ! Mon php5 est donc suffisant.

 
Par Cyrano  -  Le 23/01/2016 18:10  -  Haut de page  - 

Salut, essaye en remplaçant ceci :

$cejour = new DateTime();  
$aujourdhui = $cejour->format('d/m/Y');

Par ceci :

$aujourdhui = date('d/m/Y');
 
Par clend  -  Le 23/01/2016 19:28  -  Haut de page  - 

Cela ne marche pas mieux : pas d'erreur, mais toujours ce masque de saisie "jj/mm/aaaa" au lieu de la date du jour.

Et ces 2 fonctionnalités sont pourtant opérationnelles quand je les teste dans un script php :

<?php
$cejour = new DateTime();
echo "Nous sommes le " . $cejour->format('d/m/Y') . "";
$cejour = date('d/m/Y');
echo " ou autrement dit le " . $cejour . "";
?>

 
Par Cyrano  -  Le 23/01/2016 20:02  -  Haut de page  - 

Il doit me manquer un élément pour que je comprenne ce qui se passe, parce que l'affichage indiqué n'est absolument pas normal ni logique. Quel environnement utilises-tu ? Apache (version) ? Quelle version de PHP ? En local ou bien sur un serveur en ligne ?

 
Par clend  -  Le 24/01/2016 06:20  -  Haut de page  - 

Bonjour cyrano,

Je viens de trouver la raison de ce dysfonctionnement : tout fonctionne très bien avec le navigateur "Firefox (Mozilla)", mais plus avec "Chrome (Google)". Or j'avais jusqu'à ce jour l'habitude de fonctionner avec Chrome.
Mon environnement de travail est le suivant :
- système d'exploitation : LINUX (version Ubuntu 12.04 lts & 14.04)
- serveur local : APACHE2
- version de PHP : 5
- développement d'un site en local avec LOCALHOST

Je tiens sincèrement à te remercier pour tes conseils pragmatiques. Et ce sont bien tes dernières questions d'hier qui m'ont mis sur la voie de résolution de mon problème.

 
Par Cyrano  -  Le 24/01/2016 10:10  -  Haut de page  - 

Salut Clend, content que tu aies résolu ton problème.

Par contre, je suis surpris de ce que tu annonces : un fonctionnement différent selon le navigateur : là encore, c'est assez surprenant et anormal dans la mesure où le PHP s'exécute coté serveur et non coté client.

Même si tu travailles en localhost, ça reste du client/serveur : sommairement, la partie Apache/PHP, c'est le coté serveur, le navigateur, c'est le coté client qui se connecte sur le serveur via http://localhost : c'est de l'intranet. Donc, le navigateur reçoit et affiche ce que lui envoit le serveur Apache, et Apache retourne ce qu'aura construit PHP selon le code du fichier exécuté. Que ce soit n'importe quel navigateur, le résultat envoyé sera le même. Donc je ne saisis pas trop ce qui fait que le résultat diffère entre Chrome et Firefox.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !