3

问题

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

语境

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

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

到目前为止的解决方案

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

这意味着:

  1. 在某处获取侧边栏所需的所有数据,
  2. 将数据从每个控制器传递到每个视图,
  3. 最后在每个模板中,使用给定的数据调用一个外部模板。

我想做的是 Symfony2 框架中存在的东西。我希望能够直接调用控制器。

{% render MyController:MyActionMethod %}

如何实现这种机制?

PS:是的,我已经搜索了一下。发现了这个问题“类似的问题”:How to Avoid pass parameters anywhere in play2?

4

2 回答 2

1

There are two solutions, you described first - it's passing data from the controller as some kind of object and then using tags for rendering it.

Second solution is reverse, as in Play 2 each template is just a Scala function, you can also just call some method in your controller, which will get required data and render the subtemplate.

ie. to access controllers.MyController.myMethod(Integer a, Integer b) from template use

<div>
  @MyController.myMethod(1,2) 
</div>
于 2012-07-12T09:53:46.273 回答
0

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

public static Content widget() {

   Data fetchedData = fetchDataFromTheDatabase();

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

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

于 2012-07-12T09:55:35.593 回答