The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Catalyst::Plugin::SimpleMessage - Handle passing multiple types of messages between screens of a web application using session or stash.

SYNOPSIS

In MyApp.pm:

    use Catalyst qr/
        SimpleMessage
    /;
 

In controller where you want to save a message for display on the next page (here, once the "delete" action taken is complete, we are redirecting to a "list" page to show the status [we don't want to leave the delete action in the browser URL]):

   $c->response->redirect($c->uri_for($self->action_for('list'),
        { $c->sm_get_token_param() => $c->sm_session({ message => 'Deleted widget', type => 'success' }) }));
 

Or, to display an error message:

   $c->response->redirect($c->uri_for($self->action_for('list'),
        { $c->sm_get_token_param() => $c->sm_session({ message => 'Error deleting widget', type => 'danger' }) }));

If you do not need a redirect, you can pass the message using stash:

    $c->sm_stash({ message => 'Your email was not confirmed yet', type => 'warning' });
 

And, to display the output (here using Template Toolkit and Twitter Bootstrap):

    ...
    [% FOREACH item IN c.sm_get() %]
        <span class="alert alert-[% item.type %]">[% item.message %]</span>
    [% END %]
    ...
 
 

DESCRIPTION

There are a number of ways people commonly use to pass messages between screens in a web application.

  • Using $c->flash: The "flash" feature does provide a mechanism where the application can redirect to an appropriate URL, but it can also lead to a race condition where the wrong status message is displayed in the wrong browser window or tab (and can therefore be confusing to the users of your application).

  • Query parameters in the URL: This suffers from issues related to long/ugly URLs and leaves the message displayed even after a browser refresh.

This plugin attempts to address these issues through the following mechanisms:

  • Stores messages in the $c->session so that the application is free to redirect to the appropriate URL after an action is taken.

  • Associates a random 8-digit "token" with each message, so it's completely unambiguous what message should be shown in each window/tab.

  • Only requires that the token (not the full message) be included in the redirect URL.

  • Automatically removes the message after the first time it is displayed. That way, if users hit refresh in their browsers they only see the messages the first time.

METHODS

sm_get_messages

Returns an array ref with messages sent through $c->sm_session and $c->sm_stash. You can send messages through $c->sm_session and $c->sm_stash and both will be available, messages sent throught stash are available only for the current request.

sm_get

Alias for sm_get_messages

sm_get_token_param

Return the token_param name. Default is "__sm"

sm_set_messages_session

Send messages through the session and return a token. You can send multiple messages:

    my $token = $c->sm_session({ message => 'Product added with success', type => 'success' }, { message => 'You must define a price before selling', type => 'warning' });
    $c->response->redirect($c->uri_for($self->action_for('list'), { $c->sm_get_token_param() => $token }));

sm_session

Alias for sm_set_messages_session

sm_set_messages_stash

Send messages through the stash. You can send multiple messages:

    my $token = $c->sm_stash({ message => 'You account is active', type => 'info' }, { message => 'You do not have credit', type => 'danger' });

Messages sent through stash will be available only for the current request.

sm_stash

Alias for sm_set_messages_stash

CONFIGURABLE OPTIONS

session_prefix

The location inside $c->session where messages will be stored. Defaults to "__sm".

stash_prefix

The location inside $c->stash where messages will be stored. Defaults to "__sm".

token_param

The name of the URL param that holds the token on the page where you want to retrieve/display the status message. Defaults to "__sm".

Configuration Example

Here is a quick example showing how Catalyst::Plugin::SimpleMessage can be configured

    # Configure Catalyst::Plugin::SimpleMessage
    __PACKAGE__->config(
        'Plugin::SimpleMessage' => {
            session_prefix       => '__sm',
            stash_prefix         => '__sm',
            token_param          => '__sm'
        }
    );
 
 

INTERNALS

Note: You normally shouldn't need any of the information in this section to use Catalyst::Plugin::SimpleMessage.

__sm_config

Handles default values for config and lets them be overriden from the MyApp configuration.

CODE

Github

    https://github.com/geovannyjs/Catalyst-Plugin-SimpleMessage
 

AUTHOR

Geovanny Junio, geovannyjs@gmail.com

This module was based on Catalyst::Plugin::StatusMessage. Many thanks to Kennedy Clark (HKCLARK).

COPYRIGHT

This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.