You are here

better_messages.module in Better Messages 7.2

File

better_messages.module
View source
<?php

drupal_set_message('hello');

/**
 * Implement of hook_help().
 * 
 * @todo Add help.
 */
function better_messages_help($path, $arg) {
  switch ($path) {
    case 'admin/config/user-interface/better-messages':
      return '';
  }
}

/**
 * Implements hook_menu().
 */
function better_messages_menu() {
  $items = array();
  $items['admin/config/user-interface/better-messages'] = array(
    'title' => 'Better Messages settings',
    'description' => 'Better handling of Drupal messages UI.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'better_messages_admin_overview_form',
    ),
    'access arguments' => array(
      'administer better messages',
    ),
    'file' => 'better_messages.admin.inc',
  );
  $items['admin/config/user-interface/better-messages/add'] = array(
    'title' => 'Add skin',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'better_messages_admin_skin_form',
      4,
    ),
    'access arguments' => array(
      'administer better messages',
    ),
    'file' => 'better_messages.admin.inc',
    'weight' => 1,
    'type' => MENU_LOCAL_ACTION,
  );
  $items['admin/config/user-interface/better-messages/edit/%'] = array(
    'title' => 'Edit Better Messages skin settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'better_messages_admin_skin_form',
      4,
      5,
    ),
    'access arguments' => array(
      'administer better messages',
    ),
    'file' => 'better_messages.admin.inc',
  );
  $items['admin/config/user-interface/better-messages/clone/%'] = array(
    'title' => 'Edit Better Messages skin settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'better_messages_admin_skin_form',
      4,
      5,
    ),
    'access arguments' => array(
      'administer better messages',
    ),
    'file' => 'better_messages.admin.inc',
  );

  /*
  $items['admin/config/user-interface/better-messages/revert/%'] = array(
    'title' => 'Revert skin',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('better_messages_admin_skin_delete_form', 4),
    'access arguments' => array('administer better messages'),
    'file' => 'better_messages.admin.inc',
    'type' => MENU_CALLBACK,
  );
  */
  $items['admin/config/user-interface/better-messages/delete/%'] = array(
    'title' => 'Delete skin',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'better_messages_admin_skin_delete_form',
      5,
    ),
    'access arguments' => array(
      'administer better messages',
    ),
    'file' => 'better_messages.admin.inc',
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Implements hook_permission().
 */
function better_messages_permission() {
  return array(
    'administer better messages' => array(
      'title' => t('Administer Better Messages configuration'),
      'description' => t('Allows users to <a href="@href">administer Better Messages</a> site-wide configuration.', array(
        '@href' => url('admin/config/user-interface/better-messages'),
      )),
      'restrict access' => TRUE,
    ),
    'access better messages' => array(
      'title' => t('Allow users to see Better Messages messages'),
      'description' => t('If not granted, default Drupal messages will appear instead.'),
    ),
  );
}

/**
 * Implements hook_theme().
 */
function better_messages_theme() {
  return array(
    'better_messages' => array(
      'variables' => array(
        'display' => null,
      ),
    ),
    'better_messages_skin' => array(
      'template' => 'better_messages_skin',
      'variables' => array(
        'messages' => null,
      ),
    ),
    'better_messages_content' => array(
      'variables' => array(
        'display' => null,
      ),
    ),
    'better_messages_admin_overview_list' => array(
      'render element' => 'form',
    ),
  );
}

/**
 * Implements hook_theme_registry_alter().
 */
function better_messages_theme_registry_alter(&$theme_registry) {
  $theme_registry['status_messages']['function'] = 'theme_better_messages';
}

/**
 * Helper function to process valid path visiblity along with user access.
 */
function _better_messages_is_visible() {
  $settings = _better_messages_get_settings();
  $visibility = $settings['visibility'];
  if ($visibility['pages']) {

    // Convert path to lowercase. This allows comparison of the same path
    // with different case. Ex: /Page, /page, /PAGE.
    $pages = drupal_strtolower($visibility['pages']);
    if ($visibility['visibility'] < 2) {

      // Convert the Drupal path to lowercase
      $path = drupal_strtolower(drupal_get_path_alias($_GET['q']));

      // Compare the lowercase internal and lowercase path alias (if any).
      $page_match = drupal_match_path($path, $pages);
      if ($path != $_GET['q']) {
        $page_match = $page_match || drupal_match_path($_GET['q'], $pages);
      }
      $page_match = !($visibility['visibility'] xor $page_match);
    }
    elseif (module_exists('php')) {
      $page_match = php_eval($visibility['pages']);
    }
    else {
      $page_match = FALSE;
    }
  }
  else {
    $page_match = TRUE;
  }
  return $page_match && user_access('access better messages');
}

