TTのfailsafe
[% WHILE (foo = foo.next) %]
とか書くと、
undef error - WHILE loop terminated (> 1000 iterations)
とか怒られた。
TT見ると
$WHILE_MAX = 1000 unless defined $WHILE_MAX;...
sub while {
my ($class, $expr, $block) = @_;
$block = pad($block, 2) if $PRETTY;return <
$WHILE_MAX iterations)\\n"
unless \$failsafe;
};
EOF
}
こんな感じで無限ループを抑止してる。
なので、
local $Template::Directive::WHILE_MAX = $it->count+1;
こんな感じで回避。むむむきもい。
+1
ってのがきもさ倍増。
-
- -
やっぱなんかうまく動かん。。
Class::DBI::Plugin::Iterator#nextってレコードがなくなったら
my $use = $self->{_data}[$index];
unless ($use) {
$self->{_count} = $self->{_place} - 1 unless defined $self->{_count};
$self->reset;
return;
}
と、resetしてundef返してるけど、
なんかTTのWHILEでやると
何度も何度もループして$WHILE_MAXまで回る。
$WHILE_MAXを上書きしたときだけおこるっぽいかもかも。
はまったので取り合えずイテレータやめで対応。
かなしいorz...
なんでだろ。。
試したコード
sub hoge {
my $self = shift;$it = Project::Data::User->retrieve_all;
$self->tmpl->param( users => $it );
local $Template::Directive::WHILE_MAX = $it->count+1;
}
TT側は
[% WHILE (user = users.next) %]