Les champs
Les listes répétables
Tout ce qui se compte : des prestations, des membres d'équipe, des témoignages, une galerie. Vous définissez la structure d'une ligne, le client décide combien il y en a, ce qu'elles contiennent et dans quel ordre.
Déclaration
'items' => [
'type' => 'repeater',
'label' => 'Prestations',
'desc' => 'Six prestations au maximum.',
'max' => 6,
'label_add' => 'Ajouter une prestation',
'label_row' => 'Prestation',
'fields' => [
'title' => ['type' => 'text', 'label' => 'Intitulé'],
'text' => ['type' => 'textarea', 'label' => 'Description'],
'image' => ['type' => 'image', 'label' => 'Illustration'],
'cta' => ['type' => 'link', 'label' => 'En savoir plus'],
],
],
Les sous-champs se déclarent exactement comme des champs ordinaires, dans
une clé fields.
Les clés propres au répétable
| Clé | Défaut | Rôle |
|---|---|---|
fields |
obligatoire | Les sous-champs d'une ligne |
max |
0, sans limite | Nombre maximum de lignes |
min |
0 | En deçà, le bouton Supprimer est désactivé |
label_add |
Ajouter une ligne | Libellé du bouton d'ajout |
label_row |
Ligne | Libellé en tête de chaque ligne, suivi de son numéro |
Affichage
<?php $prestations = iron_rows('services.items'); ?>
<?php if ($prestations) : ?>
<ul class="services">
<?php foreach ($prestations as $ligne) : ?>
<li class="service">
<?= iron_row_image($ligne, 'image', '400x300') ?>
<h3><?= $ligne['title'] ?></h3>
<?php if (iron_row_has($ligne, 'text')) : ?>
<p><?= $ligne['text'] ?></p>
<?php endif; ?>
<?= iron_row_link($ligne, 'cta', ['class' => 'btn']) ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>Les fonctions de ligne
| Fonction | Rôle |
|---|---|
iron_rows($chemin) |
Les lignes d'une liste de page |
iron_option_rows($chemin) |
Les lignes d'une liste des réglages du site |
iron_row($ligne, $cle) |
Comme l'accès direct, mais avertit si la clé n'existe pas |
iron_row_has($ligne, $cle) |
Vrai si le sous-champ est rempli |
iron_row_image($ligne, $cle, $format, $attributs) |
Une balise image complète |
iron_row_image_url($ligne, $cle, $format) |
L'adresse seule |
iron_row_link($ligne, $cle, $attributs) |
Une balise de lien complète |
Ce que voit le client
Chaque ligne est un bloc numéroté, avec trois boutons : monter, descendre, supprimer. Un bouton d'ajout se trouve sous la liste, et se désactive une fois le maximum atteint.
Supprimer une ligne qui contient quelque chose demande une confirmation. Une ligne encore vide se supprime sans question : confirmer pour rien apprend à cliquer « oui » sans lire, et la confirmation ne protège alors plus rien le jour où elle compte.
Le réordonnancement se fait par boutons et non par glisser-déposer. Ce choix est délibéré : il fonctionne au clavier, sur tablette, et n'entre pas en conflit avec la fenêtre de la médiathèque qui s'ouvre par-dessus.
Les limites, et pourquoi
Ce n'est pas une limite technique infranchissable, c'est un arbitrage : la gestion des index imbriqués double la complexité du rendu, du JavaScript et de la sauvegarde, pour un besoin qui ne se présente pratiquement jamais sur un site vitrine. Si vous en avez besoin, deux listes séparées ou un groupe supplémentaire répondent presque toujours au problème.
Le contournement, sur ce site
Le sommaire que vous voyez à gauche a exactement ce besoin : des catégories,
contenant des chapitres. Il aurait fallu un répétable dans un répétable. Il
est écrit en PHP à la place — un plan de documentation doit correspondre à
des gabarits qui existent, sinon il produit des liens morts. Pour un cas où
le client doit réellement piloter deux niveaux, une liste plate avec un
sous-champ select qui distingue « titre de section » et
« entrée » fait le travail.
Deux détails de comportement
- Une ligne entièrement vide est conservée. La supprimer en douce ferait disparaître une ligne que le client vient d'ajouter, ce qui ressemble à un bug.
- L'ordre est celui du formulaire. Les lignes sont renumérotées à l'enregistrement d'après leur ordre d'affichage : supprimer la ligne 2 sur cinq ne laisse aucun trou.