Ronald J Kimball wrote:
The attached patch allows more control over reversing the order of labels and fields, which I've found to be very useful. (Currently, the only option is reverse_multi, which is only for fields within a multi block.)

I just noticed I made a mistake in the documentation with that patch - one instance of "reverse" that should have been "reverse_single". A new patch is attached.

Ronald
diff -rN -x '*~' -u HTML-FormFu-0.05000/MANIFEST 
HTML-FormFu-0.05000.reverse/MANIFEST
--- HTML-FormFu-0.05000/MANIFEST        2009-05-26 10:22:20.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/MANIFEST        2009-07-02 20:01:23.000000000 
+0000
@@ -437,6 +437,7 @@
 t/elements/repeatable_counter_name.t
 t/elements/repeatable_counter_name.yml
 t/elements/reset.t
+t/elements/reverse_single.t
 t/elements/select.t
 t/elements/select_deflator_default.t
 t/elements/select_empty_first_label.t
diff -rN -x '*~' -u 
HTML-FormFu-0.05000/lib/HTML/FormFu/Element/Checkboxgroup.pm 
HTML-FormFu-0.05000.reverse/lib/HTML/FormFu/Element/Checkboxgroup.pm
--- HTML-FormFu-0.05000/lib/HTML/FormFu/Element/Checkboxgroup.pm        
2009-04-15 08:13:51.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/lib/HTML/FormFu/Element/Checkboxgroup.pm        
2009-07-02 19:32:33.000000000 +0000
@@ -8,7 +8,7 @@
 use HTML::FormFu::Util qw( append_xml_attribute process_attrs );
 use List::MoreUtils qw( any );
 
-__PACKAGE__->mk_item_accessors(qw/ input_type /);
+__PACKAGE__->mk_item_accessors(qw/ reverse_group input_type /);
 
 sub new {
     my $self = shift->next::method(@_);
@@ -18,6 +18,7 @@
     $self->label_tag('legend');
     $self->container_tag('fieldset');
     $self->multi_value(1);
+    $self->reverse_group(1);
     $self->input_type('checkbox');
 
     return $self;
@@ -112,6 +113,7 @@
 
     my $render = $self->next::method( {
             field_filename => $self->field_filename,
+            reverse_group  => $self->reverse_group,
             input_type     => $self->input_type,
             $args ? %$args : (),
         } );
@@ -140,38 +142,63 @@
 
             for my $item ( @{ $option->{group} } ) {
                 $html .= sprintf
-                    qq{<span%s>\n<input name="%s" type="%s" value="%s"%s />},
-                    process_attrs( $item->{container_attributes} ),
+                    "<span%s>\n",
+                    process_attrs( $item->{container_attributes} );
+
+                my $label = sprintf
+                    "<label%s>%s</label>\n",
+                    process_attrs( $item->{label_attributes} ),
+                    $item->{label},
+                    ;
+
+                my $input = sprintf
+                    qq{<input name="%s" type="%s" value="%s"%s />\n},
                     $render->{nested_name},
                     $render->{input_type},
                     $item->{value},
                     process_attrs( $item->{attributes} ),
                     ;
 
-                $html .= sprintf
-                    "\n<label%s>%s</label>\n</span>\n",
-                    process_attrs( $item->{label_attributes} ),
-                    $item->{label},
-                    ;
+                if ( $render->{reverse_group} ) {
+                    $html .= $input . $label;
+                }
+                else {
+                    $html .= $label . $input;
+                }
+
+                $html .= "</span>\n";
             }
 
             $html .= "</span>\n";
         }
         else {
             $html .= sprintf
-                qq{<span%s>\n<input name="%s" type="%s" value="%s"%s />},
-                process_attrs( $option->{container_attributes} ),
+                "<span%s>\n",
+                process_attrs( $option->{container_attributes} )
+                ;
+
+            my $label = sprintf
+                "<label%s>%s</label>\n",
+                process_attrs( $option->{label_attributes} ),
+                $option->{label},
+                ;
+
+            my $input = sprintf
+                qq{<input name="%s" type="%s" value="%s"%s />\n},
                 $render->{nested_name},
                 $render->{input_type},
                 $option->{value},
                 process_attrs( $option->{attributes} ),
                 ;
 
-            $html .= sprintf
-                "\n<label%s>%s</label>\n</span>\n",
-                process_attrs( $option->{label_attributes} ),
-                $option->{label},
-                ;
+            if ( $render->{reverse_group} ) {
+                $html .= $input . $label;
+            }
+            else {
+                $html .= $label . $input;
+            }
+
+            $html .= "</span>\n";
         }
     }
 
