如何在perl / Catalyst中的模板工具包视图中轻松创建表

问题描述

|| 我正在使用Perl的Catalyst框架开发一个应用程序。 在试图将表示逻辑排除在我的模型之外,我正在寻找一种在VIEW(模板工具包)中从给定数据结构生成HTML表的方法。 我目前使用HTML :: Table :: FromDatabase从SQL查询生成HTML表 但这当前在模型中。我希望将表示逻辑隔离到View,而不是将其包含在模型中。 关于此的任何建议将有所帮助     

解决方法

        这是从记忆中获得的,只是轻描淡写,所以请认为它未经测试。这是一种自动迭代列和记录的简单方法。 假设使用基于DBIx :: Class的模型这样的子对象–
sub some_action : Local Args(0) {
    my ( $self,$c ) = @_;
    my $rs = $c->model(\"SomeTable\")->search({},{rows => 10});
    $c->stash( some_rs => $rs );
}
然后是匹配的模板
[% records = some_rs.all %]
[% RETURN UNLESS records.size %]
[% columns = records.0.columns %]
<table>
  <tr>
  [% FOR column IN columns %]
    <th>[% column | ucfirst | html %]</th>
  [% END %]
  </tr>

  [% FOR item IN records %]
  <tr>
    [% FOR column IN columns %]
      <td>[% item.${column} | html %]</td>
    [% END %]
  </tr>
  [% END %]
</table>
    ,        好的CGI.pm使得这不太困难,但是要获得任何真正的帮助,您将不得不展示数据结构的样子。 一个潜在的问题是,您的数据可能处于哈希形式,而哈希本质上不提供列顺序(尽管数据库纯粹主义者会告诉您HTML :: Table :: FromDatabase是邪恶的,不利于鼓励
select *
并假设列顺序有意义)。 HTML :: Table :: FromDatabase本身使用HTML :: Table;您可能会看到这是否满足您的需求。     ,        我将数据结构(作为哈希数组)传递给TT,仅使用TT逻辑来构建表,并使用CSS类来控制表的外观。 模板的简化示例:
  <table class=\"ixTable\">
    [% FOREACH listing = listings %]
    <tr class=\"ixRow\">
      <td class=\"ixAddress\">[% listing.address %]</a></td>
      <td class=\"ixPrice\">[% listing.listprice %]</td>
      <td class=\"ixSqFt\">[% listing.sqft %]</td>
    </tr>
    [% END %]
  </table>