Accueil : section « Livres » mettant en avant les books existants #100

Closed
opened 2026-05-16 13:30:32 +00:00 by cedricAbonnel · 0 comments
Owner

Contexte

La page d'accueil (case 'list': + templates/post_list.php) présente plusieurs sections : héro + derniers articles, populaires, récemment mis à jour, redécouvertes. Aucune section ne met en avant les books. L'objectif est d'ajouter une section « Livres » visible sur la homepage (uniquement quand $isHomepage === true).

Dépend de #98 (page /books) pour la couverture et le design des cards.


Existant utile

La homepage est construite dans case 'list': (≈ ligne 3609 de index.php).
Le bloc if ($isHomepage) charge déjà $latestPosts, $popularPosts, $recentlyUpdated, $redecouvertes. C'est là qu'il faut ajouter $homeBooks.

Le template templates/post_list.php contient if ($isHomepage ?? false): — c'est dans ce bloc qu'on inserera la section livres.


Données à préparer (index.php, dans if ($isHomepage))

// Books à mettre en avant sur l'accueil
$homeBooks = [];
foreach ($books->getAll() as $book) {
    $published = [];
    foreach ($book['articles'] ?? [] as $aSlug) {
        $a = $articles->getBySlug($aSlug);
        if ($a && $a['published'] && strtotime($a['published_at'] ?? '') <= time()) {
            $published[] = $a;
        }
    }
    if (empty($published)) continue;
    $homeBooks[] = [
        'book'  => $book,
        'count' => count($published),
        'first' => $published[0],
    ];
    if (count($homeBooks) >= 6) break; // cap à 6 sur l'accueil
}

Template (templates/post_list.php, dans le bloc if ($isHomepage))

Insérer la section juste avant la grille de pagination (ou après la section « Redécouvertes »), uniquement si !empty($homeBooks) :

<?php if (!empty($homeBooks)): ?>
<section class="home-section">
    <h2 class="home-section-title">
        Livres
        <a href="/books" class="home-section-more">Voir tous →</a>
    </h2>
    <div class="book-grid">
        <?php foreach ($homeBooks as $hb):
            $book   = $hb['book'];
            $first  = $hb['first'];
            $count  = $hb['count'];
            $cover  = $first['cover'] ?? '';
            $cat    = trim($first['category'] ?? '');
            $coverStyle = $cover !== ''
                ? "background-image:url('/file?uuid=" . rawurlencode($first['uuid'])
                  . "&name=" . rawurlencode($cover) . "')"
                : 'background:' . coverGradient($cat !== '' ? $cat : $first['uuid'], $allCats ?? []);
        ?>
        <a href="/book/<?= rawurlencode($book['slug']) ?>" class="book-home-card">
            <div class="book-home-card-cover" style="<?= $coverStyle ?>"></div>
            <div class="book-home-card-body">
                <div class="book-home-card-title"><?= htmlspecialchars($book['title']) ?></div>
                <?php if (!empty($book['description'])): ?>
                <div class="book-home-card-desc"><?= htmlspecialchars(mb_strimwidth($book['description'], 0, 80, '…')) ?></div>
                <?php endif; ?>
                <div class="book-home-card-meta"><?= $count ?> page<?= $count > 1 ? 's' : '' ?></div>
            </div>
        </a>
        <?php endforeach; ?>
    </div>
</section>
<?php endif; ?>

CSS à ajouter (public/assets/css/style.css)

/* ─── Section books accueil ─────────────────────────────────────── */
.book-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 1rem;
}

.book-home-card {
    display: flex;
    flex-direction: column;
    border-radius: 8px;
    overflow: hidden;
    text-decoration: none;
    color: inherit;
    background: var(--card-bg);
    box-shadow: 0 1px 3px rgba(0,0,0,.1);
    transition: transform .15s, box-shadow .15s;
}
.book-home-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(0,0,0,.15);
}

.book-home-card-cover {
    height: 120px;
    background-size: cover;
    background-position: center;
}

.book-home-card-body {
    padding: .75rem;
    display: flex;
    flex-direction: column;
    gap: .25rem;
}

.book-home-card-title {
    font-weight: 600;
    font-size: .95rem;
    line-height: 1.3;
}

.book-home-card-desc {
    font-size: .8rem;
    color: var(--text-muted);
    line-height: 1.4;
}

.book-home-card-meta {
    font-size: .75rem;
    color: var(--text-muted);
    margin-top: auto;
}

/* Lien "Voir tous" dans le titre de section */
.home-section-more {
    font-size: .8rem;
    font-weight: 400;
    margin-left: .75rem;
    color: var(--accent);
    text-decoration: none;
}
.home-section-more:hover { text-decoration: underline; }

Placement dans la page d'accueil

La section livres se place après la section « Redécouvertes » et avant la grille de pagination des articles, pour ne pas interrompre le flux éditorial principal.

Si le site ne contient aucun book avec des pages publiées, la section est entièrement absente (pas de titre vide).


Fichiers à modifier

Fichier Action
public/index.php Ajouter $homeBooks dans le bloc if ($isHomepage)
templates/post_list.php Insérer la section <?php if (!empty($homeBooks)): ?>
public/assets/css/style.css Ajouter les classes .book-grid, .book-home-card*, .home-section-more

Critères d'acceptation

  • Section « Livres » visible sur la homepage uniquement si ≥ 1 book avec ≥ 1 page publiée
  • Section absente sur les pages filtrées par catégorie ou paginées
  • Maximum 6 books affichés, lien « Voir tous → /books »
  • Cover : image du premier article sinon gradient de catégorie
  • Titre, description (tronquée), nombre de pages affichés
  • Cards cliquables → /book/{slug}
  • Responsive (grille auto-fill minmax)
  • Section positionnée après « Redécouvertes »
