4

Template Toolkit マニュアルのTemplate::Manual::VMethodsセクションを見ると、これを行うメソッドが見当たりません。またundef、変数への代入は機能しません -variable.defined事後に true を返します。

4

2 に答える 2

2

さて、グーグル"delete variable" site:mail.template-toolkit.org/pipermail/templates/は質問をもたらしました[Templates] Can I “DELETE some_var”? Felipe Gasper から、Petr Danihlik からの 2 つの回答とともに。ペトルは次のように提案します。

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

変数のコンテキストを理解するために、Catalyst::View:TT codeを調べました。

少し要約した次のサブルーチンは、レンダリング作業を行います。

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()は の変数のコピーで呼び出されますが$c->stash、なぜ$c->stashローカル コピーを削除する必要があるのでしょうか? 多分私たちはしません。

さらに、TT define()VMethod は、他のメソッドと同様に、リスト用に構築されているようです。VMethod が呼び出されると、スカラーは単一の要素リストに自動昇格されます。おそらくこの理由で、IF テストは常に true を返します。

DBIx::Class::ResultSetオブジェクトへの参照を運ぶ変数を使用していくつかのテストを行いましたが、これは変数のテスト中に機能するようです:

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

1 行目で変数を削除し、2 行目で適切なテストを行います。

アップデート

EVAL_PERL => 1Catalyst View の引数内にフラグを追加できる場合はconfig()

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

次に、テンプレートでディレクティブを使用して、オブジェクト[% RAWPERL %]に直接アクセスできます。次に、vars を削除すると、 VMethod が正しいことを実行します。Template::Context.defined()

[%- 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 に答える