Skip to main content

Packing/Unpacking

In questa pagina verranno descritte delle operazioni effettuate frequentemente sui page element. Il codice che implementa le operazioni di seguito descritte si trova nella directory Application/Services/PageElementServices: questi servizi vengono utilizzati dai mapper per le operazioni di packing/unpacking dei campi page element nelle entità.

Packing

Quando un elemento di contenuto, come un'intestazione o un banner di pagina, viene presentato all'utente, contiene molte informazioni che vengono recuperate dinamicamente dagli oggetti terzi a cui si riferisce: ad esempio, un componente CTA potrebbe voler leggere dati di un'altra pagina (Titolo, url, icona, ecc.).

Quando l'elemento viene archiviato, la maggior parte delle informazioni può essere eliminata poiché occuperebbe inutilmente spazio nel DB e i dati con tutta probabilità non sarebbero aggiornati rispetto allo stato attuale del sito (ad esempio, il titolo della pagina di destinazione della CTA potrebbe cambiare ).

Per risolvere questo problema, i page element in entrata attraversano quello che viene chiamato packing, ovvero un processo di eliminazione di tutte le informazioni non essenziali e, allo stesso tempo, di accertamento che l'elemento passato sia conforme al suo schema.

Esempio

Supponiamo che il page element segua questo template:

template foo in group bar with importance 5

config: {

}

content: {
abc: int,
def: string
}

E che i dati in arrivo dal client siano:

{
"template": "foo",
"config": {},
"content": {
"abc": 5
}
}

Unpacking

L'operazione opposta al packing è l'unpacking. Unpacking significa trasformare i dati minimizzati dal packing in ciò che il client si aspetta. Ad esempio, un riferimento a pagina è rappresentato con la coppia (id pagina, cultura/lingua) nel database in seguito al packing, ma durante l'unpacking vengono aggiunte molte informazioni caricate dinamicamente (url, titolo, parent, antenati, immagine di copertina, ecc.), in questo modo page element come il gridCardContent potranno mostrare correttamente i link a schermo.

Packing e unpacking sono operazioni opposte ma dal punto di vista tecnico sono molto simili, la differenza principale è che l'unpacking, dovendo recuperare informazioni non immediatamente disponibili, si avvale pesantemente di entity service e data loader per la consultazione del DB. L'unpacking è un'operazione più lenta rispetto al packing.

Funzionamento

Come fa il backend ad assicurarsi che il page element aderisca al template?

  • Legge il template
  • Interpreta il contenuto tramite il parser in Application/Services/PageElementServices/PageElementTemplateDefinitionParser e genera un albero di nodi del tipo (astratto) PageElementTemplateNode. Questi nodi:
    • rappresentano in modo astratto i tipi di dati utilizzabili nei template.
    • possono essere di molti tipi diversi.
    • sono configurati in base alle opzioni definite nel template (es. max e min per i tipi numerici).
    • espongono i metodi pack e unpack, che alcuni nodi richiamano ricorsivamente sui nodi figli (es. tipo object o array).
  • Chiama il metodo pack o unpack sulla radice dell'albero, passandogli il JSON in arrivo dall'utente (o dal DB), questo restituità il JSON finito.

Esempio

template foobar in group base with importance 10

config: {
abc: string,
xyz: (int(min=5) | string)
}

content: pageElement(pageElementType="icon")