如何在PlayFramework2上实现小部件?

时间:2012-07-12 09:26:19

标签: model-view-controller widget playframework-2.0

问题

如何在网站的每个页面上实现一个小部件(由数据库调用产生)?

上下文

我有一个带侧边栏的传统网络应用程序。侧边栏包含以下数据:

  • 用户名,
  • 有关帐户的详细信息(最后一次连接和其他)
  • 基于用户个人资料的个性化消息。
  • 从数据库中提取的其他数据。

到目前为止的解决方案

如官方文档中所示,可以在模板内呈现模板。这是一个有趣的功能,但还不够。因为我需要数据库中的数据在我的小部件中呈现。

这意味着:

  1. 获取侧边栏所需的所有数据,
  2. 将数据从每个控制器传递到每个视图,
  3. 最后在每个模板中,使用给定数据调用外部模板。
  4. 我想要做的是Symfony2框架中存在的东西。我希望能够直接呼叫控制器。

    {% render MyController:MyActionMethod %}
    

    如何实现这种机制?

    PS:是的,我搜索了一下。发现此问题“类似问题”:How to avoid passing parameters everywhere in play2?

2 个答案:

答案 0 :(得分:1)

首先介绍两种解决方案 - 它将来自控制器的数据作为某种对象传递,然后使用tags进行渲染。

第二个解决方案是相反的,因为在Play 2每个模板只是一个Scala函数,你也可以在控制器中调用一些方法,这将获得所需的数据并渲染子模板。

即。从模板使用

访问controllers.MyController.myMethod(Integer a, Integer b)
<div>
  @MyController.myMethod(1,2) 
</div>

答案 1 :(得分:0)

您可以在控制器中编写静态方法,该方法返回play.api.templates.Html(或play.mvc.Content)而不是Result。

public static Content widget() {

   Data fetchedData = fetchDataFromTheDatabase();

   return views.html.widget.render(fetchedData);
}

在您看来,只需调用此静态方法。