HTML::AutoFormのchecked問題が解決できた

未だにNanoAを触っているわけですが、ずっと悩んでいたchecked問題を、解決させることが出来ました。

リファレンスの真偽判定の仕方がまずかったようです。

HTML::AutoFormのtディレクトリにあるテストコードを単純にCGIに置き換えてレンダリングしたところ、checkedの設定が生きませんでした。

テストコードを見てみると、formのrenderではなく、fieldのrenderでテストをしていました。

ということは、formのrenderに問題がある、という事になります。

しかし、追いかけていったところ、結果的にはHTML/AutoForm/Field/InputCheckable.pmに問題がありました。

formのrenderは、ポストしているデータがあれば、そのデータを配列のリファレンスで渡すことにしています。

こうすることで、初期値(プログラムに書いている値)ではなく、ポストされた値でレンダリングされるようになります。

InputCheckable.pmのrenderをよく見ると、リファレンスを受けている変数を真偽判定して、真ならば配列のリファレンスとみなして処理しています。

しかし、ここに問題がありました。

初期値のcheckedが生きないのは、ここが必ず真で判定される(リファレンスは真です)からです。

初期値の(formのrenderで空の配列のリファレンスが渡された)場合は、偽で判定して欲しいので、一度配列に入れてから、その配列を真偽判定(配列が空ならば偽になります)してやれば問題ないと思います。

これで、初期値の場合も、ポストした場合も、問題なさそうでした。

元々のテストも問題なく通っています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Index: InputCheckable.pm
===================================================================
--- InputCheckable.pm	(リビジョン 38673)
+++ InputCheckable.pm	(作業コピー)
@@ -19,6 +19,8 @@
sub render {
my ($self, $values) = @_;
+    my @values;
+    @values = @$values if ref $values eq 'ARRAY';
my %base = (
%{$self->{parent}},
%$self,
@@ -35,8 +37,8 @@
{
type => $self->parent->type,
value => $self->{value},
-                ($values
-                     ? grep { $_ eq $self->{value} } @$values
+                (@values
+                     ? grep { $_ eq $self->{value} } @values
: $self->{checked})
? (checked => 'checked') : (),
},
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy