[RESOLU] Sauvegarde d'un formulaire en fichier

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 sept. 2012, 22:31

si tu change de page met le formulaire en session, genre $_SESSION['formulaire truc'] = $_POST.

sur la page du formulaire tu regarde, pour chaque champ, s'il y a un idex y correspondant pour l'utiliser

par exemple
<?php
echo '<input type="text" name="pseudo" value="';
if (!empty($_SESSION['truc']['pseudo']))
    echo $_SESSION['truc']['pseudo'];
echo '" />';
?>
tu peux aussi faire autrement, comme créer une classe ou une fonction que le fera pour toi en plus simple
genre
<?php
echo '<input type="text" name="pseudo" value="'.fonctionQuiFaitTout('truc','pseudo').'" />';

// Avec 
fonctionQuiFaitTout($formulaire, $nomChamp) {
    if (!empty($_SESSION[$formulaire][$nomChamp]))
        return $_SESSION[$formulaire][$nomChamp];
    else
        return '';
}
?>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 67 Messages

14 sept. 2012, 22:58

Merci moogli ... mais là, ça sort de mes compétences ...

Je dois vérifier chaque champ ?
Si oui, je laisse tomber (pour le moment) et je reprendrai quand je n'aurai rien d'autre à faire ... j'ai un nombre de champs assez important.
Tu peux voir ici (www.employability.be/site_fr/formffull.php) le bidule en cours de développement (je vais pas t'envoyer le code source, il y a 2039 lignes pour le formulaire !!!
J'ai des champs de types suivants: text - textarea et checkbox
<input type="text" name="nom" size="66" />
<textarea name="description" rows="5" cols="55" /></textarea>
<input type="checkbox" name="interets[]" value="16" />

Quant au retour vers le formulaire en cas d'erreur, il se fait comme ça:

if (strlen($message) > strlen($msg_erreur)) {
header('Location:_formfull.php?envoi=Veuillez remplir tous les champs obligatoires et cocher au minimum 1 domaine d intervention&ori=2');
die();

Je demande bien sûr pas de faire le boulot à ma place mais une petite explication 'pour un nul' serait bienvenue ... si tu as le temps ... sans obligation.

Merci du tuyau en tout cas.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 sept. 2012, 01:25

si tu veux pré remplir tes champs tu n'a pas trop le choix, soit en réalisant la validation sur la même page que le formulaire (en haut en général) soit sur une autre.

dans le 1er cas tu utilise $_POST le second $_SESSION (comme dans mon exemple).

Quand je regarde ton formulaire je dit que :
- les infos général tu ne peux pas y couper : 18 champs
- activité idem 2 champs (donc 20 la)
- Domaines d'intervention : un palanquées de checkbox, mais derrière pas plus de 4 "variables". reste a savoir si c'est généré dynamiquement ou pas :) dans le second cas galère
- Personnel, même chose, c'est un boucle qui doit générer ça. d'ailleurs y a moyen de faire quelque chose de "sexy" avec du JS qui ajoute des champs à la volé.
- autre idem
- partie 6 la tu n'y coupe pas.

donc pour moi 32 à 35 tests en automatisant bien la chose. ça prend un peu de temps mais pour l'utilisateur c'est super pratique :!

Après cela dépend de comment tu as prévu la chose.

Au du source :
- checkbox ok tu utilise la notation tableau
- personnel : ko tu utilise une dénomination, utilise aussi la notation tableau. il faut savoir que les tableau se numérote de zéro (par défaut) donc si tu place tes 4 à la suite ils auront toujours le même numéro, tu ne perd donc le fils traiter avec un foreach ensuite.
- idem pour les bureaux.

nous seulement tu t'emmerde mais en plus tu te limite dans les possibilités.

par exemple tu peux faire
<?php
<?php
$nombre = 5;
for( $i=0; $i<=$nombre ; $i++) {
    echo '<input type="text" name="cp[]" ';
    if( !empty($_POST['cp'][$i]))
		echo 'value="', $_POST['cp'][$i] , '" ';
	echo '/>';
	
	 echo '<input type="text" name="ville[]" ';
    if( !empty($_POST['ville'][$i]))
		echo 'value="', $_POST['ville'][$i] , '" ';
	echo '/>';
	
	 echo '<input type="text" name="tel[]" ';
    if( !empty($_POST['tel'][$i]))
		echo 'value="', $_POST['tel'][$i] , '" ';
	echo '/>';
	
	 echo '<input type="text" name="mail[]" ';
    if( !empty($_POST['mail'][$i]))
		echo 'value="', $_POST['mail'][$i] , '" ';
	echo '/>';
}
?>

23 lignes au lieux de 151 (bon d'accord y a pas déclaration de la table et tous. bien indenté ça te prend 21 lignes.
Total 44 lignes de code VS 151 tu divise ton code par 3.4 (il te rest 29.1% du code départ).

en abusant juste un poil, ton code pour faire 594 lignes :mrgreen:

enfin disons au moins la moitiers avec ce type de factorisation.

Juste pour la partie 5 tu passe de 302 ligne à 88 etc etc.

Après je ne sais si tu voulais des explications sur autre chose, ta façon de faire semble correcte, par exemple la redirection est utilisée sur ce forum.

sinon pour les 2039 lignes de c'est pas forcément beaucoup. pour un script un peu quand même, y a surement de la factorisation de code a faire, de voir si tu n'a pas de copier coller de code qui pourrait devenir des fonctions, et déporter tous sa dans d'autre fichier.

Pour exemple, j'ai bossé sur un appli php qui à environ 15000 lignes de code au total.
Un collègue m'a parlé d'un programme (relativement complexe, en cobol) de presque 2 millions de lignes ;) (et c'est pas forcément gênant, sauf si tu veux comprendre le fonctionnement complet :) )

bref c'est pas la taille qui compte ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 343 Messages

15 sept. 2012, 06:01

Sinon pour forcer le téléchargement, il y a bien un header:
header("Content-Type: application/force-download");
;)
Développeur web

Eléphant du PHP | 67 Messages

15 sept. 2012, 11:49

Merci Moogli pour toutes ces explications.
Je vais essayer de mettre tout ça en pratique et commencer par le plus simple.
Je n'avais jamais utilisé de sessions jusqu'à présent mais je pense avoir compris le principe.
Bon, mon premier test n'est pas concluant ... si je pouvais te demander de déboguer ce que j'ai fait ... si je n'abuse pas:

Dans mon formulaire, j'ai mis tout en haut de la page le code suivant:
<?
session_start();
if (!isset($_SESSION['full'])) {
$_SESSION['full'] = $_POST ;
}
?>
Ensuite, tout mon petit bazard html et mes déclaraions de tableau

A ma première variable j'ai mis ceci:
<?php
echo "<input type=\"text\" name=\"nom\" size=\"66\"";
     if (!empty($_SESSION['full']['nom']))
          echo $_SESSION['full']['nom'];
echo "\" />";
?>
Après une validation du formulaire avec la fonction suivante:
<INPUT type="button" value="Envoyer" onClick="document.formfull.submit();">

et un retour de la page de traitement avec l'erreur (puisque les champs obligatoires ne sont pas remplis)
<?
// début du traitement 
if (strlen($message) > strlen($msg_erreur)) {
header('Location:_formfull.php?envoi=Veuillez remplir tous les champs obligatoires et cocher au minimum 1 domaine d intervention&ori=2');
die();
}
// fin du traitement
?>
Mais mon champ 'nom' reste désespérément vide ... il ne ré affiche pas la valeur encodée à l'origine.

Qu'ai-je fait de mal ?
Dois-je mettre quelque chose pour le retour dans ma page traitement pour donner un id de session?
(elle est appelée de la manière suivante : <form name="formfull" method="post" action="_traitementfull.php">

Un grand merci d'avance si tu pouvais encore prendre le temps de jeter un coup d'oeil là-dessus.
Modifié en dernier par philspain le 15 sept. 2012, 13:29, modifié 4 fois.

Eléphant du PHP | 67 Messages

15 sept. 2012, 11:54

Sinon pour forcer le téléchargement, il y a bien un header:
header("Content-Type: application/force-download");
;)
Merci ... Je vais tester ça

Eléphant du PHP | 67 Messages

15 sept. 2012, 13:44

Moogli, j'ai trouvé ....

Voici le nouveau code : (je n'avais pas mis en 'value')
<?php
              echo "<input type=\"text\" name=\"nom\" size=\"66\"";
			  if (!empty($_SESSION['full']['nom']))
			  	 echo "value=\"".$_SESSION['full']['nom']."\"";
				echo "\" />";
?>

Eléphant du PHP | 67 Messages

15 sept. 2012, 17:29

Bon, je m'en sort pour tout, grâce à l'aide de Moogli mais pas pour mes checkbox ...

J'ai essayé ceci :
<?
echo "<input type=\"checkbox\" name=\"interets[]\" value=\"11\""; 
if (in_array("11",$_SESSION['full']['interets[]']))
    echo " checked=\"checked\"";
echo "/>";
?>
Mais ma syntaxe est probablement foireuse ..

ViPHP
xTG
ViPHP | 7331 Messages

15 sept. 2012, 19:01

if (in_array("11",$_SESSION['full']['interets']))
    echo " checked=\"checked\"";
;)

Eléphant du PHP | 67 Messages

15 sept. 2012, 19:23

if (in_array("11",$_SESSION['full']['interets']))
    echo " checked=\"checked\"";
;)
Merci ... mais j'avais déjà essayé ça.
Voici le message d'erreur renvoyé:

