Меню навигации в Йесод

Я смотрю на реализацию меню (что-то вроде этого). Как правильно это сделать? Я не нашел ни примеров в самом Yesod, ни в других библиотеках, которые это делают.

2 ответа

Описание проблемы звучит как то, что я бы в основном обрабатывал на стороне клиента с помощью js и, возможно, ajax или даже с элементами формы + умный css.

Я предполагаю, что большинство сайтов, созданных с помощью Yesod, не имеют больше, чем, возможно, полдюжины навигационных записей, поэтому отдельная подсистема только для меню не была чем-то, что нужно многим людям. Но, может быть, я что-то упустил, так что посмотрите сами.

Тем не менее, разработка собственной подсистемы должна быть относительно простой, если она вам действительно нужна. В конце концов, все, что вам нужно, это чтобы какой-то маленький кусочек деревушки изменился в зависимости от перечисления или чего-то еще.

Вот упрощенный пример того, чем я закончил:

-- 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]

И внутри файла шаблона по умолчанию:

-- default-layout.hamlet
<nav>
  $forall MenuItem label route _ <- filteredMenuItems
    <a class="item" :Just route == mcurr:.active href="@{route}">#{label}
Другие вопросы по тегам