Rendu personnalisé des cellules : badges & avatars
Afficher du HTML de confiance - badges de statut colorés, vignettes d'avatar - dans une cellule de grille avec Xcrud::html(), et un style conditionnel de cellule/ligne plus simple avec highlight().
Pourquoi column_callback() seul ne suffit pas
column_callback($field, $fn) permet de remplacer la valeur d'une cellule par ce que retourne votre callback. Par défaut, ce retour est traité comme du texte brut et échappé, exactement comme n'importe quelle autre valeur - une simple chaîne comme '<span>Active</span>' s'afficherait donc sous forme de chevrons littéraux, pas comme un élément stylé.
Enveloppez le retour du callback dans l'assistant statique Xcrud::html($html, $text = null) lorsque vous avez besoin que la cellule affiche réellement du balisage :
public static function html(string $html, ?string $text = null): array
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
$html | string | requis | Le balisage de confiance à afficher dans la cellule (rendu via innerHTML côté client) |
$text | ?string | null | Alternative en texte brut ; si omise, elle vaut par défaut $html débarrassé de ses balises |
$text est ce qui circule réellement comme valeur de la colonne partout où du HTML stylé n'aurait pas de sens - export CSV/XLSX/PDF, recherche/tri de la grille - puisque ceux-ci ne peuvent pas afficher un <span> coloré.
Exemple : un badge de statut
Un motif courant : coder par couleur une colonne status avec un column_callback() qui retourne une petite pastille via Xcrud::html() :
$xcrud->column_callback('status', function ($value, $row) {
$colors = [
'active' => '#16a34a',
'pending' => '#d97706',
'canceled' => '#dc2626',
];
$color = $colors[$value] ?? '#6b7280';
$html = '<span style="background:' . $color . ';color:#fff;'
. 'padding:2px 10px;border-radius:999px;font-size:12px;">'
. htmlspecialchars(ucfirst($value)) . '</span>';
return Xcrud::html($html, ucfirst($value));
});
La cellule de la grille affiche la pastille colorée ; un export CSV/XLSX/PDF de la même colonne affiche à la place le mot simple (« Active », « Pending », « Canceled »), et la recherche/le tri de colonne fonctionnent toujours sur ce même texte brut.
La même approche fonctionne pour un avatar - retournez une balise <img> (ou un <span> avec des initiales dans un cercle) enveloppée dans Xcrud::html(), avec un nom brut ou des initiales comme repli $text.
highlight() et highlight_row() - un style conditionnel plus simple
Quand vous avez juste besoin qu'une cellule ou une ligne change de couleur selon une comparaison - sans balisage personnalisé requis - highlight()/highlight_row() est plus simple qu'un callback complet :
public function highlight(string $field, string $operator, string $value, string $class): self
public function highlight_row(string $field, string $operator, string $value, string $class): self
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
$field | string | requis | Colonne sur laquelle évaluer la condition |
$operator | string | requis | Même vocabulaire que where() : symboles ou eq/neq/gt/gte/lt/lte/contains/starts/ends |
$value | string | requis | Valeur à comparer avec le champ |
$class | string | requis | Classe CSS appliquée quand la condition correspond |
$xcrud->highlight('amount', 'gt', '100000', 'xcrud-hl-warn');
$xcrud->highlight_row('status', 'eq', 'canceled', 'xcrud-hl-muted');
highlight() applique la classe uniquement à la cellule concernée ; highlight_row() l'applique à toute la ligne. Plusieurs règles peuvent correspondre à la même cellule/ligne - leurs classes s'accumulent au lieu de se remplacer.