The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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.