/lib/HTML/FormHandler/Render/Table.pm

http://github.com/gshank/html-formhandler · Perl · 86 lines · 66 code · 19 blank · 1 comment · 5 complexity · 011a4e774d2fe85acb0fe51425eebc2e MD5 · raw file

  1. package HTML::FormHandler::Render::Table;
  2. # ABSTRACT: render a form with a table layout
  3. use Moose::Role;
  4. with 'HTML::FormHandler::Render::Simple' =>
  5. { -excludes => [ 'render', 'wrap_field', 'render_end', 'render_start' ] };
  6. use HTML::FormHandler::Render::Util ('process_attrs');
  7. =head1 SYNOPSIS
  8. Include this role in a form:
  9. package MyApp::Form::User;
  10. use Moose;
  11. with 'HTML::FormHandler::Render::Table';
  12. Use in a template:
  13. [% form.render %]
  14. =cut
  15. sub render {
  16. my $self = shift;
  17. my $output = $self->render_start;
  18. $output .= $self->render_form_errors;
  19. foreach my $field ( $self->sorted_fields ) {
  20. $output .= $self->render_field($field);
  21. }
  22. $output .= $self->render_end;
  23. return $output;
  24. }
  25. sub render_start {
  26. my $self = shift;
  27. my $attrs = process_attrs($self->attributes);
  28. return qq{<form$attrs><table>};
  29. }
  30. sub render_form_errors {
  31. my $self = shift;
  32. return '' unless $self->has_form_errors;
  33. my $output = "\n<tr class=\"form_errors\"><td colspan=\"2\">";
  34. $output .= qq{\n<span class="error_message">$_</span>}
  35. for $self->all_form_errors;
  36. $output .= "\n</td></tr>";
  37. return $output;
  38. }
  39. sub render_end {
  40. my $self = shift;
  41. my $output .= "</table>\n";
  42. $output .= "</form>\n";
  43. return $output;
  44. }
  45. sub wrap_field {
  46. my ( $self, $field, $rendered_field ) = @_;
  47. my $attrs = process_attrs($field->wrapper_attributes);
  48. my $output = qq{\n<tr$attrs>};
  49. my $l_type = $field->widget eq 'Compound' ? 'legend' : 'label';
  50. if ( $l_type eq 'label' ) {
  51. $output .= '<td>' . $self->render_label($field) . '</td>';
  52. }
  53. elsif ( $l_type eq 'legend' ) {
  54. $output .= '<td>' . $self->render_label($field) . '</td></tr>';
  55. }
  56. if ( $l_type ne 'legend' ) {
  57. $output .= '<td>';
  58. }
  59. $output .= $rendered_field;
  60. $output .= qq{\n<span class="error_message">$_</span>} for $field->all_errors;
  61. if ( $l_type ne 'legend' ) {
  62. $output .= "</td></tr>\n";
  63. }
  64. return $output;
  65. }
  66. use namespace::autoclean;
  67. 1;