【发布时间】:2012-08-04 23:16:54
【问题描述】:
有人可以举个例子,用Snap 突出显示网站菜单上的“活动”链接吗?或者至少告诉我你会怎么做——因为我不知道。
在其他网络框架中,我通常将一个名为 active 的上下文变量设置为活动页面应该是什么,然后我的 html 会简单地检查它:
<ul>
{% ifequal active "home" %}
<li class="active">
{% else %}
<li>
{% endifqual %}
<a href="/">Home</a>
</li>
{% ifequal active "about" %}
<li class="active">
{% else %}
<li>
{% endifequal %}
<a href="/about">About Us</a>
</li>
</ul>
抢劫中有拼接,但我不确定您将如何使用它们来确定当前 url 是什么或设置上下文变量。
我的解决方案
感谢@mightybyte 和@Adam Bergmark,我确定了以下几点:
Haskell 代码:
menuenuEntrySplice :: MonadSnap m => HeistT m Template
menuEntrySplice = do
requestPath <- lift $ withRequest (return . rqURI)
node <- getParamNode
let setActive n = if getAttribute "href" node == Just (decodeUtf8 requestPath)
then setAttribute "class" "active" n
else n
let aNode = Element "a" [("href", fromMaybe "/" $ getAttribute "href" node)] $ [TextNode (nodeText node)]
let liNode = setActive $ Element "li" [] [aNode]
return [liNode]
app :: SnapletInit App App
app = makeSnaplet "app" "An snaplet example application." Nothing $ do
....
addSplices [ ("menuEntry", liftHeist menuEntrySplice) ]
return $ App h s a
现在它在 HTML 中使用:
<ul class="nav">
<menuEntry href="/">Home</menuEntry>
<menuEntry href="/contact">Contact</menuEntry>
</ul>
产生:
<ul class="nav">
<li class="active"> <a href="/">Home</a> </li>
<li> <a href="/contact">Contact</a> </li>
</ul>
【问题讨论】:
-
给
body和你的lis一个id然后做#page-home #nav-home, #page-about #nav-about怎么样? -
谢谢,但我宁愿在代码中保留逻辑,而不是 css/html :-)(是的,我确实意识到我的解决方案是在 html 中使用逻辑 - 但我没有说它是最好的:-)
标签: haskell haskell-snap-framework