2016-08-10 20 views
0

メニューを実装しています(thisなど)。それを行う正しい方法は何ですか?私はYesod自身やそれを行う他の図書館で例を見つけませんでした。Yesodのナビゲーションメニュー

+0

さてあなたは明らか* *それを実装する方法を見つけました:

-- Foundation.hs data MenuItem = MenuItem { _menuItemLabel :: Text , _menuItemRoute :: Route App , _menuItemAccessCallback :: Bool } deriving (Show) instance Yesod App where -- ... defaultLayout widget = do -- ... muser <- maybeAuthPair mcurr <- getCurrentRoute -- All the menu items. let menuItems = [ MenuItem { _menuItemLabel = "Home" , _menuItemRoute = HomeR -- Always show menu item. , _menuItemAccessCallback = True } , MenuItem { _menuItemLabel = "People" , _menuItemRoute = PeopleR -- Example for item that shows only if user is authenticated. , _menuItemAccessCallback = isJust muser } ] -- Filter items to show only accessible items let filteredMenuItems = [x | x <- menuItems, _menuItemAccessCallback x == True] 

、デフォルトのテンプレートファイル内:ここ – MarLinn

+0

私は_logic_が欠けているのを探しています。これは、アクティブなメニュー項目に 'アクティブな'クラスを与えたり、ユーザーごとに異なる項目を与えたりするようです。私は 'YesodBreadcrumbs'のようなものを期待していましたが、メニュー – amitaibu

答えて

1

問題の説明は、クライアント側でjsやおそらくajaxやフォーム要素+巧妙なCSSを扱っているようなものです。

最近、Yesodで構築されたほとんどのサイトでは、ナビゲーション項目が半分以下になると仮定しているため、menues専用のサブシステムは多くの人に必要なものではありませんでした。しかし、多分私は何かを見落としたので、takelookあなた自身。

本当に必要な場合は、独自のサブシステムを開発するのは比較的簡単なことです。結局のところ、あなたが必要とするのは、ちょっとした小さな村が列挙型などに基づいて変わることだけです。

-- default-layout.hamlet 
<nav> 
    $forall MenuItem label route _ <- filteredMenuItems 
    <a class="item" :Just route == mcurr:.active href="@{route}">#{label} 
+0

に感謝しました。私は実際に料理本を見てきました。そこに何も見つかりませんでした。デカップリングされたサイトもたくさん書いていますが、私はボックスの中に何が入っているかを見るために、yesodの "基本"機能を見ています。 私の仕事に関しては、現在のハンドラー/ルートを取得する正しい方法は何でしょうか? – amitaibu

+0

@amitaibuシンプル:ハンドラが実行されている場合は、現在のハンドラです。しかし、新しい質問を別の質問として尋ねて、見つけやすいようにしてください。 – MarLinn

0

は私が終わった内容の簡単な例でありますあなたが1つにリンクしているように。あなたが今やっておかなければならないのは、テンプレートとウィジェットのコードに変換することです。これは、ほぼ1対1でなければならず、本書によく書かれています。だから...何が欠けているの?あなたが苦労している特定のポイントはありますか?