@@ -235,6 +262,18 @@
       name: foo
       auto_id: "%n_%c"
 
+=head2 reverse_group
+
+If true, then the label for each checkbox in the checkbox group should
+be rendered to the right of the field control.  Otherwise, the label
+is rendered to the left of the field control.
+
+The default value is C<true>, causing each label to be rendered to the
+right of its field control (or to be explicit: the markup for the
+label comes after the field control in the source).
+
+Default Value: C<true>
+
 =head1 SEE ALSO
 
 Is a sub-class of, and inherits methods from 
diff -rN -x '*~' -u HTML-FormFu-0.05000/lib/HTML/FormFu/Element/Radiogroup.pm 
HTML-FormFu-0.05000.reverse/lib/HTML/FormFu/Element/Radiogroup.pm
--- HTML-FormFu-0.05000/lib/HTML/FormFu/Element/Radiogroup.pm   2009-04-15 
08:13:51.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/lib/HTML/FormFu/Element/Radiogroup.pm   
2009-07-02 16:05:57.000000000 +0000
@@ -75,6 +75,10 @@
       name: foo
       auto_id: "%n_%c"
 
+=head2 reverse_group
+
+See L<HTML::FormFu::Element::Checkboxgroup/reverse_group>.
+
 =head1 SEE ALSO
 
 Is a sub-class of, and inherits methods from 
diff -rN -x '*~' -u HTML-FormFu-0.05000/lib/HTML/FormFu/Element/_Field.pm 
HTML-FormFu-0.05000.reverse/lib/HTML/FormFu/Element/_Field.pm
--- HTML-FormFu-0.05000/lib/HTML/FormFu/Element/_Field.pm       2009-05-26 
10:12:24.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/lib/HTML/FormFu/Element/_Field.pm       
2009-07-06 17:58:01.000000000 +0000
@@ -49,7 +49,8 @@
         label_filename              label_tag
         retain_default              force_default
         javascript                  non_param
-        reverse_multi               multi_value
+        reverse_single              reverse_multi
+        multi_value
         original_name               original_nested_name
 ) );
 
@@ -614,6 +615,7 @@
             label_filename       => $self->label_filename,
             label_tag            => $self->label_tag,
             container_tag        => $self->container_tag,
+            reverse_single       => $self->reverse_single,
             reverse_multi        => $self->reverse_multi,
             javascript           => $self->javascript,
             $args ? %$args : (),
@@ -923,7 +925,8 @@
         }
     }
 
