Tableau trié avec Twig
Comment afficher les données de la table
tbl_player
dans un tableau HTML avec la possibilité de trier les colonnes
Notions théoriques
L'affichage de données sous forme de tableau est une tâche courante dans le développement web.
Twig, le moteur de template utilisé par Symfony, offre des fonctionnalités puissantes pour générer dynamiquement des tableaux HTML.
Pour implémenter le tri des colonnes, nous allons utiliser ces étapes :
- Le contrôleur passe les données et les informations de tri au template.
- Le template génère des liens de tri dans les en-têtes de colonnes.
- Le contrôleur gère les paramètres de tri lors de la requête suivante.
Les points clés à retenir sont :
- Utilisation des boucles Twig pour générer les lignes du tableau.
- Génération dynamique des liens de tri dans les en-têtes de colonnes.
- Passage des paramètres de tri via l'URL.
- Utilisation de ces paramètres dans le contrôleur pour trier les données.
Exemple de mise en application
Voici un exemple de contrôleur et de template Twig pour afficher un tableau trié :
// src/Controller/PlayerController.php
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\PlayerRepository;
class PlayerController extends AbstractController
{
#[Route('/players', name: 'player_list')]
public function list(Request $request, PlayerRepository $playerRepository): Response
{
$sort = $request->query->get('sort', 'name');
$direction = $request->query->get('direction', 'asc');
$players = $playerRepository->findAllSorted($sort, $direction);
return $this->render('player/list.html.twig', [
'players' => $players,
'sort' => $sort,
'direction' => $direction,
]);
}
}
{# templates/player/list.html.twig #}
<table>
<thead>
<tr>
<th>
<a href="{{ path('player_list', {sort: 'name', direction: sort == 'name' and direction == 'asc' ? 'desc' : 'asc'}) }}">
Nom
</a>
</th>
<th>
<a href="{{ path('player_list', {sort: 'score', direction: sort == 'score' and direction == 'asc' ? 'desc' : 'asc'}) }}">
Score
</a>
</th>
</tr>
</thead>
<tbody>
{% for player in players %}
<tr>
<td>{{ player.name }}</td>
<td>{{ player.score }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Etudions ce code
Dans le contrôleur :
$sort = $request->query->get('sort', 'name');
$direction = $request->query->get('direction', 'asc');
Ces lignes récupèrent les paramètres de tri de l'URL, avec des valeurs par défaut.
$players = $playerRepository->findAllSorted($sort, $direction);
Cette ligne appelle une méthode personnalisée du repository pour récupérer les joueurs triés.
Dans le template :
<a href="{{ path('player_list', {sort: 'name', direction: sort == 'name' and direction == 'asc' ? 'desc' : 'asc'}) }}">
Ce code génère un lien pour trier par nom, en inversant la direction si le tri est déjà sur cette colonne.
{% for player in players %}
<tr>
<td>{{ player.name }}</td>
<td>{{ player.score }}</td>
</tr>
{% endfor %}
Cette boucle génère une ligne de tableau pour chaque joueur.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Votre défi pour aujourd'hui est d'implémenter la méthode de tri dans le PlayerRepository.
Créez une méthode findAllSorted
dans le PlayerRepository
qui accepte les paramètres de tri (champ et direction)
et retourne les joueurs triés en conséquence.
Assurez-vous de gérer les cas où le champ de tri n'existe pas.
Une solution
Vous devez être connecté pour voir le contenu.