Pagine dinamiche (Catch-All)
Vuoi sotto /blog un elenco e sotto /blog/mein-artikel l’articolo – senza creare una pagina per ogni articolo? Per questo c’è Catch-All.
- Crea la pagina
/bloge in Impostazioni spunta Catch-All. - Nella Collection blog crea un campo
slug(la parte dell’URL di ogni articolo). - HTML della pagina
/blog:
{% if route.slug %}
{% with post=item("blog", "slug", route.slug) %}
{% if not post %}{{ not_found() }}{% endif %}
<article>
<h1>{{ post.titel }}</h1>
<p class="datum">{{ post.datum }}</p>
{{ image(post.bild, "(min-width: 900px) 60vw, 100vw") }}
{{ post.text|markdown }}
<a href="/blog">← Alle Artikel</a>
</article>
{% endwith %}
{% else %}
<h1>Blog</h1>
{% for post in data("blog", "sort", "-datum") %}
<a class="teaser" href="/blog/{{ post.slug }}">
<h2>{{ post.titel }}</h2>
<p>{{ post.text|truncatechars:160 }}</p>
</a>
{% endfor %}
{% endif %}
- Titolo SEO della pagina:
{% if route.slug %}{{ item("blog", "slug", route.slug).titel }} – {% endif %}Blog
Ecco come funziona:
/blog→route.slugè vuoto → elenco./blog/mein-artikel→ non esiste una paginamein-artikel→ la pagina Catch-All risponde conroute.slug = "mein-artikel"./blog/gibts-nicht→item()non trova nulla →not_found()restituisce la pagina 404 con stato 404.- Le sottopagine reali hanno la precedenza: se crei
/blog/archivcome pagina normale, viene mostrata quella. - Percorsi a più livelli:
/blog/2025/rueckblickdàroute.slug = "2025/rueckblick",route.rest.0 = "2025",route.rest.1 = "rueckblick".
Per i test, l’anteprima delle pagine Catch-All ha il campo Sottopercorso. Se il template chiama not_found() (ad es. senza sottopercorso), l’anteprima invece di un errore mostra un avviso con i sottopercorsi esistenti – dalla sorgente della sitemap o dalla Collection riconosciuta.
Sitemap: se nell’HTML, nel titolo SEO o nel campo Head della pagina Catch-All compare item("<collection>", "<feld>", route.slug), IllusionCMS inserisce in /sitemap.xml tutte le voci pubblicate di questa Collection come pagine di dettaglio (non le bozze né le voci senza valore nel campo). Le sottopagine reali hanno la precedenza.
Pagine di dettaglio da altre sorgenti: se la pagina legge i suoi dati in altro modo – da IllusionDB, da una sorgente REST o tramite Workflow –, nelle Impostazioni della pagina Catch-All stabilisci la sorgente in Pagine di dettaglio per sitemap ed esportazione statica:
- Tabella IllusionDB: connessione, tabella, la colonna con la parte di URL (ad es.
slug), facoltativamente una colonna con la data di modifica (<lastmod>) e regole o una vista salvata come filtro – ad es. soloaktiv = true. - Workflow: l’ingresso HTTP di un Workflow (come con
workflow()) che restituisce una lista – oggetti con il campo URL o semplicemente testi. Ricevesitemap=1inmsg.payload. Così finiscono nella sitemap anche sorgenti REST e liste calcolate. - Verifica mostra quante pagine di dettaglio risultano e i primi indirizzi. I valori con
/danno percorsi a più livelli (berlin/zahnarzt→/leistungen/berlin/zahnarzt). - Da IllusionDB vengono richieste solo la colonna con la parte di URL e la data.
- La lista viene memorizzata per 10 minuti. Se la sorgente per un momento non è raggiungibile, nella sitemap resta l’ultima versione, invece di far sparire migliaia di indirizzi.
- Da 50 000 indirizzi
/sitemap.xmldiventa automaticamente un indice di sitemap con/sitemap-1.xml,/sitemap-2.xml, … (limite dei motori di ricerca per file). - Le stesse pagine di dettaglio le include l’esportazione statica – anche se nessun link vi punta.
Dati da IllusionDB: le pagine di dettaglio possono anche recuperare i loro record direttamente da un database – tramite un Workflow con il node IllusionDB, vedi Workflows → IllusionDB.