4

查看Template Toolkit 手册的Template::Manual::VMethods部分,我没有看到任何方法这样做。分配undef给变量也不起作用 -variable.defined事后返回 true。

4

2 回答 2

2

我查看了Catalyst::View:TT 代码,以了解变量上下文。

下面的子程序,我总结了一点渲染工作:

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;
}

TTprocess()是用 in 中的变量副本调用的$c->stash,那么为什么我们需要弄乱$c->stash以摆脱本地副本呢?也许我们没有。

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

我对带有DBIx::Class::ResultSet对象引用的变量进行了一些测试,这在测试变量时似乎有效:

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

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

更新

如果您可以EVAL_PERL => 1在 Catalyst 视图中添加标志,在参数内config()

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

然后您可以[% RAWPERL %]在模板中使用指令,这使您可以直接访问Template::Context对象:然后您可以删除 vars 并且.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 %]
于 2011-09-29T13:40:52.023 回答
2

好吧,谷歌搜索"delete variable" site:mail.template-toolkit.org/pipermail/templates/带来了问题[模板] 我可以“删除 some_var”吗?来自 Felipe Gasper 和 Petr Danihlik 的两个答案。彼得建议:

[% SET foo = 1 %]
[% IF foo.defined %] defined1 [% END %]
[% PERL %]
delete($stash->{foo});
[% END %]
[% IF foo.defined %] defined2 [% END %]
于 2011-09-29T10:18:56.533 回答