Jump to content

Session messages (or flash messages) implementation


Recommended Posts

I'm doing a custom login/register in the front end, and flash messages are really useful to inform the user about the process of user registration. I was used to using Codeigniter with their flash message system. I've seen very few messages in the forum where $session->message is used but I haven't seen a full implementation. I've tried my own with some degree of success, but the flash messages persist in a different way that I've expected. It's like there is a "delay". Maybe I'm doing something wrong.

The header.inc has a standard notices loop:

<?php if($notices) :?>
     <?php foreach($notices as $notice) :?>
            <?php $class = $notice->className(); ?>
            <div class="notification <?= $class; ?>">
                <p><?= $notice->text ;?></p>
     <?php endforeach ;?>
<?php endif ;?>

This is my register.php:

When submitting the form with errors, the first time no error message are displayed. The second time I submit it with errors, then the error message appears. This is what I describe as the "delay".



 * Register template

$out = "";
$errors = "";

// create a new form field (also field wrapper)
$form = $modules->get("InputfieldForm");
$form->action = "./";
$form->method = "post";

// Name
// $field = $modules->get("InputfieldText");
// $field->label = "Name";
// $field->attr('id+name','name');
// $field->required = 1;
// $form->append($field); // append the field to the form

// Email
$field = $modules->get("InputfieldEmail");
$field->label = "E-Mail";
$field->required = 1;
$form->append($field); // append the field

// Password
$field = $modules->get("InputfieldPassword");
$field->label = __("Contraseña");
$field->required = 1;

// Submit
$submit = $modules->get("InputfieldSubmit");
$submit->attr("value",__('Crear cuenta'));
$submit->attr("class","btn btn--primary");

// Form submitted: process form
if($input->post->submit) {

    // user submitted the form, process it and check for errors

    // here is a good point for extra/custom validation and manipulate fields
    if($sanitizer->email($form->get("email")->value) != '') {

        // Email should be unique
            $form->email->error(__("El e-mail ingresado ya se encuentra registrado"));

    if($form->getErrors()) {
       // the form is processed and populated but contains errors

       // Render Form
       $session->error(__('There are errors in the form'));
       $out .= $form->render();

    } else {

        // Sanitize inputs
        //$full_name = $sanitizer->text($input->post->name);
        $email = $sanitizer->email($input->post->email);
        $password = $input->post->password;

        // Generate username from email
        $username = $sanitizer->email($input->post->email);

        // Create New User
        $u = new User();
        $u->name = $username;
        $u->pass = $password;
        $u->email = $email;

        // Create hash

        // Email the user with confirmation e-mail

        // Redirect to login page and display success Message
        $session->message(__('User registration sucessfull'));


} else {
    // Form not submitted: render out form without processing
    $out .= $form->render();

include("./partials/header.inc"); ?>

<div class="container container--narrow">
    <div class="page">
        <h1>Nuevo usuario</h1>
        <?= $out ;?>
    </div><!-- .page -->
</div><!-- .container -->

<?php include("./partials/footer.inc"); ?>

On a successful submission, the next page displays the correct message, but also the error message "There are errors in the form". It's like the error message get's carried over.

I appreciate any help to sort this out.

Link to comment
Share on other sites

What you need to understand is that in your example, you are storing the messages/errors in the session. This means you should be redirecting the user to display the message. Or to be precise, for them to be populated in $notices.

If you want to add a message to the current request, you should use the "regular" message/error -methods. You can do this through most PW objects. For an example, change your line 67 to

$form->error(__('There are errors in the form'));

As a bonus, when redirecting, PW automatically stores such notices in the session . This means you could do

$form->message(__('User registration sucessfull'));

...and the message wouldn't be lost. However in my opinion, it's cleaner to use $session->message() on line 98 because you are calling $session->redirect() on the next line.

  • Like 1
Link to comment
Share on other sites

  • 5 months later...

Should $session->message persist? I have code that says otherwise, unless this is a bug?
I'm just refreshing current page to show message.

if($mail->send()) {
      $session->notices = false;
      $session->message('Thank you, your enquiry has been sent, we will be in touch shortly.', true);

// render notices
$data = array('notices',$notices);
$partials['notices'] = $page->render('views/partials/_notices.php',$data);

Event when revisiting the page after further navigation, the message remains. Weird.


Session.php line 117, has remove method commented out: // $this->remove($type);
Enabling this solves the problem, just wondering why it would be commented out?

After rendering notices on the front end I have to call:

to force removal.
  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Create New...