Can we Modify Drupal Status Messages?

May 28, 2009
blog author

Appno Blogger

Appnovation Coop

If you've ever wished you had control over Drupal status messages generated by contributed modules and/or ever longed for hook_message_alter, you may be interested in this little Drupal web developer trick for changing these messages. First, add this theming function to your template.php file (the function name "phptemplate_" may be replaced with your theme name):

 

function phptemplate_status_messages($display = NULL) {
  $output = '';
  foreach (drupal_get_messages($display) as $type => $messages) {
    if (count($messages) > 1) {
      $list  = '';
      $items = '';
      foreach ($messages as $message) {
        
        modify_message($message);
        if (!empty($message)) {
          $items .= '  

  • '. $message ."

\n";
        }
      }
      if (!empty($items)) {
        $list = "

 

      \n";

 

              $list .= $items;

 

            $list .= "

\n";
      }
    }
    else {
      $message = $messages[0];
      modify_message($message);
      $list = $message;
    }
    
    if (!empty($list)) {
      $output .= "

\n";
      $output .= $list;
      $output .= "

\n";
    }
  }
  return $output;
}

Now, all you have to do is to create another function which will be hiding/modifying your status messages. Here is a function with examples of these changes:
/**
* Modify/hide a message from user:
*
* @param string $message
*/
function modify_message(&$message) {
//Add here whatever you need to recognize and modify this message:

  global $user;
    
  // Hide these messages:
  $message = preg_replace('/No posts in this group\./', '', $message);
  $message = preg_replace('/Fetching data from GeoNames failed.*/', '', $message);
  
  //If the administrator has removed _himself_, the message should instead of
  //"Username_ABC is no longer a group administrator." say:
  //"You are no longer an administrator for this group. To regain administrator privileges, please contact an administrator for this group."
  $current_name = $user->name;
  preg_match('/(.*) is no longer a\.*/', $message, $matches_A);
   //check if the current user is the same as the user in the message:
  if ($matches_A[1]) preg_match("/$current_name/", $matches_A[1], $matches_B);
  if ($matches_B[0]) $message = "You are no longer an administrator for this group. To regain administrator privileges, please contact an administrator for this group.";
}

Et, voila.