Как я могу удалить переменную в Template Toolkit? - PullRequest
4 голосов
/ 29 сентября 2011

Глядя на Template :: Manual :: VMethods раздел руководства Template Toolkit. Я не вижу никакого способа сделать это. Также присвоение undef переменной не работает - variable.defined возвращает true после факта.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Я посмотрел на 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;
}

TT process() вызывается с копиями переменных в $c->stash, так почему нам нужно связываться с $c->stash, чтобы избавиться от локальной копии?Возможно, мы этого не делаем.

Более того, TT define() VMethod, как и другие методы, похоже, был создан для списков.Скаляры автоматически переводятся в список из одного элемента, когда к ним вызывается VMethod: возможно, по этой причине тест IF всегда возвращает true.

Я провел несколько тестов с переменными, содержащими ссылки на DBIx::Class::ResultSet объекты, и этоКажется, работает во время тестирования для переменной:

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

Первая строка удаляет переменную, а вторая выполняет правильный тест.

UPDATE

Если вы можете добавить флаг 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 %]
2 голосов
/ 29 сентября 2011

Что ж, погуглив "delete variable" site:mail.template-toolkit.org/pipermail/templates/ поставил вопрос [Шаблоны] Могу ли я «УДАЛИТЬ some_var»? от Фелипе Гаспера с двумя ответами от Петра Данихлика.Петр предлагает:

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