2

フォームにチェックボックスの配列を作成する必要があります。私が理解しているように、(type => 'Repeatable')フィールドを使用する必要があります。フォーム クラスにフィールドを作成しました。

has_field 'userroles'       => ( type => 'Repeatable');
has_field 'userroles.idx'   => ( type => 'Checkbox');  

コンストラクターでロール ID を渡しました。

 my $form = MyApp::Form::adduser->new( 
  ml_labels         => $c->stash->{labels},
  userlang          => $c->stash->{userlang}, 
  langs_available   => [map{+{value => $_->id, label => $_->id}}@all_langs],
  userroles => [
   { idx => 5 },
   { idx => 6 },
   { idx => 7 }

  ]
 );

テンプレートでこのフィールドをレンダリングしてみてください

 <div style="float:left">
  [% form.field('userroles').render %]
 </div>

しかし、私は以下しか得られませんでした:

 <div style="float:left">
  <div class="hfh-repinst">
  <div>
 <label for="userroles.0.idx">Idx</label>
 <label class="checkbox" for="userroles.0.idx"><input type="checkbox" name="userroles.0.idx" id="userroles.0.idx" value="1" />

 </label>
 </div>

「5」、「6」、「7」という名前の 3 つのチェックボックスを取得するにはどうすればよいですか? H::FH のドキュメントに答えが見つかりません。が含まれていると思われるページでも

4

1 に答える 1

2

問題は、コンストラクターからのパラメーターが「has_field」に直接マップされず、「has」にのみマップされることだと思います。したがって、ユーザーロールを中間変数に渡す必要があります

 has 'userroles'            => ( is => 'rw' );

 has_field 'roles'          => ( type => 'Repeatable');
 has_field 'roles.idx'      => ( type => 'Text');
 has_field 'roles.value'    => ( type => 'Text');

次に、フォーム クラスでフィールドを初期化します。

 sub init_object{
   my $self = shift;
   my $roles = [];
   foreach my $role (@{$self->userroles}){
     push(@$roles, $role);
   }
   return { roles => $roles }
 }

TT:

 [% form.field('roles').render %]

コンストラクタ:

    ...
 userroles => [
+{ idx => 5, value => 15 },
+{ idx => 6, value => 15 },
+{ idx => 7, value => 15 }
 ]
   ...

結果:

 <div class="hfh-repinst">
  <div>
   <label for="roles.0.idx">Idx</label>
   <input type="text" name="roles.0.idx" id="roles.0.idx" value="5" />
  </div>
  <div>
   <label for="roles.0.value">Value</label>
   <input type="text" name="roles.0.value" id="roles.0.value" value="15" />
  </div>
 </div>
<div class="hfh-repinst">
 <div>
  <label for="roles.1.idx">Idx</label>
  <input type="text" name="roles.1.idx" id="roles.1.idx" value="6" />
 </div>
 <div>
  <label for="roles.1.value">Value</label>
  <input type="text" name="roles.1.value" id="roles.1.value" value="15" />
 </div>
</div>
于 2012-12-21T10:42:31.320 に答える