IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Génération d'une "table" HTML avec choix


Sujet :

Langage PHP

  1. #1
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Par défaut Génération d'une "table" HTML avec choix
    Bonjour,

    Je souhaite générer une table HTML avec, à chaque ligne, un dernier élément permettant de sélectionner la ligne.

    Pour la table simple j'utilise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    // ******************************************************
    // *							*
    // *		    Classe H_TableauValeurs		*
    // *							*
    // * INPUT : tableau de lignes				*
    // *	chaque ligne : tableau de valeurs		*
    // *	chaque valeur : chaîne ou bouton		*
    // *							*
    // * OUTPUT : la chaîne HTML				*
    // *							*
    // ******************************************************
    Class H_TableauValeurs
    {
    var $LaChaineHtml;	// le code HTML élaboré ici
     
    public function __construct() 
        	{
    	$this->LaChaineHtml = "";
    	}
     
    public function Affichable(array $LesLignes)
    	{
    	$this->DeclareTableau();
    	foreach($LesLignes as $LigneCourante)
    		{
    		$this->ConstruitLigne($LigneCourante);
    		}
    	$this->FermeTableau();
    	return($this->LaChaineHtml);
    	}
     
    public function DeclareTableau()
    	{
    	$this->LaChaineHtml = "<table border=\'1\'>";
    	}
     
    public function FermeTableau()
    	{
    	$this->LaChaineHtml = $this->LaChaineHtml."</table>";
    	}
     
    function ConstruitLigne(array $UneLigne)	// Ligne = tableau de caractères
    	{
    	$LCH = $this->LaChaineHtml;
    	$LCH = $LCH."<tr>";
    	foreach($UneLigne as $ValeurCourante)		
    		{
    		$LCH = $LCH."<td>".$ValeurCourante."</td>";
    		}
    	$LCH = $LCH."</tr>";
    	$this->LaChaineHtml = $LCH;
    	}
    } 	// fin Class
    ceci donne effectivement le résultat :

    Nom : ChoixTrame.JPG
