问题描述
||
我正在使用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>