【问题标题】:How to easily create tables in the template toolkit View in perl/Catalyst如何在 perl/Catalyst 中的模板工具包视图中轻松创建表
【发布时间】:2011-09-05 20:21:59
【问题描述】:

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

【问题讨论】:

    标签: perl model-view-controller catalyst


    【解决方案1】:

    这是来自记忆,只是重复,所以认为它未经测试。这是一种自动遍历列和记录的简单方法。

    使用基于 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>
    

    【讨论】:

    • 谢谢阿什利。真正引发这个问题的是,对于我的 webApp,我使用 HTML::Dashboard 和 HTML::Table::FromDatabase 从 sql 查询生成表。然而,这个逻辑在模型中。为了与纯 MVC 设计保持一致,我试图将表示逻辑从我的域模型中分离出来,并从存储在存储中的数据结构(数组的引用数组)中生成视图(TT)中的表。我一直在寻找一种在 TT 中使用 HTML::Dashboard 或其他 HTML 工具的方法。 (希望这是有道理的)
    【解决方案2】:

    我将数据结构(作为哈希数组)传递给 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>
    

    【讨论】:

    • 谢谢比尔,我使用了您显示的格式。真正引发这个问题的是,对于我的 webApp,我使用 HTML::Dashboard 和 HTML::Table::FromDatabase 从 sql 查询生成表。然而,这个逻辑在模型中。为了与纯 MVC 设计保持一致,我试图将表示逻辑从我的域模型中分离出来,并从存储在存储中的数据结构(数组的引用数组)中生成视图(TT)中的表。我正在寻找一种在 TT 中使用 HTML::Dashboard 或其他 HTML 工具的方法。 (希望这是有道理的)
    【解决方案3】:

    好的 ol' CGI.pm 使这不是太困难,但要获得任何真正的帮助,您将不得不展示您的数据结构是什么样的。

    一个潜在的问题是您的数据可能在本质上不提供列顺序的哈希中(尽管数据库纯粹主义者会告诉您 HTML::Table::FromDatabase 是邪恶的,不利于鼓励 select * 并假设列顺序是有意义的)。

    HTML::Table::FromDatabase 本身使用 HTML::Table;您可能会看看这是否满足您的需求。

    【讨论】:

    • 好吧,公平地说,查询是由用户预先执行的,所以他们可以很容易地SELECT col1, col2,... 而不仅仅是SELECT * 来定义顺序。顾名思义,HTML::Table::FromDatabase 获取查询结果并将它们转换为 HTML 表。文档中的示例确实将 SELECT * 说明为一个简单的示例,当然 - 也许我应该改变它以让纯粹主义者更快乐;)
    猜你喜欢
    • 2011-08-19
    • 2012-05-23
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多