2012-07-12 70 views
3

问题

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

语境

我有一个侧边栏traditionnal Web应用程序。侧边栏包含如数据:

  • 用户名,关于该帐户
  • 详细信息(最后连接等)基于用户的简档
  • Personnalized消息。
  • 等数据从数据库中提取。

解决方案到目前为止

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

这将意味着:

  1. 获取所需栏某处的所有数据,
  2. 从每个控制器到每个视图传递数据,
  3. 最后,在每个模板,请致电与外部模板给定的数据。

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

{% render MyController:MyActionMethod %} 

如何才能实现这种机制? PS:是的,我搜索了一下。发现这个问题“类似的问题”:How to avoid passing parameters everywhere in play2?

回答

1

有两种解决方案,你首先描述 - 它是从控制器传递数据作为某种对象,然后使用tags来呈现它。

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

即。从模板访问controllers.MyController.myMethod(Integer a, Integer b)使用

<div> 
    @MyController.myMethod(1,2) 
</div> 
+0

很酷的东西,如果它确实有效。我今晚会试一试。我用这个解决方案看到的一个问题是我需要这个请求。意思是,我必须在所有模板上传递请求。 – 2012-07-12 12:02:31

+1

'request'在所有模板中都是隐含的(即它可以直接使用) – 2012-07-12 12:26:38

0

你可以在一个控制器,它返回一个play.api.templates.Html(或play.mvc.Content)写一个静态方法,而不是结果。

public static Content widget() { 

    Data fetchedData = fetchDataFromTheDatabase(); 

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

而在您的视图中,只需调用此静态方法即可。

相关问题