Sito di Notizie
Molti siti contengono elenchi di notizie, come ad esempio siti giornalistici o siti aziendali con sezione "News". Chiameremo questo tipo di contenuti "Articoli". Di seguito una serie di requisiti che generalmente vengono richiesti nella gestione di articoli:
- gli articoli sono ordinati dal più recente al meno recente
- ci sono articoli importanti che vogliamo tenere in testa nell'elenco
- gli articoli possono avere una data di pubblicazione mostrata sul sito diversa dall'effettiva data di inserimento nel CMS
- gli articoli possono avere una formattazione anche complessa, mescolando testi a immagini e video
- nella home page voglio mostrare N articoli tra i più importanti
- se ho una hero section, voglio decidere quale articolo appare come hero nella mia home page
Di seguito una serie di attributi che tipicamente vogliamo usare nel definire un content type di tipo Articolo:
- slug (stringa che identifica l'articolo nella URL del browser)
- titolo/title (stringa a lunghezza fissa, es. 1024)
- sottotitolo/subtitle (stringa a lunghezza fissa, es. 1024)
- corpo/body (richtext semplice o avanzato)
- parole chiave/keywords (tassonomia)
- data di pubblicazione visibile sul sito/displayed publishing date
- autore/author
- articoli correlati/related articles (riferimento ad altri articoli)
- mostra in testa/sticky on top (flag booleano)
Se vogliamo dare possibilità di modificare la pagina che mostra il singolo articolo, definiremo una pagina template. Questa pagina template avrà tutti i componenti necessari per mostrare l'articolo e tramite REST API faremo il fetch sia del contenuto sia della pagina. E' possibile farlo con un'unica chiamata REST passando il parametro page={slug}
quando si recupera il contenuto. Lato frontend utilizzerò <DiscoveryComponent/>
per costruire la pagina dinamicamente.
In alternativa, decidiamo che la pagina che mostra gli articoli non è modificabile, e in tal caso verrà codificata direttamente con il framework di frontend, senza utilizzare <DiscoveryComponent/>
.
Esempio Query
E' possibile recuperare i contenuti di tipo Articolo secondo vari criteri, come spiegato nella alla sezione Metodo getContents().
Se l'applicazione è in React, invece di getContents()
è possibile utilizzare l'hook useDiscoveryContents()
come in questo esempio:
// Recupera tutti i contenuti di tipo "Article", ordinati per titolo (A-Z), massimo 3 risultati.
const contents = useDiscoveryContents({
type: 'Article',
sort: 'title asc',
start: 0,
limit: 3
});
che recupera il seguente oggetto contenente i seguenti risultati:
{
"resultCount": 25,
"entities": [
{
"title": "Curabitur dapibus imperdiet nunc ut pulvinar",
"preview": "/demo/dam/core/img/512x512/no-preview.png",
"slug": "curabitur-dapibus-imperdiet-nunc-ut-pulvinar",
"_id": "8bef2241-5290-44fc-8b76-771d458f27ab"
},
{
"title": "de Finibus Bonorum et Malorum",
"preview": "/demo/dam/core/img/512x512/no-preview.png",
"slug": "Finibus",
"_id": "75b58e0e-510a-41ca-90c1-5df5ceb924e4"
},
{
"title": "Lorem ipsum dolor sit amet",
"preview": "/demo/dam/core/img/512x512/no-preview.png",
"slug": "Lorem",
"_id": "58e17ccd-a41c-4aba-8b20-8f6253c227de"
}
]
}
Da notare che:
resultCount
indica i risultati TOTALI della query e non i risultati restituiti, che sono limitati dall'opzionelimit
. Quest'opzione, insieme astart
, permette di recuperare i risultati in maniera paginata.- l'ordinamento per titolo non è case sensitive.
- non vengono visualizzati tutti i field del content type "Article", ma solo quelli che di default sono visibili in listing (
_id
,slug
,title
epreview
). Per mostrare field aggiuntivi è necessario scegliere l'opzione "Available in Listing API" per i campi che si vogliono aggiungere, perché di default l'API cerca di mantenere ridotto il numero di field restituiti nelle query. Se cambia quest'opzione è necessario ripubblicare i contenuti perché i nuovi attributi siano visibili nelle ricerche.
Applichiamo ora un paio di filtri alla stessa query aggiungendo l'opzione filter
:
// Recupera tutti i contenuti di tipo "Article", ordinati per titolo (A-Z), massimo 10 risultati.
const contents = useDiscoveryContents({
type: 'Article',
sort: 'title asc',
start: 0,
limit: 3,
filters: {
author: 'Andrea',
'displayed_publishing_date[bt]': '2023-01-01T00:00:00.000Z'
}
});
Stiamo filtrando per articoli che hanno author = 'Andrea'
e data di pubblicazione visibile agli utenti dal 1/1/2023 in poi. La struttura dell'elenco dei risultati, in questo caso, sarà la medesima.
Gestione Notizia Hero
Nella home page inserire un componente Hero che ha un riferimento ad un articolo. Lato redazionale si può utilizzare il picker del CMS per scegliere l'articolo Hero.
Gestione Notizie in Testa
Un tipico pattern, utilizzato ad esempio nei siti giornalistici, è mostrare le prime N notizie nella home page, e poi rimandare alla ricerca o navigazione tassonomica per visualizzare tutti gli altri articoli. In tal caso, si consiglia di usare un attributo "data di pubblicazione editoriale" (diversa dalla data effettiva di pubblicazione) che stabilisce l'ordine con cui le notizie principali vengono visualizzate. Combinando, quindi, un ordinamento sulla data di pubblicazione editoriale con un limite sui contenuti recuperati dal metodo getContents(), è possibile popolare automaticamente la home page.
Se il cliente chiede un ulteriore controllo su quali articoli devono apparire in home page, si consiglia di aggiungere un flag (es. "featured"), in modo da filtrare per la home page solo gli articoli featured, sempre mantenendo ordinamento per data di pubblicazione editoriale e limitando il numero massimo di articoli recuperati.