Page 1 sur 1

conserver et réafficher la valeur de plusieurs input générer

Posté : 04 sept. 2008, 19:08
par Ines
Bonsoir,

J'ai un formulaire qui contient plusieurs <select>. Lorsque l'on sélectionne une valeur d'un select, cela va afficher des <input />. A chaque fois que l'on sélectionne une valeur dans n'importe quel <select>, le formulaire est soumis et donc je dois conserver les valeurs des <input />. Je n'ai pas trouvé la bonne méthode.


 //Affichage menu déroulant: nombre de chambre
print "<select style='width: 65px;' onchange='submit();' name='nombredechambre'>";
$varnombredechambre= array('Choisir','1','2','3','4','5 et +');
  foreach ($varnombredechambre as $resnombredechambre)
 {
 print "<option value='$resnombredechambre'";
   if (isset($nombredechambreIs) && $nombredechambreIs== $resnombredechambre)
     {print "selected";}
     print ">$resnombredechambre</option>";
 }
print "</select></li>";

 //Affichage input surfacechambre en fonction du nombre de chambre sélectionné
if ($nombredechambreIs >= 1)
{
  for($i=0; $i<$nombredechambreIs; $i++)
        {
        print "<li><img src='img/spacer.jpg' width='35' height='1' />
        <img src='img/surface-en-m2-1.jpg' />
        <img src='img/spacer.jpg' width='40' height='1' />
        <input type='text' style='background: #A2A2A2;' name='surfacechambre[]' size='10' 
         maxlength='40' value='$surfacechambreIs[$i]' />
        </li>";
        }
}
J'obtiens Uninitialized string offset: 0 sur la ligne :
<input type='text' style='background: #A2A2A2;' name='surfacechambre[]' size='10' 
maxlength='40' value='$surfacechambreIs[$i]' />
J'ai déclaré ma variable comme suit :
if (isset($_POST['surfacechambre']))
{$surfacechambreIs= $_POST['surfacechambre'];} else {$surfacechambreIs= "";}
Merci pour votre aide

Posté : 05 sept. 2008, 12:05
par guilt92
Bonjour,

Je pense que le problème se passe à la première occurence :

On va dans ton formulaire.
On choisit le nombre de chambre.
La page se rafraichit et $_POST['nombredechambre'] existe.
On entre donc dans l'affichage des input.
Et la tu demandes comme valeur : value="$surfacechambreIs[$i]" alors que $surfacechambreis n'existera que après le prochain submit de ton formulaire.

Il faut donc éventuellement tester l'existence de $surfacechambreIs, si elle existe tu mets ça comme valeur (bien que je ne saches pas dans quel cas cela se passera) et sinon tu mets value=""...

conserver et réafficher la valeur de plusieurs input générer

Posté : 05 sept. 2008, 15:13
par Ines
J'ai bien déclaré l'existence de la variable :
if (isset($_POST['surfacechambre']))
{$surfacechambreIs= $_POST['surfacechambre'];} else {$surfacechambreIs= "";}


Je fais une variante et je modifie le name de mes <input /> comme suit : 'surfacechambre[$i]' au lieu de : 'surfacechambre[]'. Le résultat est meilleur mais ce n'est pas encore çà et peut être même pas ça du tout.
<input type='text' style='background: #A2A2A2;' name='surfacechambre[$i]' size='10' 
maxlength='40' value='$surfacechambreIs[$i]' /> 
et voilà ce qui se produit :

Lorsque je sélectionne "1" dans mon <select>, il affiche bien le nombre d'<input /> souhaité mais j'ai tout de suite le message d'erreur : Uninitialized string offset: 1. Si je saisie une valeur et que je soumets le formulaire, la valeur est bien conservée et le message d'erreur disparait


Si je sélectionne toujours "1" avec ce même <select>, que je ne saisie rien et que je sélectionne "2" le message d'erreur se transforme en undefined offset pour chacun des 2 <input />etc...

conserver et réafficher la valeur de plusieurs input générer

Posté : 06 sept. 2008, 14:46
par Ines
Bonjour,

J'avais mal interprété le réponse de "guilt92" et effectivement en testant l'existence de "$surfacechambreIs" comme suit :
//Affichage input surfacechambre en fonction du nombre de chambre sélectionné
 if ($nombredechambreIs >= 1)
 {
    for($i=0; $i<$nombredechambreIs; $i++)
    {
     print "<li><img src='img/spacer.jpg' width='35' height='1' />
     <img src='img/surface-en-m2-1.jpg' />
     <img src='img/spacer.jpg' width='40' height='1' />";
     if (isset($surfacechambreIs) && $surfacechambreIs!= "")
     {
     print"<input type='text' style='background: #A2A2A2;' name='surfacechambre[$i]' size='10' 
     maxlength='40' value='$surfacechambreIs[$i]' />
     </li>";
     }
     else
     {
     print"<input type='text' style='background: #A2A2A2;' name='surfacechambre[$i]' size='10' 
     maxlength='40' value='' />
     </li>";
     }
     }
 }
