Page 1 sur 2

Résultats après un switch/case dans une balise DIV

Posté : 10 sept. 2007, 15:12
par TheBuzz
Bonjour,

Je souhaite, après une requête dans ma base de donnée, et avec un switch / case, obtenir les résultats de case ( en l'occurrence 2 valeur s ) et les afficher dans une balise DIV.

C'est-à-dire :

Ma page contient un formulaire, contenant plusieurs INPUT (TEXT, RADIO,etc...). Ces INPUT sont générés par requête à la base de données MYSQL et affichés selon un switch / case.

Je recherche le moyen d'afficher tous les INPUT, sauf ceux contenant la valeur NAME="maman". Ceux-ci, contenant cette valeur NAME="maman", s'afficheront uniquement si l'on clique sur un lien qui activera la balise DIV.

Voici le code de case 1 actuel, qui affiche tous les INPUT de type TEXT en construction TR et TD que je souhaite remplacer :
<?php
case 1:
$maxlength = ( $op_data['length'] > 0 ? ' maxlength="' . $op_data['length'] . '"' : '' );
$tmp_html = '<input type="text" name="id[' . $oID . '][t]"' . $maxlength . ' />';
?>
<tr>
<td class="main"><?php echo $op_data['name'] . ':' . ($op_data['instructions'] != '' ? '<br /><span class="smallText">' . $op_data['instructions'] . '</span>' : '' ); ?></td>
<td class="main"><?php echo $tmp_html; ?></td>
</tr>
<?php
break;
?>
Merci de votre réponse

Posté : 10 sept. 2007, 16:31
par d0m
Tu peux tester pour chaque INPUT la valeur de l'attribut que tu vas mettre dans NAME.
Si c'est maman, tu écris l'INPUT entre les balises :
<DIV STYLE="display:none;"><INPUT NAME="maman" .... /></div>
ce qui aura pour effet de " cacher ton INPUT ".

et ensuite, en cliquant sur ton lien changer par du javascript la valeur de display ou par un rechargement de la page.

Posté : 10 sept. 2007, 17:15
par TheBuzz
Merci d0m,

Toutefois, je connais la valeur des attributs.

Ce que je recherche est en fait, non pas l'affichage/masquage de chaque input, mais de regrouper tous les input dans un seul div de manière à afficher/masquer cette "boîte" contenant ces input.

Je ne sais pas si je me suis bien exprimé !?

Merci d'avance

Posté : 10 sept. 2007, 22:47
par Ryle
Pas sur d'avoir bien compris, mais si tu veux regrouper tes champs, pourquoi ne pas faire deux variable temporaires $tmp_html_1 et $tmp_html_2, et en fonction du nom du champ, tu complètes l'une ou l'autre. Ainsi lors de l'affichage les champs que tu souhaites seront regroupés :)

Posté : 11 sept. 2007, 13:11
par TheBuzz
Hello Ryle,

En fait, j'ai, après un switch /case qui recherche dans ma BDD si j'ai des INPUT de type CHECKBOX, TEXT,etc..., un affichage par ligne des différents INPUT avec leurs valeurs.

Ce que je recherche, c'est la possibilité de dire que : Si j'ai un/des INPUT de Type TEXT, regroupe-les dans un DIV caché, puis, par appel par un lien afficher/masquer, affiche-les.

Pas simple à expliquer !

Voici mon code modifié, avec toujours l'affichage de tous les INPUT de type TEXT dans des DIV séparés :
<?php case 1:
			$valeurtest = "1000000";
          	echo '<tr><td><div class="clicTitre"><a onclick="afficheId(' . $oID . $valeurtest . ');">Option pour demande d\'offre</a></div><div class="contenant" id="' . $oID . $valeurtest . '"><div class="clicCacher"><a onclick="cacheId(' . $oID . $valeurtest . ');">Fermer</a></div>';
            echo "<script type='text/javascript'>";
            echo " cacheId($oID$valeurtest);";
            echo "</script>";
            $maxlength = ( $op_data['length'] > 0 ? ' maxlength="' . $op_data['length'] . '"' : '' );
            $tmp_html = '<input type="text" name="id[' . $oID . '][t]"' . $maxlength . ' onFocus="javascript:this.value=\'\'"/>'; ?>
            <div class="main2"><?php echo $op_data['name'] . ':' . ($op_data['instructions'] != '' ? '<br /><span class="smallText">' . $op_data['instructions'] . '</span>' : '' ); ?></div>
			<div class="main3" align="left"><?php echo $tmp_html; ?></div>
			<?php echo "</div></td></tr>";
            break;
Je sais que suite à mon case, tous les résultats seront affichés, mais comment faire pour mettre le tout dans une seule "boîte ??

Merci des éclaircissements et A+[/php]

Posté : 11 sept. 2007, 13:20
par d0m
Ryle t'as donné la solution.

Au lieu d'afficher tout de suite dans ton switch, ton switch peut te servir à trier dans 2 variables différentes (tableaux par exemple) les INPUT que tu veux afficher et les INPUT que tu veux cacher.

Après ce tri seulement tu affiches les INPUT de ta première variable, ceux de ta deuxième étant mis dans un div caché.

Posté : 11 sept. 2007, 13:29
par TheBuzz
Merci d0m de cette réponse rapide,

