FaceFlow Lists — Dynamic Content Listings
The List system in FaceFlow enables you to create dynamic, data-driven pages that query and display collections of content — blog archives, product catalogs, team directories, portfolios, and more. Lists combine a powerful query builder with flexible rendering options (card layout or custom Handlebars templates) and built-in AJAX pagination.
Listen — Entwicklerdokumentation
Listen sind die dynamische Inhaltsebene in FaceFlow.
Sie ermöglichen es technischen Anwendern zu definieren, wie Inhaltskollektionen innerhalb einer Page-Erfahrung ausgewählt, gerendert, paginiert und veröffentlicht werden, ohne jedes Archiv oder Verzeichnis in manuelle Seitenbearbeitung umzuwandeln.
Kernaufgabe
Eine Liste ist verantwortlich für:
- die Auswahl einer Inhaltsmenge
- das Sortieren und Begrenzen der Ergebnisse
- das konsistente Rendern jedes Elements
- das Paginieren größerer Sammlungen
- das Bereitstellen eines vorhersehbaren Browsing-Vertrags
Listen sollten eine klare Frage beantworten: „Welche Sammlung soll diese Seite präsentieren?“
Listenmodell
Eine typische Liste kombiniert:
- eine Abfrage-Definition
- eine Ergebnis-Sortierstrategie
- eine Seitengröße
- einen Darstellungsmodus
- optionale benutzerdefinierte Felder
- optionale Template-Logik für Elemente
Konzeptionell:
{
"name": "resource-library",
"query": {
"template": "resource-item",
"parent": "/resources/",
"sort": "-published",
"limit": 12
},
"display": {
"mode": "custom-template",
"pagination": true
}
}Abfragevertrag
Technische Teams sollten Listenabfragen explizit und begrenzt halten.
Typische Eingaben umfassen:
- Inhaltstyp
- Abschnittsgrenze
- Sortierung
- Ergebnisslimit
- zusätzliche Filterbedingungen
Eine schwache Abfrage erzeugt schwache Ergebnisse. Wenn die Inhaltsgrenze vage ist, wird die Liste schnell zu einer Ablage.
Beispiel:
template=resource-item, parent=/resources/, sort=-published, limit=12Diese Abfrage ist verständlich. Ein Catch-all-Archiv mit mehreren nicht zusammenhängenden Typen ist es normalerweise nicht.
Beispiel für Abfragedesign
Gute List-Definitionen trennen meist die Auswahlregel und die Darstellungsregel:
{
"name": "case-studies",
"query": {
"template": "case-study",
"parent": "/customers/",
"sort": "-published",
"limit": 9
},
"display": {
"mode": "custom-template",
"pagination": true
}
}So lässt sich leichter prüfen, ob die Inhaltsgrenze korrekt ist, bevor die Präsentation besprochen wird.
Darstellungsmodi
Listen folgen normalerweise einem von zwei Modellen.
Ausgabe im Kartenstil
Verwenden Sie dies, wenn:
- Redakteure einen reibungslosen Konfigurationspfad benötigen
- das Archiv einem Standard-Visuellen Muster folgt
- ein konsistentes Karten-Layout ausreicht
Benutzerdefinierte Template-Ausgabe
Verwenden Sie dies, wenn:
- Ergebnis-Elemente eine reichere Zuordnung benötigen
- das Design kein einfaches Kartenraster ist
- Metadaten, Abzeichen oder Medien eine benutzerdefinierte Platzierung benötigen
- das Archiv von Facet-Logik abhängt
Beispiel einer benutzerdefinierten Elementausgabe:
<div class="resource-grid">
{{#each items}}
<article class="resource-card">
<a href="{{ this.url }}">
<h3>{{ this.title }}</h3>
<p>{{ this.summary }}</p>
</a>
</article>
{{/each}}
</div>Paginierung
Paginierung ist Teil des Listenvertrags, nicht nur ein visuelles Detail.
Die technische Prüfung sollte definieren:
- Standardseitengröße
- Verhalten bei Seitenanzahl
- Navigationsmuster
- Verhalten im Leerzustand
Konzeptionell:
page 1 -> items 1-12
page 2 -> items 13-24
page 3 -> items 25-36Wenn erwartet wird, dass eine Liste wächst, sollte Paginierung von der ersten Veröffentlichung an bewusst vorgesehen sein.
Beziehung zu Seiten und Komponenten
Das klare Denkmodell ist:
- Layout stellt das Grundgerüst bereit
- Seite stellt die veröffentlichbare Route und die umgebende Erfahrung bereit
- Liste stellt die dynamische Sammlung bereit
- Komponente kann unterstützende Abschnitte um die Liste herum bereitstellen
Beispielhafte Seitenzusammensetzung:
resource-layout
-> archive-hero component
-> resource-library list
-> newsletter-signup componentDas trennt dynamisches Browsing von einmaligen Seiteninhalten.
Beispiel für eine Listenvorlage
<section class="archive">
<header class="archive-header">
<h1>{{ page.title }}</h1>
</header>
<div class="archive-items">
{{#each items}}
<article class="archive-item">
<a href="{{ this.url }}">{{ this.title }}</a>
</article>
{{/each}}
</div>
{{#if pagination}}
<nav class="archive-pagination">
{{{ pagination.links }}}
</nav>
{{/if}}
</section>Das Ziel ist ein stabiler Vertrag zwischen der Listenabfrage und der Archivvorlage.
Regeln für Leerzustand und Wachstum
Die technische Prüfung sollte außerdem berücksichtigen, was passiert, wenn sich die Sammlung verändert:
- keine Ergebnisse
- ein Ergebnis
- viele Seiten mit Ergebnissen
- fehlende optionale Felder bei einigen Elementen
Eine Listenvorlage ist nur dann stabil, wenn sie alle vier Zustände übersteht, ohne Layout-Brüche oder verwirrende Ausgaben zu erzeugen.
Technische Prüfliste
- Ist die Abfragegrenze klar und eng gefasst?
- Passt die Sortierung zur Browsing-Absicht?
- Kann das Template mit steigendem Ergebnisvolumen umgehen?
- Ist Paginierung Teil des Designvertrags?
- Löst die Liste ein Archivproblem und nicht mehrere nicht zusammenhängende?
Anti-Patterns
Vermeiden Sie:
- das Mischen nicht zusammenhängender Inhaltstypen in einem Archiv nur weil sie verfügbar sind
- den Aufbau eines Archivs komplett von Hand mit wiederholten manuellen Karten
- die Verwendung einer Liste für mehrere visuelle Modi mit inkompatiblen Verträgen
- das Belassen der Ergebnisreihenfolge als implizit
- das Ignorieren von Leerzuständen und Paginierung, bis das Inhaltsvolumen zum Problem wird