`
laowang
  • 浏览: 37480 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hellolift学习笔记(9)

阅读更多
至此,hellolift例子的分析对我来说已经完成了他的使命。虽然还遗留了一些没搞清楚的问题,但是基本上已经可以适应scala风格的代码阅读,对liftweb框架也有了一个基本成型的认识。至少我现在已经比较容易俯下身来去了解scala的一些细节,也可以比较轻松的去阅读liftweb的文档去掌握更多的内容。所以下一阶段会把学习重点暂时转移到《Programming In Scala》和《The Definitive Guide To Lift》的研读,同时自己做一些小东西。

今天来把这个系列笔记暂时结束掉。

10. User
User的实现继承了Mapper框架中的MegaProtoUser和MetaMegaProtoUser,并对他做了一些扩展,在这里重点学习了这种扩展方式和在菜单实现中的特殊的地方。

这里的User与框架的缺省实现,仅仅增加了一个blogtitle属性,这个属性通过signupFields来标识注册的时候需要填写这个字段。

通过重载dbTableName可以设定改变映射的table,如果不做这个系统会默认使用user_t的名称。

一度让我迷惑的是下面这个实现
override val basePath: List[String] = "user_mgt" :: "usr" :: Nil

在User中定义了basePath,在生成User相关的菜单时会生成/user_mgt/usr/login的url地址,但是在代码中找不到这样的目录及模板。
原来,Loc创建时的LocParam参数有一个子类是Template,这个子类注册一个函数,函数将处理请求,执行的结果将返回NodeSeq,作为页面的输出。
 /**
   * Allows a user to specify a template based upon a function from the current
   * value encapsulated in the Loc
   */
  case class Template(template: () => NodeSeq) extends AnyLocParam


在User的实现中是这样的代码
...
Template(() => wrapIt(login))
...
protected def wrapIt(in: NodeSeq): NodeSeq =
  screenWrap.map(new RuleTransformer(new RewriteRule {
        override def transform(n: Node) = n match {
          case e: Elem if "bind" == e.label && "lift" == e.prefix => in
          case _ => n
        }
      })) openOr in
}
...
 def login = {
 if (S.post_?) {
   ...
 }
 bind("user", loginXhtml,
         "email" -> (FocusOnLoad(<input type="text" name="username"/>)),
         "password" -> (<input type="password" name="password"/>),
         "submit" -> (<input type="submit" value={S.??("log.in")}/>))
  }


def loginXhtml = {
    (<form method="post" action={S.uri}><table><tr><td
              colspan="2">{S.??("log.in")}</td></tr>
          <tr><td>{S.??("email.address")}</td><td><user:email /></td></tr>
          <tr><td>{S.??("password")}</td><td><user:password /></td></tr>
          <tr><td><a href={lostPasswordPath.mkString("/", "/", "")}
                >{S.??("recover.password")}</a></td><td><user:submit /></td></tr></table>
     </form>)
  }



这里的代码不再做详细的解释,说明几点
1) S.??是国际化的做法,用来读取properties文件定义的串值
2) 这里展示了toForm之外另一种输出页面内容的做法
3) 这里输出的只是核心的form内容,完整的页面在具体的应用确定,在通过在子类中定义screenWrap来实现这个控制。

其他的User相关的页面实现过程大体类似,不再赘述。

--------------------------------------------------------------------------------
题外话:写这个笔记的过程中发现,写点东西还真希望有很多的人关注,算是虚荣哈,感谢来看我写的东西的朋友们,有空还要多来踩一踩哈:)
分享到:
评论
6 楼 d_eye 2010-07-04  
User相关的页面,可以中文化吗?
一些字段默认显示是英文的,可以设置成中文的吗?
5 楼 yangzhan 2010-01-28  
老王最近忙啥去了呢?好久没见老王的新文章了。
4 楼 yangzhan 2009-11-28  
其实看了lift的介绍,说是集合了Rails,Wicket,Struct等几个框架的优点,感觉这是一个不错的框架。但看到Mode里有前html代码感觉很不爽。还有一个感觉就是觉得写出来的代码太难读了,资料也少,估计很难推广。也许我还只看到了皮毛,还得多看看,多想想:)
3 楼 yangzhan 2009-11-28  
一种新的开发模型  。。。 挑起了我接着看的欲望。。。:)
2 楼 laowang 2009-11-27  
yangzhan 写道
老王的lift这一系列文章应该是国内一个最全的讲解lift的文档。受教了。

惭愧了,其实这几天回过头来看《The Definitive Guide To Lift》的时候发现很多路走错了,一直在用以前的思路来理解lift,现在感觉lift不仅仅是提供一个框架,而是提供了一种新的开发模型,我现在担心写的这些东西会给大家有误导,在想着怎么去弥补。
1 楼 yangzhan 2009-11-26  
老王的lift这一系列文章应该是国内一个最全的讲解lift的文档。受教了。

相关推荐

Global site tag (gtag.js) - Google Analytics