Cependant, je ne suis pas un PRO en php, mais j'ai à peu près compris vos réponses.

Toutefois, à quel niveau et quel pourrait être, même minime de votre part, le bout de code que je dois mettre. Je pense que je ne suis pas loin du résultat, mais je pêche.

Merci de vos bons conseils

A+

Posté : 11 sept. 2007, 13:37
par d0m
disons que tu mets tes INPUT dans 2 tableaux:
- tableau $a_afficher
- tableau $a_cacher
//le tri
foreach($inputs as $input){
  switch($condition){
    case 1 : $a_afficher[] = $input;break;
    case 0 : $a_cacher[]   = $input;break;
  }
}

//l'affichage
foreach($a_afficher as $input)
  echo $input;
echo '<div CLASS="divCache">';
foreach($a_cacher as $input)
  echo $input;

Posté : 11 sept. 2007, 14:08
par TheBuzz
Si je comprends bien, je dois mettre dans mon case 1, les deux nouveaux foreach ?

Ou, alors, je dois l'intégrer dans le foreach /switch que j'ai déjà ci-dessous ?

Début de foreach /switch
foreach ($options as $oID => $op_data) {
							switch ($op_data['type']) {
Puis mon code :
case 1:
            $valeurtest = "1000000";
              echo '<tr><td><div class="clicTitre"><a onclick="afficheId(' . $oID . $valeurtest . ');">Option pour demande d\'offre</a></div><div class="contenant" id="' . $oID . $valeurtest . '"><div class="clicCacher"><a onclick="cacheId(' . $oID . $valeurtest . ');">Fermer</a></div>';
            echo "<script type='text/javascript'>";
            echo " cacheId($oID$valeurtest);";
            echo "</script>";
            $maxlength = ( $op_data['length'] > 0 ? ' maxlength="' . $op_data['length'] . '"' : '' );
            $tmp_html = '<input type="text" name="id[' . $oID . '][t]"' . $maxlength . ' onFocus="javascript:this.value=\'\'"/>'; ?>
            <div class="main2"><?php echo $op_data['name'] . ':' . ($op_data['instructions'] != '' ? '<br /><span class="smallText">' . $op_data['instructions'] . '</span>' : '' ); ?></div>
            <div class="main3" align="left"><?php echo $tmp_html; ?></div>
            <?php echo "</div></td></tr>";
            break;
puis à la fin, à la suite
case 2 // ... INPUT Checkbox
case 3 // ... INPUT Textarea
case 4 // ... INPUT Select
}
}
Merci encore

A+

Posté : 11 sept. 2007, 14:18
par d0m
Si je comprends bien, je dois mettre dans mon case 1, les deux nouveaux foreach ?
non, il faut bien différencier traitement des données (tri) et affichage des données.
Dans le switch, tu ne fais que trier les input suivant 2 variables (partir traitement des données).
Ensuite tu utilises les 2 foreach pour afficher tes 2 tableaux d'inputs. (partie affichage des données).

Posté : 11 sept. 2007, 14:37
par TheBuzz
Donc, dans mon cas :
//le tri
foreach($options as $oID => $op_data){
  switch($op_data['type']){
    case 1 : $a_afficher[] = case 2, case 3, case 4;break;
    case 0 : $a_cacher[]   = case 1;break;
  }
}

//l'affichage
foreach($a_afficher as case 2, case 3, case 4)
  echo case 2, case 3, case 4;
echo '<div CLASS="divCache">';
foreach($a_cacher as case 1)
  echo case 1;
Est-ce comme ça, dans l'idée ?

Posté : 11 sept. 2007, 14:45
par Yosh
Est-ce comme ça, dans l'idée ?
Pas du tout, la réponse à ta question t'a été donné correctement par d0m

Test son code et tu verra que ce que tu veux faire se fait comme il te l'a indiqué...ensuite s'il y a des choses que tu ne comprend pas revient poser tes questions.

Posté : 11 sept. 2007, 15:04
par TheBuzz
Merci à vous tous,

Mais je pense que je ne vais pas m'en sortir. Je ne suis qu'un p'tit sirop en code et suis désolé de vous avoir importuné avec mes questions, car j'arrive à peu près comprendre mais ne sait pas l'appliquer !

Merci encore

Posté : 11 sept. 2007, 15:10
par d0m
tu as 4 cas : tes 4 types d'inputs.
Dans le cas 1 (text) tu veux les cacher, dans les cas 2, 3 et 4 tu veux les afficher donc
dans le 1er cas tu places ton code html d'input dans la tableau à cacher, dans les autres cas dans le tableau à afficher :
foreach(....){
  $code_html = '<INPUT ............>';
  switch($op_data['type']){
      case 1 :  $a_cacher[] = $code_html;break;
      case 2 : case 3 : case 4 : $a_afficher[] = $codehtml;break;
  } 
}

Posté : 11 sept. 2007, 15:10
par Yosh
Merci à vous tous,

Mais je pense que je ne vais pas m'en sortir. Je ne suis qu'un p'tit sirop en code et suis désolé de vous avoir importuné avec mes questions, car j'arrive à peu près comprendre mais ne sait pas l'appliquer !

Merci encore
Mais tu n'importune personne voyons...

As-tu essayé le code de d0m?