-    if ( defined $render->{label} && $render->{label_tag} ne 'legend' ) {
+    if ( defined $render->{label} && $render->{label_tag} ne 'legend' &&
+         !$render->{reverse_single} ) {
         $html .= sprintf "\n%s", $self->_string_label($render);
     }
 
@@ -956,6 +959,11 @@
 
     my $html = '';
 
+    if ( defined $render->{label} && $render->{label_tag} ne 'legend' &&
+         $render->{reverse_single} ) {
+        $html .= sprintf "\n%s", $self->_string_label($render);
+    }
+
     if ( defined $render->{comment} ) {
         $html .= sprintf "\n<span%s>\n%s\n</span>",
             process_attrs( $render->{comment_attributes} ),
@@ -1318,11 +1326,28 @@
 
 Default Value: C<false>
 
+=head2 reverse_single
+
+If true, then the field's label should be rendered to the right of the
+field control.  (When the field is used within a
+L<Multi|HTML::FormFu::Element::Multi> block, the position of the label
+is controlled by the L</reverse_multi> option instead.)
+
+The default value is C<false>, causing the label to be rendered to the left
+of the field control (or to be explicit: the markup for the label comes
+before the field control in the source).
+
+Exception: If the label tag is 'legend', then the reverse_single attribute
+is ignored; the legend always appears as the first tag within the container
+tag.
+
+Default Value: C<false>
+
 =head2 reverse_multi
 
 If true, then when the field is used within a 
 L<Multi|HTML::FormFu::Element::Multi> block, the field's label should be 
-rendered to the right of the field control
+rendered to the right of the field control.
 
 The default value is C<false>, causing the label to be rendered to the left
 of the field control (or to be explicit: the markup for the label comes 
diff -rN -x '*~' -u 
HTML-FormFu-0.05000/share/templates/tt/xhtml/checkboxgroup_tag 
HTML-FormFu-0.05000.reverse/share/templates/tt/xhtml/checkboxgroup_tag
--- HTML-FormFu-0.05000/share/templates/tt/xhtml/checkboxgroup_tag      
2009-05-18 14:45:16.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/share/templates/tt/xhtml/checkboxgroup_tag      
2009-07-02 19:46:04.000000000 +0000
@@ -1,12 +1,14 @@
 <span[% process_attrs(self.attributes) %]>
 [% FOREACH option = self.options %][% IF option.group %]<span[% 
process_attrs(option.attributes) %]>
 [% FOREACH item = option.group %]<span[% 
process_attrs(item.container_attributes) %]>
-<input name="[% self.nested_name %]" type="[% self.input_type %]" value="[% 
item.value %]"[% process_attrs(item.attributes) %] />
-<label[% process_attrs(item.label_attributes) %]>[% item.label %]</label>
+[% IF self.reverse_group %]<input name="[% self.nested_name %]" type="[% 
self.input_type %]" value="[% item.value %]"[% process_attrs(item.attributes) 
%] />
+<label[% process_attrs(item.label_attributes) %]>[% item.label%]</label>[% 
ELSE %]<label[% process_attrs(item.label_attributes) %]>[% item.label%]</label>
+<input name="[% self.nested_name %]" type="[% self.input_type %]" value="[% 
item.value %]"[% process_attrs(item.attributes) %] />[% END %]
 </span>
 [% END %]</span>
 [% ELSE %]<span[% process_attrs(option.container_attributes) %]>
-<input name="[% self.nested_name %]" type="[% self.input_type %]" value="[% 
option.value %]"[% process_attrs(option.attributes) %] />
-<label[% process_attrs(option.label_attributes) %]>[% option.label %]</label>
+[% IF self.reverse_group %]<input name="[% self.nested_name %]" type="[% 
self.input_type %]" value="[% option.value %]"[% 
process_attrs(option.attributes) %] />
+<label[% process_attrs(option.label_attributes) %]>[% option.label 
%]</label>[% ELSE %]<label[% process_attrs(option.label_attributes) %]>[% 
option.label %]</label>
+<input name="[% self.nested_name %]" type="[% self.input_type %]" value="[% 
option.value %]"[% process_attrs(option.attributes) %] />[% END %]
 </span>
 [% END %][% END %]</span>
\ No newline at end of file
diff -rN -x '*~' -u HTML-FormFu-0.05000/share/templates/tt/xhtml/field 
HTML-FormFu-0.05000.reverse/share/templates/tt/xhtml/field
--- HTML-FormFu-0.05000/share/templates/tt/xhtml/field  2009-05-18 
14:45:16.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/share/templates/tt/xhtml/field  2009-07-02 
19:41:53.000000000 +0000
@@ -1,8 +1,9 @@
 [% IF self.container_tag.defined %]<[% self.container_tag %][% 
process_attrs(self.container_attributes) %]>[% END %][% IF self.label.defined 
&& self.label_tag == 'legend' %]
 [% INCLUDE $self.label_filename %][% END %][% IF self.errors %][% FOREACH 
error = self.errors %]
-<span class="error_message [% error.class %]">[% error.message %]</span>[% END 
%][% END %][% IF self.label.defined && self.label_tag != 'legend' %]
+<span class="error_message [% error.class %]">[% error.message %]</span>[% END 
%][% END %][% IF self.label.defined && self.label_tag != 'legend' && 
!self.reverse_single %]
 [% INCLUDE $self.label_filename %][% END %][% IF self.container_tag.defined %]
