2

ここでは HTML::FormHanlder を使用しています。ラジオボタンをレンダリングして(このメソッドを使用して)別の出力を得ようとしています。フィールド宣言は次のようになります。

has_field 'xxx' => ( type => 'Select', widget => 'RadioGroup', build_label_method => \&build_label );

  sub build_label {
    my $self = shift;
    return $self->name;
}

問題は、<label>ヘッダーをグループ化する要素にのみあることです。

<label for="xxx">Lorem ipsum</label>

だからそれはそれを変更します。

ラジオボタンは変更されません<input type="radio" name="xxx" id="xxx" value="2"/> I'm not changed

当然のことながら、自動的にレンダリングされた「私は変更されていません」(この場合)の後に続くテキストを変更する方法を考えています<input/>

より明確にするための例を次に示します。

<label for="0.xxx">This is the only part that gets changed with sub build_label</label>
<label class="radio" for="0.xxx.0">
    <input type="radio" name="0.xxx" id="0.xxx.0" value="2"/>
    How to change rendering method of this part?
</label>
<label class="radio" for="0.xxx.1">
<input type="radio" name="0.xxx" id="0.xxx.1" value="1"/>
    And this one?
</label>
4

1 に答える 1

2

解決策は、ラジオ グループ オプションのラベルを変更する理由によって異なります。HTML::FormHandler::Widget::Field::RadioGroup のコードを見ると、フィールドがどのようにレンダリングされるかを読み取ることができます。

通常、必要なラベルを使用してオプション リストを作成します。フィールドに options_method を指定できます。

has_field 'xxx' => ( type => 'Select', widget => 'RadioGroup', options_method => \&build_xxx_options );
sub build_xxx_options {
    my $self = shift; # $self is the field
    <build and return options with desired labels>;
}

ラベルをローカライズしたい場合は、適切な翻訳ファイルを maketext に提供すると自動的にローカライズされます。文字列をローカライズしたくない場合でも、ラベルがローカライズされているという事実 (my $label = $self->_localize($option_label);) を利用して、フィールドのローカライズ メソッドを提供できます。 'localize_meth' をメソッド参照に設定:

has_field 'xxx' => ( type => 'Select', widget => 'RadioGroup', localize_meth => \&fix_label );
sub fix_label {
    my ( $self, $label ) = @_; # $self is the field
    if ( $label eq '...' ) {
        return '....';
    }
    return $label;
}
于 2012-12-25T03:18:21.467 に答える