[RESOLU] Remplir un tableau à double entrée

Petit nouveau ! | 3 Messages

20 juin 2014, 09:49

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

Mammouth du PHP | 2278 Messages

20 juin 2014, 11:07

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...)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 3 Messages

20 juin 2014, 11:42

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.

Invité
Invité n'ayant pas de compte PHPfrance

25 juin 2014, 19:40

Bonjour, j'ai toujours besoin d'un petit coup de main !

Eléphanteau du PHP | 25 Messages

29 juin 2014, 22:51

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>

Petit nouveau ! | 3 Messages

01 juil. 2014, 19:12

Bonjour,

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