How can I remove a message shown from a different module?
Asked Answered
D

4

6

In Drupal 7, I could use the following code.

if ($_SESSION['messages']['status'][0] == t('Registration successful. You are now logged in.')) {
  unset($_SESSION['messages']['status']);
}

What is the equivalent code for Drupal 8?

Disarticulate answered 5/8, 2016 at 11:24 Comment(0)
G
17

First of all, in Drupal 8, messages are stored in the same $_SESSION['messages'] variable as before. However, using it directly is not a good way, as there exist drupal_set_message and drupal_get_messages functions, which you may freely use.

Then, status messages are shown using status-messages theme. This means that you can write preprocess function for it and make your alteration there:

function mymodule_preprocess_status_messages(&$variables) {
  $status_messages = $variables['message_list']['status'];
  // Search for your message in $status_messages array and remove it.
}

The main difference with Drupal 7, however, is that now status messages are not always strings, they may be objects of Markup class. They are wrappers around strings and may be cast to underlying string using magic method __toString. This means that they can be compared with and as strings:

function mymodule_preprocess_status_messages(&$variables) {
  if(isset($variables['message_list']['status'])){
   $status_messages = $variables['message_list']['status'];

   foreach($status_messages as $delta => $message) {
     if ($message instanceof \Drupal\Component\Render\MarkupInterface) {
       if ((string) $message == (string) t("Searched text")) {
         unset($status_messages[$delta]);
         break;
       }
     }
   }
  }
}
Ghirlandaio answered 5/8, 2016 at 20:46 Comment(1)
Sorry if it hurts you somehow. I removed that sentence. Actually, changing core files or contrib modules is a real problem which I often face to when finishing projects after somebody else, and I wanted to point to it.Ghirlandaio
D
2

Upon reading the related change record, I have discovered \Drupal::messenger()->deleteAll(). I hope this is useful to someone. UPDATE: You should NOT do this, as it removes all subsequent messages as well. Instead, do unset(['_symfony_flashes']['status'][0]).

Desiredesirea answered 4/10, 2019 at 9:33 Comment(0)
A
0

You can install the module Disable Messages and filter out messages by pattern in the configuration of the module.

For this particular case, you can filter out the message using the following pattern in the module configuration

Registration successful.*

Although the question is asked around Drupal 8 which is no longer supported, the module works for Drupal 7, 8, 9.

Accustom answered 24/4, 2022 at 5:16 Comment(0)
S
-3

You can solve your problem in more than one way.

First way:

You can make minor change in core user module. Go on:

\core\modules\user\src\RegisterForm.php

In that file you have line you can change:

drupal_set_message($this->t('Registration successful. You are now logged in.'));

NOTE: This is easiest way but in this case way you will edit Drupal core module and that is generally bad practice. In further development you could have problems like overwrite your changes when you do update.

Second way:

You can disable end user message using module. Disable message module have option you need. In module configuration you have text box where you can filter out messages shown to the end users.

enter image description here

Third way:

Messages in Drupal 8 are stored in a session variable and displayed in the page template via the $messages theme variable. When you want to modify the variables that are passed to the template before it's invoked you should use preprocess function. In your case here you can just search string in session variable and alert/remove it before it's displayed.

function yourmodule_preprocess_status_messages(&$variables) {

  $message = 'Registration successful. You are now logged in.';
  if (isset($_SESSION['messages'])) {
    foreach ($_SESSION['messages'] as $type => $messages) {
      if ($type == 'status') {
        $key = array_search($message, $messages);
        if ($key !== FALSE) {
          unset($_SESSION['messages'][$type][$key]);
        }
      }
    }
  }
}

(Note:Untested code, beware of typos)

Hope this helps!

Sidesman answered 5/8, 2016 at 19:3 Comment(1)
Yes it's a bad practice. I will add note in answer.Sidesman

© 2022 - 2024 — McMap. All rights reserved.