in_array() [function.in-array]: Wrong datatype for second argument in /home/employability/public_html/common_fr/_formfull.php on line 424
/>

Eléphant du PHP | 343 Messages

15 sept. 2012, 20:09

ça donne quoi un print_r de $_SESSION['full']['interets']?
Développeur web

Eléphant du PHP | 67 Messages

15 sept. 2012, 20:17

ça donne quoi un print_r de $_SESSION['full']['interets']?
Je viens de trouver d'où venait mon problème.
En fait, mon array n'existe qu'après le retour de ma page de traitement. C'est donc normal que j'aie cette erreur au 1er chargement de ma page.
plus d'erreur par contre lors du 'retour' de la page de traitement (à partir du moment où il y a une variable dedans).

il me reste à savoir comment faire pour créer cet array (vide) en début de script s'il n'existe pas ...
Je cherche mais si tu as une idée ...

Merci pour ta réponse.

Eléphant du PHP | 67 Messages

15 sept. 2012, 21:31

Voilà, tout est OK ... je mets le POST en résolu
<?
			  echo "<input type=\"checkbox\" name=\"interets[]\" value=\"19\""; 
			  if (!empty($_SESSION['full']['interets'])){
			  if (in_array("19",$_SESSION['full']['interets']))
                          echo " checked=\"checked\"";
			  }
			  echo "/>";
 ?>
