CGI::Widget::DBI::Search::AbstractDisplay - Abstract Display class inherited by default display classes


CGI-Widget-DBI-Search documentation Contained in the CGI-Widget-DBI-Search distribution.

Index


Code Index:

NAME

Top

CGI::Widget::DBI::Search::AbstractDisplay - Abstract Display class inherited by default display classes

SYNOPSIS

Top

  package My::SearchWidget::CustomDisplayClass;

  use base qw/ CGI::Widget::DBI::Search::AbstractDisplay /;

  # ... implement abstract methods




  # then, when instantiating your search widget:
  my $ws = CGI::Widget::DBI::Search->new(q => CGI->new);
  ...
  $ws->{-display_class} = 'My::SearchWidget::CustomDisplayClass';

DESCRIPTION

Top

This abstract class defines several methods useful to display classes, and is the base class of all default display classes (shipped with this distribution).

ABSTRACT METHODS

Top

render_dataset()
display_dataset()

METHODS

Top

display()

This is the top-level method called by CGI::Widget::DBI::Search. The default implementation calls the _set_display_defaults() and render_dataset() methods, then returns the result of the display_dataset() method.

If this method is overridden, it should return the rendering of the search widget UI from data values stored in the search widget's 'results' object variable (retrieved from the most recent call to its search() method).

_set_display_defaults()

Sets object variables for displaying search results. Called from display() method.

_init_header_columns()

Initializes list of columns to display in dataset, based on 'sql_table_display_columns' object variable, and -pre_nondb_columns, -post_nondb_columns, and -display_columns settings.

sortby_column_uri($column)

Returns URI for sorting the dataset by the given column. If the dataset is currently sorted by $column, then the URI returned will be for reversing the sort.

prev_page_uri()

Returns URI of location to previous page in search results.

next_page_uri()

Returns URI of location to next page in search results.

first_page_uri()

Returns URI of location to first page in search results.

last_page_uri()

Returns URI of location to last page in search results.

make_nav_uri( $page_no )

Generates and returns a URI for a given page number in the search result set. Pages start at 0, with each page containing at most -max_results_per_page.

Returns an HTML table containing navigation links for first, previous, next, and last pages of result set, and optionally, number and range of results being displayed, and/or navigable list of pages in the dataset.

This method is called from display() and should be treated as a protected method.

parameters: $showtotal boolean to toggle whether to show total number of results along with range on current page $showpages boolean to toggle whether to show page range links for easier navigation in large datasets (has no effect unless -show_total_numresults setting is set) $hide_if_singlepage boolean to toggle whether to display nothing if there is only one page of search results

display_record($row, $column)

Returns HTML rendering of a single record in the dataset, for column name $column. The $row parameter is the entire row hash for the row being displayed.

Returns a chunk of HTML which shows links to the surrounding pages in the search set. The number of pages shown is determined by the -page_range_nav_limit setting.

SEE ALSO

Top

CGI::Widget::DBI::Search::Display::Grid, CGI::Widget::DBI::Search::Display::Table,


CGI-Widget-DBI-Search documentation Contained in the CGI-Widget-DBI-Search distribution.
package CGI::Widget::DBI::Search::AbstractDisplay;

use strict;

use base qw/ CGI::Widget::DBI::Search::Base /;

sub new {
    my ($this, $search) = @_;
    my $class = ref($this) || $this;
    my $self = bless {}, $class;
    $self->{s} = $search if $search;
    $self->{q} = $search->{q} if $search->{q};
    return $self;
}

sub render_dataset { die 'abstract'; }
sub display_dataset { die 'abstract'; }

sub display {
    my ($self) = @_;
    my $q = $self->{q};

    $self->_set_display_defaults();

    $self->render_dataset();

    return $self->display_dataset();
}

sub _set_display_defaults {
    my ($self) = @_;
    $self->{'action_uri'} = $self->{-action_uri} || $ENV{SCRIPT_NAME} || '';

    $self->{'href_extra_vars'} = '';
    if (ref $self->{s}->{-href_extra_vars} eq "HASH") {
        $self->{'href_extra_vars'} = $self->{s}->extra_vars_for_uri();
    }
    if ($self->{s}->{-href_extra_vars_qs}) {
        $self->{'href_extra_vars'} .= '&'.$self->{s}->{-href_extra_vars_qs};
    }
    $self->{'href_extra_vars'} = '&'.$self->{'href_extra_vars'}
      if $self->{'href_extra_vars'} && $self->{'href_extra_vars'} !~ m/^&/;

    # read ordered list of table columns
    $self->{'sql_table_display_columns'} = ref $self->{s}->{-sql_retrieve_columns} eq "ARRAY"
      ? [ @{$self->{s}->{-sql_retrieve_columns}} ] : [ @{$self->{s}->{-sql_table_columns}} ];

    $self->_init_header_columns();
}

sub _init_header_columns {
    my ($self) = @_;
    $self->{'header_columns'} = [];
    my $init_display_columns = ! (ref $self->{-display_columns} eq "HASH");
    foreach my $sql_col (@{ $self->{-pre_nondb_columns} || [] },
                         @{ $self->{'sql_table_display_columns'} },
                         @{ $self->{-post_nondb_columns} || [] }) {
        my $col = _column_name($self, $sql_col);
        $self->{-display_columns}->{$col} = $col if $init_display_columns;
        push(@{ $self->{'header_columns'} }, $col) if defined $self->{-display_columns}->{$col};
    }
}

sub _column_name {
    my ($self, $col) = @_;
    $col =~ s/.*[. ](\w+)$/$1/;
    return $col;
}

sub sortby_column_uri {
    my ($self, $column) = @_;
    return $self->{s}->BASE_URI() . $self->{'action_uri'} . '?'
      . $self->_query_string_sortby_params($column, 1) . ($self->{'href_extra_vars'} || '');
}

sub _query_string_sortby_params {
    my ($self, $column, $for_sortlink) = @_;
    my $reverse = $self->{s}->{'sort_reverse'}->{$column};
    $reverse = ! $reverse if $for_sortlink;
    my $sortby = $self->{s}->{'sortby'} && $column eq $self->{s}->{'sortby'};
    return 'sortby=' . $column
      . ($sortby ? '&sort_reverse='.($reverse ? '1':'0') : '');
}

sub prev_page_uri {
    my ($self) = @_;
    $self->{'prevlink'} ||= make_nav_uri($self, $self->{s}->{'page'} - 1);
    return $self->{'prevlink'};
}

sub next_page_uri {
    my ($self) = @_;
    $self->{'nextlink'} ||= make_nav_uri($self, $self->{s}->{'page'} + 1);
    return $self->{'nextlink'};
}

sub first_page_uri {
    my ($self) = @_;
    $self->{'firstlink'} ||= make_nav_uri($self, 0);
    return $self->{'firstlink'};
}

sub last_page_uri {
    my ($self) = @_;
    $self->{'lastlink'} ||= make_nav_uri($self, $self->{s}->{'lastpage'});
    return $self->{'lastlink'};
}

sub make_nav_uri {
    my ($self, $page_no) = @_;
    my $link = $self->{s}->BASE_URI().$self->{'action_uri'}.'?search_startat='.$page_no;
    if ($self->{s}->{-no_persistent_object} && $self->{s}->{'sortby'}) {
        $link .= '&'.$self->_query_string_sortby_params($self->{s}->{'sortby'});
    }
    $link .= $self->{'href_extra_vars'} || '';
    return $link;
}

sub display_pager_links {
    my ($self, $showtotal, $showpages, $hide_if_singlepage) = @_;
    my $q = $self->{q};
    my $startat = $self->{s}->{'page'} || 0;
    my $pagetotal = scalar( @{$self->{s}->{'results'}} );
    my $maxpagesize = $self->{s}->{-max_results_per_page};
    my $searchtotal = $self->{s}->{'numresults'};
    my $middle_column = $showtotal || $showpages && $searchtotal;
    my $next_page_exists = defined $maxpagesize
      && ((defined $searchtotal && $startat != int(($searchtotal-1)/$maxpagesize))
          || (!$searchtotal && $pagetotal >= $maxpagesize));

    return '' if $hide_if_singlepage && $startat == 0 && !$next_page_exists;
    return
      ($q->table
       ({-width => '96%'}, $q->Tr
	($q->td({-align => 'left',
		 -width => $middle_column ? '30%' : '50%'},
		$q->font({-size => '-1'},
			 ($startat > 0
			  ? $q->b(($self->first_page_uri()
				   ? $q->a({-href => $self->first_page_uri()},
					   "|<First").'   '
				   : '').
				  $q->a({-href => $self->prev_page_uri()}, "<Previous"))
			  : "|At first page"))) .
	 ($middle_column
	  ? $q->td({-align => 'center', -width => '40%', -nowrap => 1},
                   ($showtotal
                    ? "<B>$pagetotal</B> result".
                      ($pagetotal == 1 ? '' : 's')." displayed".
                      ($searchtotal
                       ? (': <B>'.($startat*$maxpagesize + 1).' - '.
                          ($startat*$maxpagesize + $pagetotal).'</B> of <B>'.
                          $searchtotal.'</B>')
                       : '').$q->br
                    : '') .
                    ($showpages && $searchtotal
                     ? $q->font({-size => '-1'},
                                "Skip to page: ".$self->display_page_range_links($startat))
                     : '')
                  )
	  : '') .
	 $q->td({-align => 'right', -width => $middle_column ? '30%' : '50%'},
		$q->font({-size => '-1'},
			 ($next_page_exists
			  ? $q->b($q->a({-href => $self->next_page_uri()}, "Next&gt;").
				  ($self->last_page_uri()
				   ? '&nbsp;&nbsp;&nbsp;'.$q->a({-href => $self->last_page_uri()},"Last&gt;|")
				   : ''))
			  : "At last page|"))))
       ));
}

sub display_record {
    my ($self, $row, $column) = @_;
    return (ref $self->{-columndata_closures}->{$column} eq "CODE"
            ? $self->{-columndata_closures}->{$column}->($self, $row)
	    : $self->{-currency_columns}->{$column}
	    ? sprintf('%.2f', $row->{$column})
	    : $row->{$column} || '');
}

sub display_page_range_links {
    my ($self, $startat) = @_;
    my $q = $self->{q};
    my @page_range;
    my ($pre, $post) = ('', '');
    if ($startat <= $self->{-page_range_nav_limit}
          && $startat + $self->{-page_range_nav_limit} >= $self->{s}->{'lastpage'}) {
        @page_range = 0 .. $self->{s}->{'lastpage'};
    } elsif ($startat <= $self->{-page_range_nav_limit}) {
        @page_range = 0 .. ($startat + $self->{-page_range_nav_limit});
        $post = ' ...';
    } elsif ($startat + $self->{-page_range_nav_limit} >= $self->{s}->{'lastpage'}) {
        @page_range = ($startat - $self->{-page_range_nav_limit}) .. $self->{s}->{'lastpage'};
        $pre = '... ';
    } else {
        @page_range = ($startat - $self->{-page_range_nav_limit}) .. ($startat + $self->{-page_range_nav_limit});
        $pre = '... ';
        $post = ' ...';
    }
    return $pre.join(' ', map {
        $startat == $_ ? $q->b($_) : $q->a({-href => make_nav_uri($self, $_)}, $_)
    } @page_range).$post;
}


1;
__END__