Ich möchte ein Feld zu defaultContext
hinzufügen, das eine Liste von Links für alle Seiten verfügbar machen wird. Da ich nicht glaube, dass ich defaultContext
selbst ändern kann, habe ich eine Funktion erstellt, die listField
zu defaultContext
hinzufügt und alle Referenzen auf defaultContext
damit ersetzt. Während das Programm übereinstimmt, ist meine neue listField
leer.listField immer leer
Dies ist mein letzter Versuch.
-- site.hs
match "index.html" $ do
route idRoute
compile $ do
links <- sortByTitle =<< loadAll "links/*"
let indexCtx =
listField "links" linkCtx (return links) `mappend`
constField "title" "Home" `mappend`
myCtx
getResourceBody
>>= applyAsTemplate indexCtx
>>= loadAndApplyTemplate "templates/default.html" indexCtx
>>= relativizeUrls
match "templates/*" $ compile templateBodyCompiler
myCtx =
listField "navItems" defaultContext (loadAll "nav/*") `mappend`
defaultContext
-- nav/item.markdown
---
title: nav item 1
---
-- templates/default.html
<ul>
$for(navItems)$
$title$
$endfor$
</ul>
Das tat es. Vielen Dank! :) – pdoherty926
Leider ist mein Beispiel Hakyll-Projekt ein bisschen zu künstlich. In der Praxis werden diese "Links" tatsächlich Posts sein, die auch als ihr eigener "Match" -Eintrag der obersten Ebene existieren. Wenn ich sie in 'myCtx' einführe, bekomme ich einen Kompilierungsfehler" Abhängigkeitszyklus ". Weißt du, wie ich das ansprechen würde? Ich freue mich, eine weitere Frage zu stellen, wenn es sich lohnt. – pdoherty926
Dies kann mit [Snapshots] (https://jaspervdj.be/hakyll/tutorials/05-snapshots-feeds.html) erfolgen. –