Ich arbeite an einem CMS, das auf Yesod für mein Abschlusspraktikum basiert. Derzeit verwenden wir ein Subsite (Core
), um den Admin-Bereich darzustellen. Dieser Core
sollte zwischen Projekten wiederverwendbar sein, sodass er vom Hauptstandort getrennt ist und über ein eigenes Repository verfügt. Es sollte möglich sein, andere Subsites in den Core
zu integrieren. Diese anderen Subsites sollten alle das gleiche (Admin-) Layout verwenden können.
Die von uns verwendeten Repositories sind:
CMS-Kern: https://github.com/lambdacms/lambdacms-core/tree/extensions
CMS-Media-Erweiterung: https://github.com/lambdacms/lambdacms-media
Demo Yesod Master: https://github.com/lambdacms/ponycms/tree/media
Beachten Sie, dass diese URLs auf bestimmte Branches verweisen. Das sind die Branches, die ich derzeit verwende.
Anfangs habe ich die Funktion lambdaCoreLayout
(die in Foundation.hs gefunden wurde) verwendet, um das richtige Layout für alle Handler innerhalb des Core
selbst bereitzustellen. Aber ich konnte diese Funktion nicht in anderen Subsites verwenden. Anstatt zu wiederholen, was bereits funktionierte, habe ich die Funktion tryoutLayout
(die in derselben Datei gefunden wurde) hinzugefügt, die für alle Subsites funktioniert und defaultLayoutSub
(die mit Yesod geliefert wird) ähnelt. Es erlaubt mir jedoch nicht, getRouteToParent
in einem der Handler zu verwenden, um sichere Typenrouten zu den Widgets hinzuzufügen.
Nehmen Sie zum Beispiel diesen Ausschnitt:
getAdminHomeR :: CoreHandler Html
getAdminHomeR = do
tp <- getRouteToParent
tryoutLayout [whamlet|@{tp AdminHomeR}|]
Dies gibt mir folgenden Fehler:
Konnte (master ~ Core) nicht ableiten
aus dem Kontext (LambdaCmsAdmin master)
begrenzt durch die Typsignatur für
getAdminHomeR :: LambdaCmsAdmin master =>
HandlerT Core (HandlerT master IO) Html
bei LambdaCms/Core/Handler/Home.hs:17:18-33
‘master’ ist eine starre Typvariable, begrenzt durch
die Typsignatur für
getAdminHomeR :: LambdaCmsAdmin master =>
HandlerT Core (HandlerT master IO) Html
bei
Erwarteter Typ: WidgetT
Core
IO
(yesod-core-1.4.2:Yesod.Routes.Class.Route master
-> [(Text, Text)] -> Text)
Tatsächlicher Typ: WidgetT
Core
IO
(yesod-core-1.4.2:Yesod.Routes.Class.Route
(HandlerSite (WidgetT Core IO))
-> [(Text, Text)] -> Text)
Relevante Bindungen enthalten
tp :: yesod-core-1.4.2:Yesod.Routes.Class.Route Core
-> yesod-core-1.4.2:Yesod.Routes.Class.Route master
(begrenzt bei LambdaCms/Core/Handler/Home.hs:20:3)
getAdminHomeR :: HandlerT Core (HandlerT master IO) Html
(begrenzt bei LambdaCms/Core/Handler/Home.hs:19:1)
Im ersten Argument von ‘(>>=)’, nämlich ‘getUrlRenderParams’
Im ersten Argument von ‘tryoutLayout’, nämlich
‘((getUrlRenderParams
>>=
(\ urender_agTZ
-> (asWidgetT . toWidget)
(toHtml (\ u_agU0 -> urender_agTZ u_agU0 [] (tp AdminHomeR))))))’
Wenn ich richtig liege, deutet dieser Fehler darauf hin, dass getRouteToParent
versucht, eine Funktion zurückzugeben, die versucht, eine Route Core
anstatt einer Route master
zu generieren. Ich habe versucht, tp <- getRouteToParent
an verschiedenen Stellen einzufügen, aber es ist mir nicht gelungen, dass es funktioniert.
Mein eigenes Wissen über Haskell und Yesod ist begrenzt, und ich habe keine Lösung oder Hinweise in die richtige Richtung finden können. Fehlt mir etwas oder sollte dies auf eine andere Weise angegangen werden?