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.