是否可以在模板调用页面中拆分doLayout?

时间:2011-06-04 01:01:00

标签: java templates playframework

在play框架视图中,您可以使用doLayout标记将代码主要导入到基本模板文件中。

但是说我在我的基础文件中有一些完全分离的区域,例如

<html>
<head></head>
<body>
<div1>doLayout</div1>
<div2>some text in here thats standard across all views...</div2>
<div3>doLayout..again</div> 
</body>
</html>

所以在我使用这个基本html文件的视图中,我可能想要在div1中的照片和div 2中的某些文本链接,但我希望将doLayouts分开并考虑将它们分开的内容(div2)

2 个答案:

答案 0 :(得分:4)

Play支持强大的#{set /}标记,可让您提供代码片段并将其分配给HTML页面中的占位符。例如,您可能会在某些代码示例中看到这一点(不记得是哪一个)。

在layout.html中:

<head>
    <link href="skin.css'}" rel="stylesheet" type="text/css" media="all" />
    #{get 'moreStyles' /}
</head>

在any_page.html中:

<div id='normal_dolayout_body'>
    <p>This is the doLayout body</[p>
</div>

#{set 'moreStyles'}
   <link href="extra.css" rel='stylesheet' type='text/css' media='all' />
#{/set}

结果页面将同时具有CSS声明。现在,要创建复杂的布局,请同时使用#set和#include标记:

layout.html中的

<!--div.container start -->
<div class="container">  
<div class="center">
<div id="layout">
        <div id='content'>
    #{doLayout/}
</div>
<div id='sidebar'>
    #{get 'sidebar'/}
    </div>
</div>
</div>
<!--div.container end -->

<!--div.footer start -->
<div class="footer">
    #{get 'promo' /}
    #{get 'footerlinks' /}
</div>
<!--div.footer end -->

在any_page.html中:

<div id='normal_body'>Will be included by doLayout</div>

<!-- You may have any number of #set tags which will be matched with any #get declared in your main layout. -->
#{set 'promo'}
   #{include 'my_custom_promo.html'/}
#{/set}

#{set 'sidebar'}
    #{if user.isHappy }
        #{include '/Commons/happy_user_sidebar.html' /}
    #{/if}
    #{else}
        #{include '/Commons/default_sidebar.html' /}
    #{/else}
#{/set}

促销和侧边栏块将注入模板中关联的#get占位符。

您可以使用#set和include标记,将DRY原则应用于页面程序集,使用类似块的方法来组合自定义页面内容。您甚至可以定义自己的自定义标记,以便在一个漂亮的#{sidebar user:user /}标记中隐藏复杂的逻辑,如果您想让设计人员更轻松的话。

答案 1 :(得分:1)

使用doLayout标签,然后不,您无法实现您的要求。 doLayout串联使用extends标记来确定布局注入主布局的位置,但它不带参数。因此,如果您尝试多次调用doLayout,那么它将如何知道正在注入哪个部分?

我看到你有两种选择。

您拥有的第一个选项是使用includes标记。这将允许您执行类似

的操作
#{include 'head.html' /}
your top layout code
#{include 'middle-common.html' /}
your bottom layout code
#{include 'foot.html' /}

有关includedoLayout之间差异的更多信息,请访问此处 - What is the difference between doLayout and include in a template in 'Java Play!'?

您的第二个选择是使用CSS来正确执行布局。理论上,你应该能够把你的标题放在标题中,并简单地使用CSS来正确定位它。