【问题标题】:How do I use HTML Template to display nested loops如何使用 HTML 模板显示嵌套循环
【发布时间】:2013-10-06 18:02:02
【问题描述】:

我正在尝试使用 tmpl_loop 设置嵌套循环,但我对 HTML::Template 模块的经验很少。

我想要做的布局是这样的:

名称 开始 结束 狗 04-02-1996 06-19-2011 品种:梗犬性别:男 颜色:棕色眼睛颜色:绿色 重量:10 磅属性:bla bla 名称 开始 结束 狗 03-04-1985 06-01-1988 品种:猎犬性别:女 颜色:黑色眼睛颜色:绿色 重量:50 磅属性:bla bla

等等……

狗的数量可能会有所不同,它可能有也可能没有附加信息,但如果有,则必须显示所有字段。

这是我正确显示水平信息的块。

<table width="100%">
<tr>
    <tmpl_loop name=labels>
    <td class="label"> <TMPL_VAR label>: </td> 
    </tmpl_loop>
</tr>
<tmpl_loop name=values>
    <tr>
        <tmpl_loop name=values>
        <td><TMPL_VAR value ></td>
        </tmpl_loop>
    </tr>
</tmpl_loop>
</table>

但是如何修改 HTML 模板以在示例显示中显示信息?

另外,对应的 Perl 数据结构是什么样的?

谢谢。

【问题讨论】:

    标签: html perl templates


    【解决方案1】:

    在您的情况下,您不需要嵌套循环。

    将您的模板文件更改为:

    <table>
        <TMPL_LOOP dogs>
            <tr><td>&nbsp;</td><td></td><td></td><td></td><td></td><td></td></tr>
            <tr>
                <td></td><td>Name</td>
                <td></td><td>Start</td>
                <td></td><td>End</td>
            </tr>
            <tr>
                <td><TMPL_VAR ldogname></td><td><TMPL_VAR dogname></td>
                <td><TMPL_VAR lstart></td><td><TMPL_VAR start></td>
                <td><TMPL_VAR lend></td><td><TMPL_VAR end></td>
            </tr>
            <tr>
                <td><TMPL_VAR lbreed></td><td><TMPL_VAR breed></td>
                <td><TMPL_VAR lsex></td><td><TMPL_VAR sex></td>
                <td><TMPL_VAR lcolor></td><td><TMPL_VAR color></td>
            </tr>
            <tr>
                <td><TMPL_VAR leye></td><td><TMPL_VAR eye></td>
                <td><TMPL_VAR lweight></td><td><TMPL_VAR weight></td>
                <td><TMPL_VAR lattr></td><td><TMPL_VAR attr></td>
            </tr>
        </TMPL_LOOP>
    </table>
    

    和你的代码:

    #!/usr/bin/perl
    use warnings;
    use strict;
    use HTML::Template;
    
    my $template=HTML::Template->new(filename=>'template.txt');
    my @dogs=( #dogs data
        {dogname=>'Dog',start=>'04-02-1996',end=>'06-19-2011',breed=>'Terrier',sex=>'Male',color=>'Brown',eye=>'Green',weight=>'10 Pounds',attr=>'bla bla'},
        {dogname=>'Dog',start=>'03-04-1985',end=>'06-01-1988',breed=>'Retriever',sex=>'Female',color=>'Black',eye=>'Green',weight=>'50 Pounds',attr=>'bla bla'},
    );
    my %labels=(
        ldogname=>'',
        lstart=>'',
        lend=>'',
        lbreed=>'Breed: ',
        lsex=>'Sex: ',
        lcolor=>'Color: ',
        leye=>'Eye Color: ',
        lweight=>'Weight: ',
        lattr=>'Attribute: '
    );
    for my $dog (@dogs) { #mix labels and values
        while (my ($k,$v)=each %labels) {
            $dog->{$k}=$v;
        }
    }
    $template->param(dogs=>\@dogs);
    print $template->output;
    

    你会得到想要的输出。

    但要回答您的问题,您可以查看嵌套循环的一些示例:http://www.perlmonks.org/?node_id=770278http://www.perlmonks.org/?node_id=193367(谷歌返回更多结果)

    【讨论】:

    • 这非常接近我想要的。不过有几件事。我的例子有点不对劲。我实际上希望行标题(名称、开始、结束)位于每一行中。所以第 1 行是标题,第 2 行是值。另一件事是每个类别标题,应该在自己的单元格中,即品种,性别等。所以它是 Breed Terrier
    • 我试图重现你的例子!我会根据您的新要求更新我的答案,之后如果您需要对 HTML 进行其他更改,您可以自己解决。
    • 我稍微调整了 HTML 的格式,但这个版本完全符合我的需要,所以谢谢!我将尝试以我计划将此模板用于从数据库中检索数据的确切方式应用它。我希望我不会有任何问题。
    • 好的,所以我把它装进了我需要做的事情中,我已经完成了。现在在这个版本中,我拥有模板中标识的所有“次要”字段,品种、颜色、性别。如果我不知道有什么或有多少次要字段并且想要遍历标签/值数组怎么办?这就是为什么我认为我需要嵌套循环。
    • 当你有嵌套循环时,我相信你不能在内循环中打印外循环的值。因此,您应该更改所需的 HTML 输出。例如,您可以为每只狗创建一个 2xn 表(伪代码):&lt;TMPL_LOOP dogs&gt;&lt;table&gt;&lt;TMPL_LOOP labels&gt;&lt;tr&gt;&lt;TMPL_VAR labels&gt;&lt;/tr&gt;&lt;/TMPL_LOOP&gt;&lt;tr&gt;&lt;TMPL_VAR dogvalues&gt;&lt;/tr&gt;&lt;table&gt;&lt;/TMPL_LOOP&gt;
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2012-10-25
    相关资源
    最近更新 更多