Catalyst::Plugin::StatusMessage - Handle passing of status (success and error) messages between screens of a web application.
In MyApp.pm:
use Catalyst qr/ StatusMessage /;
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'), {mid => $c->set_status_msg("Deleted widget")}));
Or, to save an error message:
$c->response->redirect($c->uri_for($self->action_for('list'), {mid => $c->set_error_msg("Error deleting widget")}));
Then, in the controller action that corresponds to the redirect above:
sub list :Path { my ($self, $c) = @_; ... $c->load_status_msgs; ... }
And, to display the output (here using Template Toolkit):
... <span class="message">[% status_msg %]</span> <span class="error">[% error_msg %]</span> ...
There are a number of ways people commonly use to pass "status messages" between screens in a web application.
Using $c->stash: The stash only exists for a single request, so this approach can leave the wrong URL in the user's browser.
Using $c->flash: This allows the application to redirect to an appropriate URL, but it can display lead to a race condition where the wrong status message is displayed in the wrong browser window or tab.
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.
$c->session
Associates a random 8-digit "token" with each messages, 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.
The location inside $c->session where messages will be stored. Defaults to "status_msg".
status_msg
The name of the URL param that holds the token on the page where you want to retrieve/display the status message. Defaults to "mid".
mid
The name of the stash key where "success" status messages are loaded when $c->load_status_msgs is called. Defaults to status_msg.
$c->load_status_msgs
The name of the stash key where error messages are loaded when $c->load_status_msgs is called. Defaults to error_msg.
error_msg
Load both messages that match the token parameter on the URL (e.g., http://myserver.com/widgits/list?mid=1234567890) into the stash for display by the view.
In general, you will want to include this in an auto or "base" (if using Chained dispatch) controller action. Then, if you have a "template wrapper page" that displays both "status_msg" and "error_msg", you can automatically and safely send status messages to any related controller action.
auto
Kennedy Clark, hkclark@gmail.com
This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.
To install Catalyst::Plugin::StatusMessage, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Catalyst::Plugin::StatusMessage
CPAN shell
perl -MCPAN -e shell install Catalyst::Plugin::StatusMessage
For more information on module installation, please visit the detailed CPAN module installation guide.