Les messages d'erreur disparaissent bien dans le cas où je soumets le formulaire avec un autre select après avoir saisi une valeur dans le ou les <input />.


En revanche, ils réapparaissent dans le cas où je sélectionne une valeur puis une autre valeur. Par example, je sélectionne "1" et je décide de sélectionner "2", j'obtiens Undefined offset : 1

Je dois donc faire d'autre(s) test(s)

conserver et réafficher la valeur de plusieurs input générer

Posté : 08 sept. 2008, 10:27
par Ines
Bonjour,

Je ne trouve pas la solution au message "Undefined offset" dans le dernier cas évoqué dans mon précédent message celui où je sélectionne des valeurs différentes avec mon <select>.

explication :
- Si je sélectionne "2" => affichage de 2 input, tout est ok
si tout de suite après je sélectionne "3", affichage d'un troisième input avec message d'erreur "Undefined offset".

- Maintenant si je sélectionne "3" puis je sélectionne "2" pas de message d'erreur "Undefined offset".

Je ne comprends pas le mécanisme?

Posté : 08 sept. 2008, 11:24
par guilt92
Bonjour,

Le problème est toujours le même en fait :

Tu as un champ "Nombre de chambres" qui va provoquer la validation de ton formulaire, indépendamment du nombre de chambre déjà présente.

Ensuite en fonction de cela tu vas afficher un ou plusieurs input, avec des valeurs dedans si elles ont été rentrées.

Ton problème, c'est que tu ne teste l'existence que d'une valeur de $surfacechambreIs alors que derrière tu utilises $surfacechambreIs[$i].

Prenons le cas suivant :

Une personne choisit 2 chambres.
Le formulaire s'actualise et tu affiches deux champs en cherchant la valeur 1 (inconnue) et la valeur 2 (inconnue) de ton tableau. D'ou les erreurs. Après si tu valides à partir de ce cas en choisissant un nombre moins élevé de chambre ca marche, mais plus élevé ca ne marche pas car tu cherches a afficher la valeur $surfacechambreIs[$i] meme si elle n'existe pas.

La solution selon moi serait plutot de faire quelque chose du style :
//Affichage input surfacechambre en fonction du nombre de chambre sélectionné 
 if ($nombredechambreIs >= 1) 
 { 
    for($i=0; $i<$nombredechambreIs; $i++) 
    { 
     print "<li><img src='img/spacer.jpg' width='35' height='1' /> 
     <img src='img/surface-en-m2-1.jpg' /> 
     <img src='img/spacer.jpg' width='40' height='1' />"; 
     $value_surface = "";
	 if (isset($surfacechambreIs[$i])) $value_surface = $surfacechambreIs[$i];
     print"<input type='text' style='background: #A2A2A2;' name='surfacechambre[$i]' size='10'  
     maxlength='40' value='".$value_surface."' /> 
     </li>"; 
     } 
 }
Ce code générera peut etre des erreurs mais l idée est la suivante : on ne fait pas varier le nombre de champs en fonction du isset mais seulement la valeur. Si la valeur est définie on l affiche, sinon on affiche un champ vide.

J espere que cela t aidera.

conserver et réafficher la valeur de plusieurs input générer

Posté : 08 sept. 2008, 14:32
par Ines
Effectivement ta solution fonctionne trés bien et plus de message d'erreur.

J'ai transposé le test sur la variable $surfacechambreIs[$i] à mon développement et cela marche aussi et en fonction des explications que tu as donné je pense que c'est nomal!

cad
//Affichage input surfacechambre en fonction du nombre de chambre sélectionné
      if (isset($nombredechambreIs) && $nombredechambreIs>= 1)
      {
        
        for($i=0; $i<$nombredechambreIs; $i++)
        {
        print "<li><img src='img/spacer.jpg' width='35' height='1' />
        <img src='img/surface-en-m2-1.jpg' />
        <img src='img/spacer.jpg' width='40' height='1' />";
          if (!isset($surfacechambreIs[$i]))
          { 
          print "<input type='text' style='background: #A2A2A2;' name='surfacechambre[$i]'
          size='10' maxlength='40' value='' /> 
          </li>";
          }
          else
          {
          print "<input type='text' style='background: #A2A2A2;' name='surfacechambre[$i]' 
          size='10' maxlength='40' value='$surfacechambreIs[$i]' /> 
          </li>";
          }  
        }
      } 

Merci pour tes explications et donc pour ton aide.

[Résolu]

Posté : 08 sept. 2008, 14:35
par Truc
Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)