Merci à tous, en tout cas ... c'est sympa de m'avoir aidé.

Philippe

Eléphant du PHP | 67 Messages

16 sept. 2012, 17:59

si tu veux pré remplir tes champs tu n'a pas trop le choix, soit en réalisant la validation sur la même page que le formulaire (en haut en général) soit sur une autre.

dans le 1er cas tu utilise $_POST le second $_SESSION (comme dans mon exemple).

Quand je regarde ton formulaire je dit que :
- les infos général tu ne peux pas y couper : 18 champs
- activité idem 2 champs (donc 20 la)
- Domaines d'intervention : un palanquées de checkbox, mais derrière pas plus de 4 "variables". reste a savoir si c'est généré dynamiquement ou pas :) dans le second cas galère
- Personnel, même chose, c'est un boucle qui doit générer ça. d'ailleurs y a moyen de faire quelque chose de "sexy" avec du JS qui ajoute des champs à la volé.
- autre idem
- partie 6 la tu n'y coupe pas.

donc pour moi 32 à 35 tests en automatisant bien la chose. ça prend un peu de temps mais pour l'utilisateur c'est super pratique :!

Après cela dépend de comment tu as prévu la chose.

Au du source :
- checkbox ok tu utilise la notation tableau
- personnel : ko tu utilise une dénomination, utilise aussi la notation tableau. il faut savoir que les tableau se numérote de zéro (par défaut) donc si tu place tes 4 à la suite ils auront toujours le même numéro, tu ne perd donc le fils traiter avec un foreach ensuite.
- idem pour les bureaux.

nous seulement tu t'emmerde mais en plus tu te limite dans les possibilités.

par exemple tu peux faire
<?php
<?php
$nombre = 5;
for( $i=0; $i<=$nombre ; $i++) {
    echo '<input type="text" name="cp[]" ';
    if( !empty($_POST['cp'][$i]))
		echo 'value="', $_POST['cp'][$i] , '" ';
	echo '/>';
	
	 echo '<input type="text" name="ville[]" ';
    if( !empty($_POST['ville'][$i]))
		echo 'value="', $_POST['ville'][$i] , '" ';
	echo '/>';
	
	 echo '<input type="text" name="tel[]" ';
    if( !empty($_POST['tel'][$i]))
		echo 'value="', $_POST['tel'][$i] , '" ';
	echo '/>';
	
	 echo '<input type="text" name="mail[]" ';
    if( !empty($_POST['mail'][$i]))
		echo 'value="', $_POST['mail'][$i] , '" ';
	echo '/>';
}
?>

23 lignes au lieux de 151 (bon d'accord y a pas déclaration de la table et tous. bien indenté ça te prend 21 lignes.
Total 44 lignes de code VS 151 tu divise ton code par 3.4 (il te rest 29.1% du code départ).

en abusant juste un poil, ton code pour faire 594 lignes :mrgreen:

enfin disons au moins la moitiers avec ce type de factorisation.

Juste pour la partie 5 tu passe de 302 ligne à 88 etc etc.

Après je ne sais si tu voulais des explications sur autre chose, ta façon de faire semble correcte, par exemple la redirection est utilisée sur ce forum.

sinon pour les 2039 lignes de c'est pas forcément beaucoup. pour un script un peu quand même, y a surement de la factorisation de code a faire, de voir si tu n'a pas de copier coller de code qui pourrait devenir des fonctions, et déporter tous sa dans d'autre fichier.

Pour exemple, j'ai bossé sur un appli php qui à environ 15000 lignes de code au total.
Un collègue m'a parlé d'un programme (relativement complexe, en cobol) de presque 2 millions de lignes ;) (et c'est pas forcément gênant, sauf si tu veux comprendre le fonctionnement complet :) )

bref c'est pas la taille qui compte ;)


@+
Moogli, merci pour tes explication et ta patience ...
J'ai mis une partie de tes conseils en pratique et tu as raison ... ça demande un peu de boulot mais c'est plus agréable pour le visiteur du site ...
Encore merci pour tes conseils et ton aide

Philippe