## Contexte La page d'accueil (`case 'list':` + `templates/post_list.php`) présente plusieurs sections : héro + derniers articles, populaires, récemment mis à jour, redécouvertes. Aucune section ne met en avant les **books**. L'objectif est d'ajouter une section « Livres » visible sur la homepage (uniquement quand `$isHomepage === true`). Dépend de #98 (page `/books`) pour la couverture et le design des cards. --- ## Existant utile La homepage est construite dans `case 'list':` (≈ ligne 3609 de `index.php`). Le bloc `if ($isHomepage)` charge déjà `$latestPosts`, `$popularPosts`, `$recentlyUpdated`, `$redecouvertes`. C'est là qu'il faut ajouter `$homeBooks`. Le template `templates/post_list.php` contient `if ($isHomepage ?? false):` — c'est dans ce bloc qu'on inserera la section livres. --- ## Données à préparer (`index.php`, dans `if ($isHomepage)`) ```php // Books à mettre en avant sur l'accueil $homeBooks = []; foreach ($books->getAll() as $book) { $published = []; foreach ($book['articles'] ?? [] as $aSlug) { $a = $articles->getBySlug($aSlug); if ($a && $a['published'] && strtotime($a['published_at'] ?? '') <= time()) { $published[] = $a; } } if (empty($published)) continue; $homeBooks[] = [ 'book' => $book, 'count' => count($published), 'first' => $published[0], ]; if (count($homeBooks) >= 6) break; // cap à 6 sur l'accueil } ``` --- ## Template (`templates/post_list.php`, dans le bloc `if ($isHomepage)`) Insérer la section juste **avant** la grille de pagination (ou après la section « Redécouvertes »), uniquement si `!empty($homeBooks)` : ```html <?php if (!empty($homeBooks)): ?> <section class="home-section"> <h2 class="home-section-title"> Livres <a href="/books" class="home-section-more">Voir tous →</a> </h2> <div class="book-grid"> <?php foreach ($homeBooks as $hb): $book = $hb['book']; $first = $hb['first']; $count = $hb['count']; $cover = $first['cover'] ?? ''; $cat = trim($first['category'] ?? ''); $coverStyle = $cover !== '' ? "background-image:url('/file?uuid=" . rawurlencode($first['uuid']) . "&name=" . rawurlencode($cover) . "')" : 'background:' . coverGradient($cat !== '' ? $cat : $first['uuid'], $allCats ?? []); ?> <a href="/book/<?= rawurlencode($book['slug']) ?>" class="book-home-card"> <div class="book-home-card-cover" style="<?= $coverStyle ?>"></div> <div class="book-home-card-body"> <div class="book-home-card-title"><?= htmlspecialchars($book['title']) ?></div> <?php if (!empty($book['description'])): ?> <div class="book-home-card-desc"><?= htmlspecialchars(mb_strimwidth($book['description'], 0, 80, '…')) ?></div> <?php endif; ?> <div class="book-home-card-meta"><?= $count ?> page<?= $count > 1 ? 's' : '' ?></div> </div> </a> <?php endforeach; ?> </div> </section> <?php endif; ?> ``` --- ## CSS à ajouter (`public/assets/css/style.css`) ```css /* ─── Section books accueil ─────────────────────────────────────── */ .book-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1rem; } .book-home-card { display: flex; flex-direction: column; border-radius: 8px; overflow: hidden; text-decoration: none; color: inherit; background: var(--card-bg); box-shadow: 0 1px 3px rgba(0,0,0,.1); transition: transform .15s, box-shadow .15s; } .book-home-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,.15); } .book-home-card-cover { height: 120px; background-size: cover; background-position: center; } .book-home-card-body { padding: .75rem; display: flex; flex-direction: column; gap: .25rem; } .book-home-card-title { font-weight: 600; font-size: .95rem; line-height: 1.3; } .book-home-card-desc { font-size: .8rem; color: var(--text-muted); line-height: 1.4; } .book-home-card-meta { font-size: .75rem; color: var(--text-muted); margin-top: auto; } /* Lien "Voir tous" dans le titre de section */ .home-section-more { font-size: .8rem; font-weight: 400; margin-left: .75rem; color: var(--accent); text-decoration: none; } .home-section-more:hover { text-decoration: underline; } ``` --- ## Placement dans la page d'accueil La section livres se place **après** la section « Redécouvertes » et **avant** la grille de pagination des articles, pour ne pas interrompre le flux éditorial principal. Si le site ne contient aucun book avec des pages publiées, la section est entièrement absente (pas de titre vide). --- ## Fichiers à modifier | Fichier | Action | |---------|--------| | `public/index.php` | Ajouter `$homeBooks` dans le bloc `if ($isHomepage)` | | `templates/post_list.php` | Insérer la section `<?php if (!empty($homeBooks)): ?>` | | `public/assets/css/style.css` | Ajouter les classes `.book-grid`, `.book-home-card*`, `.home-section-more` | --- ## Critères d'acceptation - [ ] Section « Livres » visible sur la homepage uniquement si ≥ 1 book avec ≥ 1 page publiée - [ ] Section absente sur les pages filtrées par catégorie ou paginées - [ ] Maximum 6 books affichés, lien « Voir tous → /books » - [ ] Cover : image du premier article sinon gradient de catégorie - [ ] Titre, description (tronquée), nombre de pages affichés - [ ] Cards cliquables → `/book/{slug}` - [ ] Responsive (grille `auto-fill minmax`) - [ ] Section positionnée après « Redécouvertes »
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#100