-[% END %][% content %][% IF self.comment.defined %]
+[% END %][% content %][% IF self.label.defined && self.label_tag != 'legend' 
&& self.reverse_single %]
+[% INCLUDE $self.label_filename %][% END %][% IF self.comment.defined %]
 <span[% process_attrs(self.comment_attributes) %]>
 [% self.comment %]
 </span>[% END %][% IF self.container_tag.defined %]
diff -rN -x '*~' -u HTML-FormFu-0.05000/t/elements/checkboxgroup.t 
HTML-FormFu-0.05000.reverse/t/elements/checkboxgroup.t
--- HTML-FormFu-0.05000/t/elements/checkboxgroup.t      2009-03-10 
09:00:28.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/t/elements/checkboxgroup.t      2009-07-02 
18:27:53.000000000 +0000
@@ -1,24 +1,28 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4;
+use Test::More tests => 5;
 
 use HTML::FormFu;
 
 my $form = HTML::FormFu->new({ tt_args => { INCLUDE_PATH => 
'share/templates/tt/xhtml' } });
 
-my $field = $form->element('Checkboxgroup')->name('foo')->value(2)
+my $field1 = $form->element('Checkboxgroup')->name('foo')->value(2)
     ->options( [ [ 1 => 'One' ], [ 2 => 'Two' ] ] );
 
+# add element to test non-reversed labels
+my $field2 = $form->element('Checkboxgroup')->name('foo2')
+    ->options( [ [ 'a' => 'A' ], [ 'b' => 'B' ] ] )->reverse_group(0);
+
 # add more elements to test accessor output
