hellolift学習ノート(4)


5.Entry関連sitemap
User関連のコンテンツはフレームワークによってデフォルトで実装され制御されるものが多いので、まずスキップして、アプリケーションによって制御されるEntry関連のコンテンツを見てみましょう.まず彼のメニュー定義を見てみましょう.
helloliftsrcmainscalacomhelloliftmodelEntry.scalaは定義形式に新しい変化が見られます
  // sitemap entry
  val sitemap = List(Menu(Loc("CreateEntry", List("entry"),
			      "Create An Entry",
			      If(User.loggedIn_? _, "Please login"))),
		     Menu(Loc("ViewEntry", List("view"),
			      "View An Entry", Hidden)),
		     Menu(Loc("ViewBlog", List("blog"), "View Blog")))

ここでLocの作成にはいくつかのパラメータがありますが、まずLocのapply関数を見てみましょう.
 /**
   * Create a Loc (Location) instance
   *
   * @param name -- the name of the location.  This must be unique across your entire sitemap.
   * It's used to look up a menu item in order to create a link to the menu on a page.
   * @param link -- the Link to the page
   * @param text -- the text to display when the link is displayed
   * @param params -- access test, title calculation, etc.
   *
   */
  def apply(theName: String,
            theLink: Link[NullLocParams],
            theText: LinkText[NullLocParams],
            theParams: LocParam*): Loc[NullLocParams]

最初の3つの基本パラメータの後に、Locをより細かく制御するために使用される反復可能なパラメータtheParamsがある(「The Definitive Guide To Lift」ch 5,P 65参照).theParamsのタイプはLocParam(trait net.liftweb.sitemap.Loc.LocParam)であり、このtraitにはいくつかのサブクラス(Test,If,LocInfo,Snippet,LocGroup,LocSnippets,Title,Unless,Template,HttpAuthProtected)があり、これらのサブクラスのapiによって各制御の具体的な使用方法が見られる.ここで使われているいくつかの
i) If
If(User.loggedIn_? _, "Please login")

これはIfクラスで、Ifクラスの定義は以下の通りです.

case class If(val test : () => Boolean, val failMsg : Function0) 
 extends LocParam with Product 

    If the test returns True, the page can be accessed, otherwise, the result of FailMsg will be sent as a response to the browser. If the Loc cannot be accessed, it will not be displayed in menus. 
param
    failMsg - -- what to return the the browser (e.g., 304, etc.) if the page is accessed. 
    test - -- the function that tests access to the page

ここでloggedIn_?UserのベースクラスMetaMegaProtoUserで定義されているメソッド(このような奇妙なメソッド名から何のメリットがあるのかまだ分かりません)、下線_は、パラメータリストのプレースホルダです.
このIf()の役割は,ユーザがログインしているか否かを判断し,ログインしなければブラウザに文字列「Please login」を返すことである.この例ではsitemapがメニュー項目の表示を制御するだけでなく,ページへのアクセスも制御していることも分かる.ブラウザに直接アドレス/entryを入力してアクセスすると、「Please login」のヒントしか得られません.
ii)Hidden
他のいくつかとは異なり、Hiddenはobjectであり、このメニューが表示されないことを示すフラグにすぎません.デフォルトでは、liftはmenuで一致しないページにアクセスできないため、このページにアクセスできるようにすることを目的としています.

  /**
   * If this parameter is included, the item will not be visible in the menu, but
   * will still be accessable.
   */
  case object Hidden extends LocParam