【问题标题】:How can I force list context in Template Toolkit with RDBO?如何使用 RDBO 在 Template Toolkit 中强制列表上下文?
【发布时间】:2011-01-02 06:08:57
【问题描述】:

我有一个 TT 插件,可以处理微不足道的唯一 ID:

sub get_unique_uid_tt {
  my ( $classname, $o ) = @_;

  my %h;

  foreach my $item ( @{$o} ) {
    unless ( exists $h{ $item->id } ) {
      $h{ $item->id } = 1;
    }
  }

  return keys %h;
}

模板调用很简单:

[% Namespace.get_unique_uid_tt( data.users ) %]

并且“数据”是一个 RDB 对象,用户是它的关系之一。我已经验证了“.users”在 Perl 中直接返回一个列表,无论关系是一个还是多个元素。

但是,似乎 TT 返回单元素列表的元素,而正确返回多个元素的列表。

我查了一下,发现你可以用“.list”强制列表上下文:

[% Namespace.get_unique_uid_tt( data.users.list ) %]

这不适用于单元素列表,正如 Data::Dumper 所揭示的那样:

$VAR1 = [
      {
        'value' => 1,
        'key' => '__xrdbopriv_in_db'
      },
      {
        'value' => bless(
         ... snip ...
         ),
        'key' => 'db'
      },
      {
        'value' => '1',
        'key' => 'id'
      }
];

而不是预期的

 $VAR1 = [
     bless( {
             '__xrdbopriv_in_db' => 1,
             'id' => '1',
             'db' => ... snip ...
     }, 'DataClass' )
 ];

在 TT 中是否有任何其他简单的方法来获取对象列表,即使是在单元素列表上? (一种方法是重写函数,但最好不要重写)

【问题讨论】:

    标签: perl template-toolkit rose-db-object


    【解决方案1】:

    在 TT 邮件列表中找到这个:

    http://lists.template-toolkit.org/pipermail/templates/2009-December/011061.html

    似乎 TT 的“.list”通常无法将对象转换为列表,而不仅仅是 RDBO。

    建议是做一个vmethod:

    $Template::Stash::LIST_OPS->{ as_list } = sub {
       return ref( $_[0] ) eq 'ARRAY' ? shift : [shift];
    };
    

    我将此添加到我的上下文对象中(相同的想法):

    $context->define_vmethod(
        'list',
        'as_list',
        sub {
            return ref( $_[0] ) eq 'ARRAY' ? shift : [shift];
        },
    );
    

    【讨论】:

      【解决方案2】:

      这不是你想要的,但你能改变 TT 插件来处理列表和单个项目吗?

      sub get_unique_uid_tt {
        my ( $classname, $o ) = @_;
      
        my %h;
      
        if (ref $o eq 'ARRAY') {
          foreach my $item ( @{$o} ) {
            unless ( exists $h{ $item->id } ) {
              $h{ $item->id } = 1;
            }
          }
        }
        else {
            return ($o->id);
        }
      
        return keys %h;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-12
        • 2011-10-25
        • 2013-06-12
        • 2010-09-23
        • 2011-01-18
        • 2010-09-27
        • 2017-06-02
        • 2015-01-09
        • 2011-11-12
        相关资源
        最近更新 更多