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_item_accessors(qw( odd_class even_class )); sub new { my $self = shift->next::method(@_); $self->tag('table'); return $self; } sub headers { my ( $self, $headers ) = @_; my @headers; eval { @headers = @$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; my @rows; eval { @rows = @$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, $args ) = @_; 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 ) { if ( defined $odd ) { $row->attributes( { class => $odd } ); } } else { if ( defined $even ) { $row->attributes( { class => $even } ); } } $i++; } my $render = $self->next::method( { elements => [ map { $_->render_data } @{ $self->_elements } ], $args ? %$args : (), } ); append_xml_attribute( $render->{attributes}, 'class', lc $self->type ); return $render; } 1; __END__ =head1 NAME HTML::FormFu::Element::SimpleTable - simple table element =head1 SYNOPSIS The following is yaml markup for a table consisting of a header row containing 2 C