
On Sun, Feb 20, 2011 at 11:04 PM, Dmitry Kurochkin
Hi Michael.
On Sun, 13 Feb 2011 19:13:06 +0300, Dmitry Kurochkin
wrote: On Sun, 13 Feb 2011 17:44:33 +0200, Michael Snoyman
wrote: On Sun, Feb 13, 2011 at 5:28 PM, Dmitry Kurochkin
wrote: Still the argument remains. I want to have all menu-related code in a separate module.
OK. As I said, this is possible, and it sounds like you already got 90% of the way there. I don't know what's holding you up until I see your code. My initial reaction is still that this is a bad idea in general, though I *am* reconsidering that position. It might make sense to alter the approach used by the scaffolded site.
I will try to send you some an example later. Unfortunately, I do not have time for this right now. Playing with Yesod in my free time only.
I took another look at it. Turns out my problem was caused by using getCurrentRoute in the widget. If there is no getCurrentRoute, it works fine and I can use the widget in the defaultLayout.
Here is a simple code to demonstrate the issue:
testWidget :: GWidget sub Test () testWidget = do Just route <- lift getCurrentRoute addWidget [$hamlet|@{route}|]
Add the above code to the main application module. In the above case Test is the foundation type. I get the following error:
Couldn't match expected type `TestRoute' against inferred type `Route sub' NB: `Route' is a type function, and may not be injective
I would appreciate if you explain what the problem is and how to solve it.
getCurrentRoute[1] returns a route for the current subsite, while you want a route for Test (ie, Route sub vs Route Test). You need to convert your Route sub into a Route Test, by using getRouteToMaster[2]. Michael [1] http://hackage.haskell.org/packages/archive/yesod-core/0.7.0.1/doc/html/Yeso... [2] http://hackage.haskell.org/packages/archive/yesod-core/0.7.0.1/doc/html/Yeso...