2

我正在使用该模块HTML::Template创建一个像这样的格式化表(使用 array @rows):

my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(ROWS => \@rows); 
print $tmpl->output;

__DATA__ 
<table border="1"> 
<TMPL_LOOP ROWS> 
  <tr> 
  <TMPL_LOOP CELLS> 
    <td><TMPL_VAR CELL></td> 
  </TMPL_LOOP>
  </tr> 
</TMPL_LOOP>
</table>

但是,我现在想创建表中某些元素的超链接。元素链接到的地址取决于该单元格的文本以及表格的列。 示例: 如果一行有元素Home, Office, Travel, Play,那么我希望它们链接到www.mywebsite.com/Homewww.mywebsite2.com/Office并且www.mywebsite3.com/Play没有超链接Travel。如何在 HTML::Template 创建的表中创建此类超链接?

4

1 回答 1

4

编辑:根据更新的问题和问题作者的评论重写了使用Template::Toolkit的答案。

# Your app sets up whatever data structure it wants to pass to the tempalte, for example,
my @rows = [
    [ # cells in row #1
        { url => 'www.mywebsite.com/Home', label => 'Home' },
        { url => 'www.mywebsite2.com/Office', label => 'Office' },
    ],
    [ # cells in row #2
        { url => 'www.mywebsite3.com/Play', label => 'Play' },
        { label => 'Travel' },
    ],
];

# No need to print, prints to STDOUT automatically by default
my $tmpl = Template->new;
$tmpl->process(\*DATA, { rows => \@rows })
    || die $tmpl->error();

__DATA__ 
<table border="1">
[% FOR row IN rows %] 
  <tr> 
  [% FOR cell IN row %] 
    <td>
    [% IF cell.url %]
      <a href="http://[% cell.url | url %]">[% cell.label | html %]</a>
    [% ELSE %]
      [% cell.label | html %]
    [% END %]
    </td> 
  [% END %]
  </tr> 
[% END %]
</table>

Template::Toolkit 具有许多与 Perl 相同的功能(如果启用 Perl 块,实际上完全相同,但我不建议这样做)。

在每个[% %]您放入指令的内部。如果没有指令并且没有使用 执行赋值=,则该块被视为变量查找,并且传递到模板的值被插入到那里的文本中。在进行变量查找时,您可以使用句点来遍历整个复杂的数据结构以分隔查找。例如,

[% rows.0.0.label %]

在上面的示例中插入,将输出“Home”。

上面显示的| urland| html符号添加了过滤器,这些过滤器将清理输出以确保[% %]块内的值输出为正确的 URL 或 HTML(通常避免 XSS 和其他输出格式错误)。

Template Toolkit 有时对它的工作方式有点模糊和不精确,甚至不如 Perl 严格,所以有时你必须小心一点。这也可能是一个性能问题,特别是如果您process()在应用程序中调用很多次(将模板嵌入另一个往往会更快一些)。但是,它在大多数模板问题上都做得相当好,如果您需要与网页设计师合作,界面也不会太吓人。

如果您使用 Template::Toolkit,我强烈建议您通读本教程以了解它。

原答案:

Lone Shepherd 的评论是答案:

我正在使用该模块HTML::Template创建一个像这样的格式化表(使用 array @rows):

my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(ROWS => \@rows); 
print $tmpl->output;

__DATA__ 
<table border="1"> 
<TMPL_LOOP ROWS> 
  <tr> 
  <TMPL_LOOP CELLS> 
    <td><a href="http://www.mywebsite.com/<TMPL_VAR CELL ESCAPE=HTML>"><TMPL_VAR CELL ESCAPE=HTML></a></td> 
  </TMPL_LOOP>
  </tr> 
</TMPL_LOOP>
</table>

只需为您的超链接添加 HTML。根据HTML::Template的文档,您可以将<TMPL_VAR ...>位放在属性中。

作为旁注,添加ESCAPE=HTML也是一个好主意,除非你确定你已经清理了你的输出(防止像跨站点脚本攻击你的 web 应用程序)。

于 2012-07-28T19:26:37.797 回答