MENU_LOCAL_TASK,
'title' => 'Message log',
'page callback' => 'messaging_debug_user_page',
'page arguments' => array(1),
'access callback' => 'messaging_debug_access',
'access arguments' => array(1),
);
$items['admin/messaging/settings/test'] = array(
'title' => 'Test',
'description' => 'Test message sending',
'page callback' => 'drupal_get_form',
'page arguments' => array('messaging_debug_post_form'),
'access arguments' => array('administer messaging'),
'weight' => -10,
'type' => MENU_LOCAL_TASK,
);
return $items;
}
/**
* Access calback
*/
function messaging_debug_access($account) {
global $user;
return $account->uid && (($account->uid == $user->uid) || user_access('administer messaging'));
}
/**
* Implementation of hook_block()
*/
function messaging_debug_block($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'list':
$blocks[0]['info'] = t('Debug: Post message');
$blocks[1]['info'] = t('Debug: Message log');
return $blocks;
case 'view':
switch ($delta) {
case 0:
$block['subject'] = t('Post message');
$block['content'] = drupal_get_form('messaging_debug_post_form');
return $block;
case 1:
if (!empty($_SESSION['messaging_debug_store'])) {
$block['subject'] = t('Message log');
foreach ($_SESSION['messaging_debug_store'] as $index => $message) {
list($text, $variables) = _messaging_debug_log_text($message);
$description = t($text, $variables);
$form[$index]= array('#type' => 'fieldset',
'#title' => truncate_utf8($description, 20),
'#description' => $description,
'#collapsible' => TRUE, '#collapsed' => TRUE);
$form[$index][] = array('#type' => 'item', '#title' => t('Subject'), '#value' => check_plain($message->subject));
$form[$index][] = array('#type' => 'item', '#title' => t('Body'), '#value' => check_plain($message->body));
}
$block['content'] = drupal_render($form);
unset($_SESSION['messaging_debug_store']);
return $block;
}
break;
}
break;
}
}
/**
* Incoming message form
*/
function messaging_debug_post_form() {
global $user;
// Availbable sending methods
$form['method'] = array(
'#title' => t('Send method'),
'#type' => 'select',
'#options' => messaging_method_list(),
'#default_value' => messaging_method_default(),
);
$form['to'] = array(
'#type' => 'textfield',
'#title' => t('Destination'),
'#size' => 20,
'#autocomplete_path' => 'user/autocomplete',
'#default_value' => $user->name,
);
$form['subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#size' => 20,
);
$form['body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
);
$form['submit'] = array('#type' => 'submit', '#value' => t('Send'));
return $form;
}
/**
* Post test message
*/
function messaging_debug_post_form_submit($form, $form_state) {
global $user;
// Convert body in array of lines
$body = split("\n", $form_state['values']['body']);
$body = array_map('trim', $body);
$message = (object)array(
'type' => 'debug',
'subject' => $form_state['values']['subject'],
'body' => $body,
);
// Destination may be account or plain parameter/s
$destination = $form_state['values']['to'];
if ($account = user_load(array('name' => $destination))) {
$result = messaging_message_send_user($account, $message, $form_state['values']['method']);
} else {
$result = messaging_message_send(array($destination), $message, $form_state['values']['method']);
}
drupal_set_message(t('Sent message with result: %result', array('%result' => $result ? 'OK' : 'Error')));
}
/**
* Implementation of hook_form_alter()
*/
function messaging_debug_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'messaging_admin_settings') {
$form['general']['messaging_debug'] = array(
'#title' => t('Debug mode'),
'#type' => 'radios',
'#options' => array(t('Disabled'), t('Enabled')),
'#default_value' => variable_get('messaging_debug', 0),
'#description' => t('If enabled, messages wont be sent out but logged to watchdog, and displayed in the page footer.')
);
}
}
/**
* Menu callback. Display pending messages to the user
*
* Sample Implementation of messaging pull methods
*/
function messaging_debug_user_page($account) {
drupal_set_title(t('Messages for %name', array('%name' => $account->name)));
// Fetch all pending messages.
$output = '';
// Use this method's info for all the messages
$messages = messaging_store('get', array('uid' => $account->uid), array('mqid DESC'), MESSAGING_DEBUG_PAGER, 0);
if ($messages) {
$header = array(t('Method'), t('Subject'), t('Body'));
foreach ($messages as $message) {
// Check plain everything so we can actually see the mark up if any
$rows[] = array($message->method, check_plain($message->subject), check_plain($message->body));
}
$output .= theme('table', $header, $rows);
$output .= theme('pager', array(), MESSAGING_DEBUG_PAGER);
} else {
$output .= t('No logged messages');
}
return $output;
}
/**
* Implementation of hook_messaging
*/
function messaging_debug_messaging($op = 'info', $type = NULL) {
switch($op) {
case 'send methods':
$info['debug'] = array(
'title' => t('Debug'),
'name' => t('Debug'),
'destination' => 'name',
'type' => MESSAGING_TYPE_PUSH,
'glue' => '
',
'description' => t('The messages will be just logged (And printed on page if Devel module enabled).'),
'send callback' => 'messaging_debug_send_msg',
);
return $info;
}
}
/**
* Implementation of hook_action_info().
*/
function messaging_debug_action_info() {
return array(
'messaging_debug_watchdog_msg' => array(
'type' => 'messaging',
'description' => t('Log message to watchdog'),
'configurable' => FALSE,
'hooks' => array(
'messaging' => array('incoming', 'outgoing'),
),
),
'messaging_debug_devlog_msg' => array(
'description' => t('Log message through devel module'),
'type' => 'messaging',
'configurable' => FALSE,
'hooks' => array(
'messaging' => array('incoming', 'outgoing'),
)
),
'messaging_debug_block_msg' => array(
'description' => t('Display message in block'),
'type' => 'messaging',
'configurable' => FALSE,
'hooks' => array(
'messaging' => array('incoming', 'outgoing'),
)
),
);
}
/**
* Implementation of hook_messaging_methods_alter()
*/
function messaging_debug_messaging_methods_alter(&$info) {
// If debug enabled, replace all send callbacks
if (variable_get('messaging_debug', 0)) {
foreach (array_keys($info) as $method) {
$info[$method]['send callback'] = _messaging_callback('messaging_debug_send_msg');
//$info[$method]['user callback'] = _messaging_callback('messaging_debug_send_user');
}
}
}
/**
* Messaging processor
*/
function messaging_debug_watchdog_msg($message, $context) {
list($text, $variables) = _messaging_debug_log_text($message);
watchdog('messaging', $text, $variables);
// Return message without changes for further processing
return $message;
}
/**
* Message processor, just log incoming messages
*/
function messaging_debug_devlog_msg($message, $context) {
if (module_exists('devel')) {
list($text, $variables) = _messaging_debug_log_text($message);
dsm($message, t($text, $variables));
}
// Return message without changes for further processing
return $message;
}
/**
* Message processor, store for display in a block
*/
function messaging_debug_block_msg($message, $context) {
$_SESSION['messaging_debug_store'][] = $message;
return $message;
}
/**
* Format message as loggable text
*/
function _messaging_debug_log_text($message) {
$source = $message->source;
$content = $message->render();
$variables = array(
'%subject' => $content->subject,
);
if ($source['type'] == 'incoming') {
$text = 'Incoming message, method %method, channel %channel: %subject';
$variables += array('%method' => $source['method'], '%channel' => $source['channel']);
} elseif ($source['type'] == 'outgoing') {
$text = 'Outgoing message, method %method: %subject';
$variables += array('%method' => $content->method);
} else {
$text = 'Unknown message type, full dump: %message';
$variables['%message'] = print_r($message, TRUE);
}
return array($text, $variables);
}
/**
* Messaging debug logs
*
* Sometimes we are passing objects as variables, we need to make sure they are not by reference
* We can let this be for normal logs but for debugging we want accurate unique data on each stage
*
* Another issue is that objects stored in session are serialized and then unserialized when session
* starts, that if classes are not there yet converts them to __PHP_Incomplete_Class Object
*
*/
function messaging_debug_log($txt = NULL, $variables = NULL, $type = 'debug') {
// Sometimes we are passing objects as variables, we need to make sure they are not by reference
// We can let this be for normal logs but for debugging we want accurate unique data on each stage
$objects = NULL;
if ($variables) {
foreach ($variables as $key => $value) {
if (is_object($value)) {
$objects[$key] = $value;
unset($variables[$key]);
}
}
if (!empty($objects)) {
$variables['debug_objects'] = array_map('serialize', $objects);
}
}
return _messaging_log($type, $txt, $variables);
}
/**
* Format complex log as collapsible fieldset
*/
function _messaging_debug_format_log($type, $string, $append, $objects) {
drupal_add_js('misc/collapse.js');
$content = '';
/*
foreach ($objects as $key => $value) {
$content .= _messaging_debug_format_object($value, $key);
}
*/
if (!empty($objects['debug_objects'])) {
$objects = array_merge($objects, array_map('unserialize', $objects['debug_objects']));
unset($objects['debug_objects']);
}
$content = _messaging_debug_format_array($objects);
return _messaging_debug_format_group($string, $content, $append ? implode(' ', $append) : '');
}
/**
* Format js collapsed content
*/
function _messaging_debug_format_group($title, $content, $description) {
$output = '
' . print_r($value) . ''; } /* $rows = array(); $data = is_array($data) ? $data : (array)$data; foreach ($data as $key => $value) { if (is_object($value) || is_array($value)) { $content = _messaging_debug_format_object($value, $key); } elseif (is_string($value)) { // Make line endings visible $content = str_replace("\n", '\n
!body', $variables); return TRUE; } /** * Implementation of hook_footer() * * Only debugging functionality for administrators, prints out a table with logs * * Note: this is useless when there is a redirection after submitting. Enable Devel option 'Display redirection page' to see them. */ function messaging_debug_footer() { if (user_access('administer messaging') && $logs = messaging_log_get()) { return messaging_log_format($logs); } } /* function messaging_debug_exit() { if (isset($_SESSION['messaging_log'])) { $_SESSION['messaging_log_debug'] = serialize($_SESSION['messaging_log']); } } */