2012-12-03 26 views
1

我需要在表單中創建複選框數組。 據我所知我必須使用(type => 'Repeatable')字段。 形式類我創建領域:如何在HTML中創建多個字段:: FormHandler

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'的三個複選框? 我在H :: FH的文檔中找不到答案。即使在似乎包含example

回答

1

我認爲問題是來自構造函數的參數不直接映射到「has_field」,而是僅映射到「has」。所以,我需要我的UserRole傳遞給一些中間變量

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> 
相關問題