/**
 * Helper function to get the settings variable.
 */
function _better_messages_get_settings($skin = NULL, $all = FALSE) {
  $return = array();
  if ($skin) {
    $results = db_select('better_messages', 'bm')
      ->fields('bm')
      ->condition('name', $skin, '=')
      ->execute();
  }
  else {
    if ($all) {
      $results = db_select('better_messages', 'bm')
        ->fields('bm')
        ->execute();
    }
    else {
      return FALSE;
    }
  }
  while ($result = $results
    ->fetchAssoc()) {
    $return[$result['name']] = unserialize($result['data']);
  }
  return $return;
}

/**
 * Helper function to add required files.
 */
function _better_messages_add_files() {
  $default_skin = variable_get('better_messages_default');
  $settings = _better_messages_get_settings($default_skin);
  drupal_add_css(drupal_get_path('module', 'better_messages') . '/skins/' . $settings['skin'] . '/skin.css');
  drupal_add_js(drupal_get_path('module', 'better_messages') . '/better_messages.js', array(
    'scope' => 'footer',
    'weight' => 10,
  ));

  // Add required jQuery UI Libraries.
  if ($settings['jquery_ui']['draggable']) {
    drupal_add_library('system', 'ui.draggable');
  }
  if (!empty($settings['animation']['popin']['easing']) || !empty($settings['animation']['popout']['easing'])) {
    drupal_add_library('system', 'effects');
  }

  // Remove administration settings from JavaScript settings.
  unset($settings['admin']);
  drupal_add_js(array(
    'betterMessages' => $settings,
  ), array(
    'type' => 'setting',
  ));
}

/**
 * Theme function that switches default Drupal messages with Better Messages.
 */
function theme_better_messages($variables) {
  $default_messages = theme('better_messages_content');

  // Check if Better Messages is visible on this page, and that current user has access to view it.
  if (_better_messages_is_visible() && FALSE) {
    _better_messages_add_files();
    $better_messages = theme('better_messages_skin', array(
      'messages' => $default_messages,
    ));
    $default_messages = "<noscript>\n" . $default_messages . "\n</noscript>\n";
    $default_messages .= "<div id=\"better-messages-wrapper\" style=\"display:none;z-index:9999;\">\n" . $better_messages . "</div>";
  }
  return $default_messages;
}

/**
 * This function is exactly the same as theme_status_messages.
 * We had to override it to make it called from theme('status_messages')
 * call theme_better_messages() and then call theme_status_messages().
 *
 * @param $variables
 *   An associative array containing:
 *   - display: (optional) Set to 'status' or 'error' to display only messages
 *     of that type.
 */
function theme_better_messages_content($variables) {
  $display = $variables['display'];
  $output = '';
  $status_heading = array(
    'status' => t('Status message'),
    'error' => t('Error message'),
    'warning' => t('Warning message'),
  );
  foreach (drupal_get_messages($display) as $type => $messages) {
    $output .= "<div class=\"messages {$type}\">\n";
    if (!empty($status_heading[$type])) {
      $output .= '<h2 class="element-invisible">' . $status_heading[$type] . "</h2>\n";
    }
    if (count($messages) > 1) {
      $output .= " <ul>\n";
      foreach ($messages as $message) {
        $output .= '  <li>' . $message . "</li>\n";
      }
      $output .= " </ul>\n";
    }
    else {
      $output .= $messages[0];
    }
    $output .= "</div>\n";
  }
  return $output;
}

Functions

Namesort descending Description
better_messages_help Implement of hook_help().
better_messages_menu Implements hook_menu().
better_messages_permission Implements hook_permission().
better_messages_theme Implements hook_theme().
better_messages_theme_registry_alter Implements hook_theme_registry_alter().
theme_better_messages Theme function that switches default Drupal messages with Better Messages.
theme_better_messages_content This function is exactly the same as theme_status_messages. We had to override it to make it called from theme('status_messages') call theme_better_messages() and then call theme_status_messages().
_better_messages_add_files Helper function to add required files.
_better_messages_get_settings Helper function to get the settings variable.
_better_messages_is_visible Helper function to process valid path visiblity along with user access.