-$form->element('Checkboxgroup')->name('foo2')->options( [
+$form->element('Checkboxgroup')->name('foo3')->options( [
         { label => 'Ein',  value => 1 },
         { label => 'Zwei', value => 2, attributes => { class => 'foobar' } },
     ] );
 $form->element('Checkboxgroup')->name('bar')->values( [qw/ one two three /] )
     ->value('two')->label('My Bar');
 
-my $field_xhtml = qq{<fieldset class="checkboxgroup">
+my $field1_xhtml = qq{<fieldset class="checkboxgroup">
 <span>
 <span>
 <input name="foo" type="checkbox" value="1" />
@@ -31,19 +35,35 @@
 </span>
 </fieldset>};
 
-is( "$field", $field_xhtml );
+is( "$field1", $field1_xhtml );
+
+my $field2_xhtml = qq{<fieldset class="checkboxgroup">
+<span>
+<span>
+<label>A</label>
+<input name="foo2" type="checkbox" value="a" />
+</span>
+<span>
+<label>B</label>
+<input name="foo2" type="checkbox" value="b" />
+</span>
+</span>
+</fieldset>};
+
+is( "$field2", $field2_xhtml );
 
 my $form_xhtml = <<EOF;
 <form action="" method="post">
-$field_xhtml
+$field1_xhtml
+$field2_xhtml
 <fieldset class="checkboxgroup">
 <span>
 <span>
-<input name="foo2" type="checkbox" value="1" />
+<input name="foo3" type="checkbox" value="1" />
 <label>Ein</label>
 </span>
 <span>
-<input name="foo2" type="checkbox" value="2" class="foobar" />
+<input name="foo3" type="checkbox" value="2" class="foobar" />
 <label>Zwei</label>
 </span>
 </span>
diff -rN -x '*~' -u HTML-FormFu-0.05000/t/elements/radiogroup.t 
HTML-FormFu-0.05000.reverse/t/elements/radiogroup.t
--- HTML-FormFu-0.05000/t/elements/radiogroup.t 2009-03-10 09:00:28.000000000 
+0000
+++ HTML-FormFu-0.05000.reverse/t/elements/radiogroup.t 2009-07-02 
18:29:49.000000000 +0000
@@ -1,17 +1,21 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4;
+use Test::More tests => 5;
 
 use HTML::FormFu;
 
 my $form = HTML::FormFu->new({ tt_args => { INCLUDE_PATH => 
'share/templates/tt/xhtml' } });
 
-my $field = $form->element('Radiogroup')->name('foo')->value(2)
+my $field1 = $form->element('Radiogroup')->name('foo')->value(2)
     ->options( [ [ 1 => 'One' ], [ 2 => 'Two' ] ] );
 
+# add element to test non-reversed labels
+my $field2 = $form->element('Radiogroup')->name('foo2')
+    ->options( [ [ 'a' => 'A' ], [ 'b' => 'B' ] ] )->reverse_group(0);
+
 # add more elements to test accessor output
-$form->element('Radiogroup')->name('foo2')->options( [
+$form->element('Radiogroup')->name('foo3')->options( [
         { label => 'Ein',  value => 1 },
         { label => 'Zwei', value => 2, attributes => { class => 'foobar' }, 
container_attributes => { class => 'item 2' } },
     ] );
@@ -19,7 +23,7 @@
 $form->element('Radiogroup')->name('bar')->values( [qw/ one two three /] )
     ->value('two')->label('My Bar');
 
-my $field_xhtml = qq{<fieldset class="radiogroup">
+my $field1_xhtml = qq{<fieldset class="radiogroup">
 <span>
 <span>
 <input name="foo" type="radio" value="1" />
@@ -32,19 +36,35 @@
 </span>
 </fieldset>};
 
-is( "$field", $field_xhtml );
+is( "$field1", $field1_xhtml );
+
+my $field2_xhtml = qq{<fieldset class="radiogroup">
+<span>
+<span>
+<label>A</label>
+<input name="foo2" type="radio" value="a" />
+</span>
+<span>
+<label>B</label>
+<input name="foo2" type="radio" value="b" />
+</span>
+</span>
+</fieldset>};
+
+is( "$field2", $field2_xhtml );
 
 my $form_xhtml = <<EOF;
 <form action="" method="post">
-$field_xhtml
+$field1_xhtml
+$field2_xhtml
 <fieldset class="radiogroup">
 <span>
 <span>
-<input name="foo2" type="radio" value="1" />
+<input name="foo3" type="radio" value="1" />
 <label>Ein</label>
 </span>
 <span class="item 2">
-<input name="foo2" type="radio" value="2" class="foobar" />
+<input name="foo3" type="radio" value="2" class="foobar" />
 <label>Zwei</label>
 </span>
 </span>
diff -rN -x '*~' -u HTML-FormFu-0.05000/t/elements/reverse_single.t 
HTML-FormFu-0.05000.reverse/t/elements/reverse_single.t
--- HTML-FormFu-0.05000/t/elements/reverse_single.t     1970-01-01 
00:00:00.000000000 +0000
+++ HTML-FormFu-0.05000.reverse/t/elements/reverse_single.t     2009-07-02 
18:34:19.000000000 +0000
@@ -0,0 +1,18 @@
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+use HTML::FormFu;
+
+my $form = HTML::FormFu->new({ tt_args => { INCLUDE_PATH => 
'share/templates/tt/xhtml' } });
+
+my $field = $form->element('Text')->name('foo')->label('My Foo')
+    ->reverse_single(1);
+
+my $field_xhtml = qq{<div class="text label">
+<input name="foo" type="text" />
+<label>My Foo</label>
+</div>};
+
+is( "$field", $field_xhtml );
_______________________________________________
HTML-FormFu mailing list
HTML-FormFu@lists.scsys.co.uk
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu

Reply via email to