/lib/HTML/FormHandler/Widget/Wrapper/Simple.pm

http://github.com/gshank/html-formhandler · Perl · 113 lines · 75 code · 24 blank · 14 comment · 15 complexity · b060d4570ee6e39ceede20c00ff3450c MD5 · raw file

  1. package HTML::FormHandler::Widget::Wrapper::Simple;
  2. # ABSTRACT: simple field wrapper
  3. use Moose::Role;
  4. use namespace::autoclean;
  5. use HTML::FormHandler::Render::Util ('process_attrs');
  6. with 'HTML::FormHandler::Widget::Wrapper::Base';
  7. =head1 SYNOPSIS
  8. This is the default wrapper role. It will be installed if
  9. no other wrapper is specified and widget_wrapper is not set to
  10. 'none'.
  11. Relevant field flags:
  12. do_wrapper
  13. do_label
  14. If 'do_label' is set and not 'do_wrapper', only the label plus
  15. the form element will be rendered.
  16. Supported 'tags', all set via the 'tags' hashref on the field:
  17. wrapper_tag -- the tag to use in the wrapper, default 'div'
  18. label_tag -- tag to use for label (default 'label')
  19. label_after -- string to append to label, for example ': ' to append a colon
  20. before_element -- string that goes right before the element
  21. after_element -- string that goes right after the element
  22. no_errors -- don't issue error messages on the field
  23. error_class -- class for error messages (default 'error_message')
  24. warning_class -- class for warning messages (default 'warning_message' )
  25. no_wrapped_label -- for checkboxes. Don't provide an inner wrapped label
  26. (from Base wrapper)
  27. Example:
  28. has_field 'foo' => ( tags => { wrapper_tag => 'span', no_errors => 1 } );
  29. =cut
  30. sub wrap_field {
  31. my ( $self, $result, $rendered_widget ) = @_;
  32. my $output;
  33. # get wrapper tag if set
  34. my $label_tag = $self->label_tag || '';
  35. my $wrapper_tag;
  36. if( $self->do_wrapper ) {
  37. $output .= $self->get_tag('before_wrapper');
  38. $wrapper_tag = $self->get_tag('wrapper_tag');
  39. # default wrapper tags
  40. $wrapper_tag ||= $self->has_flag('is_repeatable') ? 'fieldset' : 'div';
  41. # get attribute string
  42. my $attrs = process_attrs( $self->wrapper_attributes($result) );
  43. # write wrapper tag
  44. $output .= qq{\n<$wrapper_tag$attrs>};
  45. $label_tag = 'legend' if $wrapper_tag eq 'fieldset';
  46. }
  47. # write label; special processing for checkboxes
  48. $rendered_widget = $self->wrap_checkbox($result, $rendered_widget)
  49. if ( lc $self->widget eq 'checkbox' );
  50. $output .= "\n" . $self->do_render_label($result, $label_tag)
  51. if $self->do_label;
  52. # append 'before_element'
  53. $output .= $self->get_tag('before_element');
  54. # start controls div
  55. if ( $self->get_tag('controls_div') ) {
  56. $output .= qq{\n<div class="controls">};
  57. }
  58. elsif ( $self->has_element_wrapper_class ) {
  59. my $ew_attr = $self->element_wrapper_attributes($result);
  60. my $element_wrapper_attrs = process_attrs( $ew_attr );
  61. $output .= qq{\n<div$element_wrapper_attrs>};
  62. }
  63. # the input element itself
  64. $output .= "\n$rendered_widget";
  65. # close controls div
  66. if ( $self->get_tag('controls_div') || $self->has_element_wrapper_class ) {
  67. # end control div
  68. $output .= "\n</div>";
  69. }
  70. # the 'after_element'
  71. $output .= $self->get_tag('after_element');
  72. # the error messages
  73. unless( $self->get_tag('no_errors') ) {
  74. my $error_class = $self->get_tag('error_class') || 'error_message';
  75. $output .= qq{\n<span class="$error_class">$_</span>}
  76. for $result->all_errors;
  77. # warnings (incompletely implemented - only on field itself)
  78. my $warning_class = $self->get_tag('warning_class') || 'warning_message';
  79. $output .= qq{\n<span class="warning_message">$_</span>}
  80. for $result->all_warnings;
  81. }
  82. if( $self->do_wrapper ) {
  83. $output .= "\n</$wrapper_tag>";
  84. $output .= $self->get_tag('after_wrapper');
  85. }
  86. return "$output";
  87. }
  88. 1;