Tim*_*mmy 2 perl template-toolkit rose-db-object
我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
模板调用只是:
[% Namespace.get_unique_uid_tt( data.users ) %]
Run Code Online (Sandbox Code Playgroud)
"data"是一个RDB对象,用户是其关系之一.我已经验证".users"直接在Perl中返回一个列表,无论该关系是否有一个或多个元素.
但是,TT似乎返回单元素列表的元素,同时正确返回多个元素的列表.
我查了一下,发现你可以用".list"强制列表上下文:
[% Namespace.get_unique_uid_tt( data.users.list ) %]
Run Code Online (Sandbox Code Playgroud)
对于单元素列表,这不起作用,因为Data :: Dumper显示:
$VAR1 = [
{
'value' => 1,
'key' => '__xrdbopriv_in_db'
},
{
'value' => bless(
... snip ...
),
'key' => 'db'
},
{
'value' => '1',
'key' => 'id'
}
];
Run Code Online (Sandbox Code Playgroud)
而不是预期的
$VAR1 = [
bless( {
'__xrdbopriv_in_db' => 1,
'id' => '1',
'db' => ... snip ...
}, 'DataClass' )
];
Run Code Online (Sandbox Code Playgroud)
在TT中有没有其他简单的方法来获取对象列表,即使在单元素列表上也是如此?(一种方法是重写函数,但不重写函数)
在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];
};
Run Code Online (Sandbox Code Playgroud)
我将此添加到我的上下文对象(相同的想法):
$context->define_vmethod(
'list',
'as_list',
sub {
return ref( $_[0] ) eq 'ARRAY' ? shift : [shift];
},
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |