NAME
ASP4x::Linker - In-page persistence of widget-specific variables.
SYNOPSIS
(Within /some-page.asp)
use ASP4x::Linker;
my $linker = ASP4x::Linker->new();
$linker->add_widget(
name => "albums",
attrs => [qw/ page_number page_size sort_field sort_dir /]
);
$linker->add_widget(
name => "genres",
attrs => [qw/ page_number page_size sort_field sort_dir /]
);
$linker->add_widget(
name => "artists",
attrs => [qw/ page_number page_size sort_field sort_dir /]
);
...later, on the same page...
For more info click <a href="<%= $linker->uri() %>">Here</a>.
Then:
$linker->widget('albums')->page_number(4);
<a href="<%= $linker->uri() %>">Page 4</a> # /some-page.asp?albums.page_number=4
Or
my $url = $linker->uri({
albums => { page_number => 4 }
});
# /some-page.asp?albums.page_number=4
Or
my $url = $linker->uri({
albums => { page_number => 4 },
genres => {
page_number => 1,
page_size => 20,
sort_col => 'name',
sort_dir => 'desc'
}
});
# /some-page.asp?albums.page_number=4&genres.page_number=1&genres.page_size=20&genres.sort_col=name&genres.sort_dir=desc
Or
my $url = $linker->uri({foo => 'bar'});
# /some-page.asp?foo=bar
DESCRIPTION
ASP4x::Linker
aims to solve the age-old problem of:
How do I change one widget on the page without losing my settings for all the other widgets on the page?
OK - say you have one data grid on your web page that allows paging and sorting. You can move forward and backward between pages, change the sorting - life's great. THEN your boss says:
We need to have two of those on the same page. One for Albums and one for Genres.
Now you have 2 options.
Option 1: If a user pages "Albums" to page 4, then pages "Genres" to page 2, you forget that "Albums" was on page 4.
Option 2: Use ASP4x::Linker. Register 2 "widgets" (albums and genres) and let the linker know that they both have page_number
, page_size
, sort_col
and sort_dir
attributes. When the user makes paging or sorting changes in Albums, the stuff for Genres will persist between requests without any extra effort.
CONSTRUCTOR
new( [ base_href => $ENV{REQUEST_URI} ] )
Returns a new ASP4x::Linker
object using the supplied base_href
value as the "starting point" for all links that will be generated.
If no base_href
is provided, the value of $ENV{REQUEST_URI}
will be used instead.
PUBLIC READ-ONLY PROPERTIES
base_href
Returns the base_href
value in use for the linker object.
widgets
Returns an array of ASP4x::Linker::Widget objects assigned to the linker.
PUBLIC METHODS
add_widget( name => $str, attrs => \@attrNames )
Adds a "widget" to the widgets collection.
widget( $name )
Returns an individual ASP4x::Linker::Widget object by that name.
Returns undef if no widget by that name is found.
uri( [$properties] )
Returns the uri for all widgets based on the intersect of:
The incoming form data from the original request
Individually-set values for each widget in the collection.
Any properties provided as an argument to
uri()
.
hidden_fields( [$properties] )
Returns a string of XHTML hidden input fields (<input type="hidden" name="$name" value="$value" />).
Useful if your persistence logic involves repeated form submissions rather than hyperlinks.
The $properties
argument is the same as in the uri()
method.
vars( [$properties] )
Returns a hashref representing the intersect of all widgets' names and attributes.
Supposing you setup your linker like this:
my $linker = ASP4x::Linker->new();
$linker->add_widget(
name => 'albums',
attrs => [qw( page sort )]
);
$linker->add_widget(
name => 'artists',
attrs => [qw( page sort )]
);
After calling vars()
you'd get:
$VAR1 = {
'albums.page' => undef,
'albums.sort' => undef,
'artists.page' => undef,
'artists.sort' => undef,
};
If you did this:
$linker->vars({
albums => {page => 2},
artists => {sort => 'desc'}
});
Then you'd get this instead:
$VAR1 = {
'albums.page' => 2,
'albums.sort' => undef,
'artists.page' => undef,
'artists.sort' => 'desc',
};
You could also do this:
$linker->widget('albums')->page( 10 );
$linker->widget('artists')->sort( 'desc' );
$linker->vars();
And you would get the same thing:
$VAR1 = {
'albums.page' => 2,
'albums.sort' => undef,
'artists.page' => undef,
'artists.sort' => 'desc',
};
reset( )
Resets all widgets to their original values from the original request (as specified in the base_href
value used by new()
).
SEE ALSO
ASP4, ASP4x::Router, Router::Generic
AUTHOR
John Drago <jdrago_999@yahoo.com>
LICENSE
This software is Free software and may be used and redistributed under the same terms as Perl itself.