包括某些页面的特定内容

时间:2015-03-29 16:54:35

标签: java tapestry

我有一个layout.tml,在那里我定义了我希望每个页面都有的常见内容。但是,现在我遇到了一个问题,当我想要为某个页面包含特定内容(例如营销)时。我想这是错误的想法,但在我的layout.tml中,我创建了marketingBlock。我希望这个,隐藏,直到我在某个地方调用它,比如page2.tml,我希望该页面包含这个块。问题是,它没有显示出来。

那我该怎么做?

<t:block id="marketingBlock">
    <div class="row marketing">
       <h4>Marketing Name</h4>
       <img />
        <p></p>
    </div>
</t:block>

Layout.tml

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" >
    <head>
        <title>${title}</title>
        ...
    </head>

    <body>
        <div class="container">
            <div class="header">
                <nav>
                    ...
                </nav>
                <h3 class="text-muted">Site Name</h3>
            </div>

            <t:body />

            <!-- i want this portion to be included for some specific pages only -->
            <t:block id="marketingBlock">
                <div class="row marketing">
                    <h4>Marketing Name</h4>
                    <img />
                    <p></p>
                </div>
            </t:block>

            <footer class="footer">
                <p>&copy; Company 2015</p>
            </footer>
        </div>
    </body>  
</html>

Page2.tml

<html t:type="layout" title="TapestryTest Index"
      t:sidebarTitle="Framework Version"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
      xmlns:p="tapestry:parameter">

      <body>
            <div class="content">
                ...
            </div>

      <t:block id="marketingBlock" />

</html>

1 个答案:

答案 0 :(得分:1)

反过来想想它。您的Layout类是一个组件,就像任何Tapestry组件一样,它可以有参数,参数可以是父页面的HTML块。因此,如果您希望每个页面都为Layout组件提供不同的营销内容,那么您需要的方法是通过Layout组件的“marketing”参数将块从包含页面传递到Layout组件。

请参阅http://tapestry.apache.org/layout-component.html底部的示例 - 在该示例中,CSS块正在传递到Layout组件中,但它可以很容易地成为HTML块。

所以你的Page2.tml看起来像这样:

<html t:type="layout" title="TapestryTest Index"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
      xmlns:p="tapestry:parameter">
<p:marketing>
    <div class="row marketing">
        <h4>Marketing Name</h4>
        <img />
        <p></p>
    </div>
</p:marketing>
<body>
    <div class="content">
                ...
    </div>
</body>

</html>

或者,如果您希望多个页面具有相同的营销内容但允许某些页面根本没有营销内容,那么您应该将营销div放在您的布局模板中(如在您的示例),并让每个父页面都传入一个布尔参数(“showMarketing”),该参数控制是否应该出现该div。然后你可以在你的布局中放一个组件来测试那个布尔值。

所以你的布局模板会有这个:

<t:if test="showMarketing">
    <div class="row marketing">
        <h4>Marketing Name</h4>
        <img />
        <p></p>
    </div>
</t:if>

并且每个页面顶部都会有一个“showMarketing”参数,设置为“true”或“false”:

<html t:type="layout" showMarketing="true" title="TapestryTest Index"
  xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
  xmlns:p="tapestry:parameter">