Как создать несколько полей в HTML::FormHandler
Мне нужно создать массив флажков в моей форме. Как я понимаю, я должен использовать (type => 'Repeatable')
поле. Я создал поля в классе формы:
has_field 'userroles' => ( type => 'Repeatable');
has_field 'userroles.idx' => ( type => 'Checkbox');
Я передал идентификаторы ролей в конструкторе:
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"? Я не могу найти ответ в документации к H::FH. Даже на странице, которая, кажется, содержит пример
1 ответ
Я думаю, что проблема в том, что параметры из конструктора не отображаются напрямую в 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>