package HTML::FormFu::Element::SimpleTable; use strict; use base 'HTML::FormFu::Element::Block'; use Class::C3; use HTML::FormFu::Util qw/ append_xml_attribute /; use Carp qw/ croak /; __PACKAGE__->mk_accessors(qw/ odd_class even_class /); sub new { my $self = shift->next::method(@_); $self->tag('table'); return $self; } sub headers { my ( $self, $headers ) = @_; eval { my @foo = @$headers; }; croak "headers must be passed as an array-ref" if $@; # save any elements already added my @original_rows = @{ $self->_elements }; $self->_elements( [] ); my $header_row = $self->element('Block'); $header_row->tag('tr'); for my $text (@$headers) { my $th = $header_row->element('Block'); $th->tag('th'); $th->content($text); } if (@original_rows) { push @{ $self->_elements }, @original_rows; } return $self; } sub rows { my ( $self, $rows ) = @_; croak "too many arguments" if @_ > 2; eval { my @foo = @$rows; }; croak "rows must be passed as an array-ref" if $@; for my $cells (@$rows) { my @cells; eval { @cells = @$cells; }; croak "each row must be an array-ref" if $@; my $row = $self->element('Block'); $row->tag('tr'); for my $cell (@cells) { my $td = $row->element('Block'); $td->tag('td'); $td->element($cell); } } return $self; } sub render_data { return shift->render_data_non_recursive(@_); } sub render_data_non_recursive { # though it is really recursive my $self = shift; my $odd = $self->odd_class; my $even = $self->even_class; my $i = 1; for my $row ( @{ $self->get_elements } ) { my $first_cell = $row->get_element; if ( $i == 1 && $first_cell->tag eq 'th' ) { # skip the header row next; } if ( $i % 2 ) { $row->attributes( { class => $odd } ) if defined $odd; } else { $row->attributes( { class => $even } ) if defined $even; } $i++; } my $render = $self->next::method( { elements => [ map { $_->render_data } @{ $self->_elements } ], @_ ? %{ $_[0] } : () } ); append_xml_attribute( $render->{attributes}, 'class', lc $self->type ); return $render; } 1; __END__ =head1 NAME HTML::FormFu::Element::SimpleTable =head1 SYNOPSIS The following is yaml markup for a table consisting of a header row containing 2 C