3.5.2.2.8. HTML 盒子布局

HtmlBoxLayout 是一个可以在 HTML 模板中定义组件位置的容器。布局模板包含在一个主题中。

不要将 HtmlBoxLayout 用于动态内容或嵌入 JavaScript 代码,如需要的话,请使用 BrowserFrame

该组件的 XML 名称:htmlBox

下面是一个使用 htmlBox 的简单界面的例子。

gui htmlBox 1

界面的 XML 描述:

<htmlBox align="TOP_CENTER"
         template="sample"
         width="500px">
    <label id="logo"
           value="Subscribe"
           stylename="logo"/>
    <textField id="email"
               width="100%"
               inputPrompt="email@test.test"/>
    <button id="submit"
            width="100%"
            invoke="showMessage"
            caption="Subscribe"/>
</htmlBox>

htmlBox 的属性:

  • template 属性定义了一个位于主题的 layouts 子目录中的 HTML 文件的名称。在创建模板之前,应该创建主题扩展自定义主题

    例如,如果使用 Halo 主题并且 template 属性是 my_template, 那么模板文件应该是 modules/web/themes/halo/layouts/my_template.html

    HTML 模板的内容在 modules/web/themes/halo/layouts/sample.html 文件中:

    <div location="logo" class="logo"></div>
    <table class="component-container">
        <tr>
            <td>
                <div location="email" class="email"></div>
            </td>
            <td>
                <div location="submit" class="submit"></div>
            </td>
        </tr>
    </table>

    模板应包含带有 location 属性的 <div> 元素。这些元素将显示 XML 描述中定义的有相应标识符的 CUBA 组件。

    modules/web/themes/halo/com.company.application/halo-ext.scss 文件的内容如下(要创建文件请参阅 扩展现有主题 ):

    @mixin com_company_application-halo-ext {
      .email {
        width: 390px;
      }
    
      .submit {
        width: 100px;
      }
    
      .logo {
        font-size: 96px;
        text-transform: uppercase;
        margin-top: 50px;
      }
    
      .component-container {
        display: inline-block;
        vertical-align: top;
        width: 100%;
      }
    }
  • templateContents 属性设置了模板的内容,用于直接定义布局。

    例如:

    <htmlBox height="256px"
             width="400px">
        <templateContents>
            <![CDATA[
                <table align="center" cellspacing="10"
                       style="width: 100%; height: 100%; color: #fff; padding: 20px;    background: #31629E repeat-x">
                    <tr>
                        <td colspan="2"><h1 style="margin-top: 0;">Login</h1>
                        <td>
                    </tr>
                    <tr>
                        <td align="right">User&nbsp;name:</td>
                        <td>
                            <div location="username"></div>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">Password:</td>
                        <td>
                            <div location="password"></div>
                        </td>
                    </tr>
                    <tr>
                        <td align="right" colspan="2">
                            <div location="okbutton" style="padding: 10px;"></div>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" style="padding: 7px; background-color: #4172AE"><span
                                style="font-family: FontAwesome; margin-right: 5px;">&#xf05a;</span> This information is in the layout.
                        <td>
                    </tr>
                </table>
            ]]>
        </templateContents>
        <textField id="username"
                   width="100%"/>
        <textField id="password"
                   width="100%"/>
        <button id="okbutton"
                caption="Login"/>
    </htmlBox>
  • htmlSanitizerEnabled 属性可以启用或禁用 HTML 清理。如果 htmlSanitizerEnabled 设置为 true,则 HtmlBoxLayout 内容会清理成安全的 HTML。

    示例:

    protected static final String UNSAFE_HTML = "<i>Jackdaws </i><u>love</u> <font size=\"javascript:alert(1)\" " +
                "color=\"moccasin\">my</font> " +
                "<font size=\"7\">big</font> <sup>sphinx</sup> " +
                "<font face=\"Verdana\">of</font> <span style=\"background-color: " +
                "red;\">quartz</span><svg/onload=alert(\"XSS\")>";
    
    @Inject
    private HtmlBoxLayout htmlBox;
    
    @Subscribe
    public void onInit(InitEvent event) {
        htmlBox.setHtmlSanitizerEnabled(true);
        htmlBox.setTemplateContents(UNSAFE_HTML);
    }

    htmlSanitizerEnabled 属性会覆盖全局的 cuba.web.htmlSanitizerEnabled 配置。