È necessario rendere diversi frammenti HTML in diversi punti all'interno di un modello di frazione
Domanda
nel mio default-layout.hamlet
:
!!!
<html lang="en">
<head>
<meta charset="utf-8">
<title>#{pageTitle pc}
^{pageHead pc}
<body>
<div id="main">
<div id="header">
????
<div id="content">
^{pageBody pc}
Da una funzione di gestore, devo sostituire il ????
Sopra con alcuni contenuti HTML.
Come è fatto?
Grazie per qualsiasi input.
MODIFICARE:
Sto cercando funzionalità simili, ad esempio, i blocchi di modelli di Django. Posso definire un blocco all'interno di un modello e il gestore che utilizza questo modello per il rendering, può riempire i blocchi del modello con il contenuto necessario. In questo momento, Yesod ha effettivamente un singolo blocco nel corpo di un modello. che "definito" dalla chiamata ^{pageBody pc}
. So di poter costruire l'output generato da pageBody
In ogni caso voglio usare addWidget
ecc., ma in questo momento dovrò produrre il mio <div id="header">
e <div id="content">
Anch'io e voglio evitarlo perché tutti i miei gestori dovranno produrre questi div
È avere la stessa struttura di markup in tutte le pagine.
Soluzione
Penso che la risposta sia definire una funzione oltre a DefaultLayout. L'unica cosa che è magica di DefaultLayout è che i subiti (ad esempio Auth) e i messaggi di errore lo usano per impostazione predefinita. Ma potresti definire un "MyDefaultLayout" che prende gli altri contenuti che desideri. Potresti anche definire una funzione helper che avvolge i blocchi extra in un singolo blocco e quindi lo passa a DefaultLayout.