Affichages : 73
Taille : 45,1 Ko

    Je bloque sur la suite : comment rendre une chaîne cliquable (dans mon exemple, la chaîne "CHOISIR") de façon à ce qu'elle renvoie une valeur et aiguille vers un script ?
    (comme le ferait un SELECT par exemple)

    J'hésite entre 2 approches :

    -> en faire un BUTTON :
    - avantage : c'est "propre" au sens où c'est homogène avec ce que je fais par ailleurs
    - inconvénient : je ne sais pas à quel FORM rattacher ça ?

    -> en faire une HREF :
    - avantage : ça semble plutôt facile à générer
    - inconvénient : il va falloir passer un paramètre dans l'URL

    qu'est-ce que vous me conseilleriez s'il vous plait ?

    Jean-Marc.
    -----
    Edit : le commentaire ligne 44 est mauvais, le correct c'est : "Ligne = tableau de Strings"

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 551
    Par défaut
    Bonjour,

    Le duel entre bouton (<button>) vs lien (<a>) :
    Critère Lien Bouton
    Usage idéal Navigation (consulter une fiche, voir un détail). Action (supprimer, modifier, valider un choix).
    Facilité Très simple : un lien avec un paramètre ?id=.... Demande un <form> autour du tableau.
    Méthode HTTP Toujours en GET (visible dans l'URL). Peut être en POST (invisible dans l'URL, plus sûr).

    Si ton action "CHOISIR" sert simplement à afficher les détails d'un élément sur une autre page, le HREF est le plus simple.
    Si ce choix déclenche une action (comme ajouter à un panier ou valider une étape), le BUTTON dans un formulaire est plus propre techniquement.

    1. Solution simple : Le lien (<a>)
    C'est la méthode la plus rapide à intégrer dans ta classe. Tu dois simplement modifier ta fonction ConstruitLigne pour qu'elle sache quel ID envoyer.

    Modification de ta classe : Supposons que le premier élément de ton tableau $UneLigne soit l'identifiant (ID).

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php function ConstruitLigne(array $UneLigne) {
        // On récupère l'ID (souvent le premier élément)
        $id = $UneLigne[0]; 
     
        $LCH = $this->LaChaineHtml;
        $LCH .= "<tr>";
     
        foreach($UneLigne as $ValeurCourante) {
            $LCH .= "<td>" . htmlspecialchars($ValeurCourante) . "</td>";
        }
     
        // On ajoute la colonne "Action" avec l'ID en paramètre URL
        $LCH .= "<td><a href='ton_script.php?id=$id'>CHOISIR</a></td>";
     
        $LCH .= "</tr>";
        $this->LaChaineHtml = $LCH;
    }

    2. Solution robuste : Le bouton (<button>)
    Pour éviter le souci du "à quel formulaire le rattacher", la technique standard est d'envelopper tout le tableau dans un seul formulaire.

    Le concept : Ton bouton a un name="id_selectionne" et une value égale à l'ID de la ligne.

    Quand on clique sur n'importe quel bouton du tableau, le formulaire est envoyé.

    Modification du code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    public function DeclareTableau() {
        // On ouvre le formulaire AVANT le tableau
        $this->LaChaineHtml = "<form method='POST' action='ton_script.php'>";
        $this->LaChaineHtml .= "<table border='1'>";
    }
     
    public function FermeTableau() {
        $this->LaChaineHtml .= "</table>";
        $this->LaChaineHtml .= "</form>"; // On ferme le formulaire après
    }
     
    function ConstruitLigne(array $UneLigne) {
        $id = $UneLigne[0];
        $LCH = $this->LaChaineHtml;
        $LCH .= "<tr>";
     
        foreach($UneLigne as $ValeurCourante) {
            $LCH .= "<td>" .htmlspecialchars($ValeurCourante) . "</td>";
        }
     
        // Un bouton de type submit avec l'ID en valeur
        $LCH .= "<td><button type='submit' name='id_selectionne' value='$id'>CHOISIR</button></td>";
     
        $LCH .= "</tr>";
        $this->LaChaineHtml = $LCH;
    }

    Quelques petites corrections sur ton code :
    • L'échappement des quotes : Dans ta fonction DeclareTableau, tu as écrit border=\'1\'. PHP n'a pas besoin d'échapper les guillemets simples si tu utilises des doubles (et inversement). Écris simplement : "<table border='1'>" ou '<table border="1">'.
    • La sécurité : Pense à utiliser htmlspecialchars($ValeurCourante) lors de l'affichage dans les <td>. Si une de tes valeurs contient un caractère spécial (comme < ou >), cela pourrait casser ton tableau ou créer une faille de sécurité.
    • L'opérateur de concaténation : Tu peux utiliser .= pour raccourcir ton code.

      Avant : $LCH = $LCH . "<tr>";
      Après : $LCH .= "<tr>";


    En résumé : Si tu veux faire au plus simple pour tester, pars sur le HREF. Si tu veux construire une application un peu plus "pro", le Bouton dans un formulaire global est la voie royale.

    Lequel de ces deux modes de fonctionnement te semble le plus adapté à ton script cible ?

  3. #3
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 25
    Par défaut
    D'abord un grand merci pour ta réponse très précise et détaillée !

    Je vais à coup sûr commencer par essayer la méthode "button" car elle me semble plus adaptable à des variétés de cas. Je n'avais pas pensé à un FORM qui emballe l'ensemble.

    Et puis je vais étudier tes remarques sur le code actuel, qui me semblent devoir me faire gagner pas mal de temps et éviter autant d'ennuis

    bonne soirée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/11/2017, 18h34
  2. Réponses: 5
    Dernier message: 29/05/2017, 14h31
  3. Comparaison dans une même table des montants avec %
    Par vpavince dans le forum Langage SQL
    Réponses: 12
    Dernier message: 14/01/2015, 10h50
  4. Donner une valeur de bouton HTML avec Javascript
    Par xlink dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/12/2014, 10h03
  5. Changer les données d'une pivot table en VBA avec SQL
    Par Reskibil dans le forum Général VBA
    Réponses: 0
    Dernier message: 03/04/2008, 17h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo