2011-09-29 86 views

回答

2

那么,Google搜索"delete variable" site:mail.template-toolkit.org/pipermail/templates/带来了来自Felipe Gasper的问题[Templates] Can I “DELETE some_var”?与Petr Danihlik的两个答案。切赫表明:

[% SET foo = 1 %] 
[% IF foo.defined %] defined1 [% END %] 
[% PERL %] 
delete($stash->{foo}); 
[% END %] 
[% IF foo.defined %] defined2 [% END %] 
+0

有趣。当我们在TT模板中使用来自存储(Catalyst?)的引用时,我们编写'[%var%]'而不是'[%stash.var%]''。我想知道你是否已经尝试搞乱'[%stash.var%]''。 –

+0

以这种方式引用变量不会带来任何新的可能性,是吗?我无法使用PERL指令,如我找到的答案所示,因为我使用的TT处理器不允许内联Perl。 –

2

我看着Catalyst::View:TTcode,以了解变量的上下文。

下面的子过程,这是我总结了一点点做渲染工作:

sub render { 
    my ($self, $c, $template, $args) = @_; 
    # [...] 
    my $output; # Template rendering will end here 
    # Variables interpolated by TT process() are passed inside an hashref 
    # as copies. 
    my $vars = { 
     (ref $args eq 'HASH' ? %$args : %{ $c->stash() }), 
     $self->template_vars($c) 
    }; 
    # [...] 
    unless ($self->template->process($template, $vars, \$output)) { 
     # [ ... ] 
    } 
    # [ ... ] 
    return $output; 
} 

TT process()被称为与$c->stash变量的副本,所以我们为什么要惹$c->stash摆脱本地副本?也许我们没有。

此外,TT define()与其他方法一样,VM方法似乎是为列表构建的。当调用VM方法时,标量会自动提升为单元素列表:也许因为这个原因,IF测试总是返回true。

我做了一些测试用的变量承载引用DBIx::Class::ResultSet对象,这似乎在测试一个变量的工作:

[%- resultset_rs = undef %] 
[%- IF (resultset_rs) %] 
    <h3>defined</h3> 
[%- END %] 

第一行删除变量,第二个做适当的测试。

UPDATE

如果你可以在催化剂视图中添加EVAL_PERL => 1标志,里面config()变元的,

__PACKAGE__->config({ 
    # ... 
    EVAL_PERL => 1 
}); 

,那么你可以使用模板[% RAWPERL %]指令,它给你的Template::Context直接访问对象:那么你可以删除瓦尔和.defined() VMethod做正确的事情。

[%- RAWPERL %] 
    delete $context->stash->{ 'resultset_rs' }; 
[%- END %] 
[%- IF (resultset_rs.defined) %] 
    <h3>defined: [% resultset_rs %]<h3> 
[%- ELSE %] 
    <h3>undefined: [% resultset_rs %]<h3> 
[%- END %] 
+0

什么样的变量是你想要undef?一个数组,一个标量? –

+0

标量是:) –

+0

它不工作?你能以意想不到的方式发布一部分代码吗? –

相关问题