Page 1 sur 1

Remplir un tableau à double entrée

Posté : 20 juin 2014, 09:49
par Leor
Bonjour à tous !

(A la vue des catégories du forum et de mon problème, je ne savais pas vraiment où poster, ça concerne le PHP mais pas que)
Je viens vers vous aujourd'hui car j'ai un problème dont l'issue m'échappe.

J'ai un tableau à double entrée : il possède un entête et un nombre connu de lignes dont la partie gauche est comme un entête.
Toutes les données sont récupérées de ma base de données MySQL via PDO.

Petit schéma du tableau que j'arrive à réaliser et explications du problème rencontré :
Image

L'entête est construit via cette boucle :

Code : Tout sélectionner

<table border="1" width="590">     <thead>         <tr>         <th align="center"></th>         foreach($lesEquipements as $unEquipement)         {               echo "<th align=\"center\">$unEquipement->nom</th>";         }         echo "</tr>";     </thead>  
Et la partie de gauche et centrale est construite de cette manière là actuellement :

Code : Tout sélectionner

<tbody>     foreach($lesTraits as $unTrait)     {         echo "<tr>         <td>{$unTrait->nom}</td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[0]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[1]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[2]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[3]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[4]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[5]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>         <td><select id=\"{$unTrait->id}:{$lesEquipements[6]->id}\" onchange=\"majEtatTrait(this);\"><option value=\"-1\"></option><option value=\"1\">Connu</option><option value=\"2\">En cours</option><option value=\"3\">Recherchable</option><option value=\"4\">Inconnu</option></select></td>";     } </tbody> </table>  
Ce que doit faire ce code en entier c'est construire un tableau à double entrée et permettre la modification d'une valeur en sélectionnant l'option dans la liste déroulante. A ce moment là je fais un appel ajax qui prend en paramètres les "coordonnées" de la case sélectionnée : quelle ligne et quelle colonne a t'on sélectionné.
La technique proposée fonctionne, j'arrive bien à récupérer les valeurs ligne-colonne de la case sélectionnée.

Problèmes rencontrés : Impossible lors de l'affichage du tableau de présélectionner la valeur précédemment enregistrée pour une case, donc de récupérer l'état d'une case et de l'afficher.
Impossible également de construire ce genre de tableau sans connaître à l'avance le nombre de colonnes qu'il y aura : le nombre de "TD" est en dur dans le code.

Ce que j'aimerais c'est réussir à construire ce genre de tableau (entête, entête de gauche et données) au sein d'une double boucle (une qui parcourt mes données d'entête, une qui parcourt les données d'entête de gauche et pour chacune, récupérer les données et les afficher)

Existe il une méthode ou une autre solution pour arriver au même résultat avec les problèmes actuels résolus et propre au niveau du code ?
Je ne sais pas si j'ai été clair, c'est pas un problème facile à expliquer et n'hésitez pas à poser des questions si vous avez besoin d'avantages d'informations.

Je vous remercie par avance de l'intérêt que vous pourrez porter à mon problème.
Leor

Re: Remplir un tableau à double entrée

Posté : 20 juin 2014, 11:07
par sirakawa
Il est possible de construire un tableau plus dynamique:
La ligne d'entêtes est générée par un foreach style:
$nb_col=0;
$entetes = "<tr>";
foreach($donnees as $donnee)
{
$entetes .= "<th>$donnee</th>";
$nb_col ++;
}
$entets .= "</tr>";
Et tu crées chaque ligne au fur à mesure en mettant comme id ligne_colonne (1_1, 1_2...)

Re: Remplir un tableau à double entrée

Posté : 20 juin 2014, 11:42
par Leor
Salut,

Je construit actuellement mon entête de manière similaire et la méthode proposée ne répondra pas à mon besoin je pense.
J'ai besoin de l'information contenue dans le premier foreach pour construire les lignes de données. J'aimerais pouvoir faire quelque chose dans ce style là.

Pseudo code :

Code : Tout sélectionner

foreach($donneesEntete as $uneDonneeEntete) {     foreach($donneesGauche as $uneDonneeGauche)     {         $out .= "<td><select id="$uneDonneeEntete->id:$uneDonneeGauche->id" onchange="majEtatTrait(this);"><option value="1" selected>$gestionnaireRecherches->getById($uneDonneeEntete->id, $uneDonneeGauche->id)[0]->etat</option></select></td>";     } }  
Mais la création d'un tableau en HTML ne me permet pas cette liberté puisqu'il faut d'abord définir les données d'entêtes puis les données relatives aux lignes. Ce que j'aimerais c'est pouvoir dessiner la structure du tableau (entête + première colonne de gauche) puis de boucler à l'intérieur, sur mes données.

Re: Remplir un tableau à double entrée

Posté : 25 juin 2014, 19:40
par Invité
Bonjour, j'ai toujours besoin d'un petit coup de main !

Re: Remplir un tableau à double entrée

Posté : 29 juin 2014, 22:51
par Wolan
Bonsoir,

Quelque chose comme ça?

Après pour que les listes déroulantes soient pré initialisées il faut récupérer la valeur en base et rajouter l'attribut selected dans le select correspondant.
<table border="1" width="590">
    <thead>
        <tr>
            <th align="center"></th>
            <?php
            foreach ($lesEquipements as $unEquipement) 
            {
                echo "<th align=\"center\">$unEquipement->nom</th>";
            }
            echo "</tr>";
            ?>
    </thead>

    <tbody>
        <?php
        foreach ($lesTraits as $unTrait) 
        {
            echo "<tr>";
            echo"<td>{$unTrait->nom}</td>";
            foreach ($lesEquipements as $unEquipement) 
            {
                echo "<td>";
		echo "<select id=\"{$unTrait->id}:{$unEquipement->id}\" onchange=\"majEtatTrait(this);\">";
		echo"<option value=\"-1\"></option>";
		echo "<option value=\"1\">Connu</option>";
		echo "<option value=\"2\">En cours</option>";
		echo "<option value=\"3\">Recherchable</option>";
		echo "<option value=\"4\">Inconnu</option>";
		echo "</select>";
		echo "</td>";
            }
            echo "</tr>";
        }
        ?>
    </tbody>
</table>

Re: Remplir un tableau à double entrée

Posté : 01 juil. 2014, 19:12
par Leor
Bonjour,

Merci beaucoup, c'était effectivement ça qu'il me manquait !