function privatemsg_operation_execute

1 privatemsg.module privatemsg_operation_execute($operation, $threads, $account = null)
7-1 privatemsg.module privatemsg_operation_execute($operation, $threads, $account = NULL)
7-2 privatemsg.module privatemsg_operation_execute($operation, $threads, $account = NULL)
6-2 privatemsg.module privatemsg_operation_execute($operation, $threads, $account = NULL)

Execute an operation on a number of threads.


$operation: The operation that should be executed. @see hook_privatemsg_thread_operations()

$threads: An array of thread ids. The array is filtered before used, a checkboxes array can be directly passed to it.

3 calls to privatemsg_operation_execute()
privatemsg_filter_add_tag_submit in privatemsg_filter/privatemsg_filter.module
Form callback for adding a tag to threads.
privatemsg_filter_remove_tag_submit in privatemsg_filter/privatemsg_filter.module
Form callback for removing a tag to threads.
privatemsg_list_submit in ./
Process privatemsg_list form submissions.


./privatemsg.module, line 2211
Allows users to send private messages to other users.


function privatemsg_operation_execute($operation, $threads, $account = NULL) {
  // Filter out unchecked threads, this gives us an array of "checked" threads.
  $threads = array_filter($threads);

  if (empty($threads)) {
    // Do not execute anything if there are no checked threads.
    drupal_set_message(t('You must first select one (or more) messages before you can take that action.'), 'warning');
    return FALSE;
  // Add in callback arguments if present.
  if (isset($operation['callback arguments'])) {
    $args = array_merge(array($threads), $operation['callback arguments']);
  else {
    $args = array($threads);

  // Add the user object to the arguments.
  if ($account) {
    $args[] = $account;

  // Execute the chosen action and pass the defined arguments.
  call_user_func_array($operation['callback'], $args);

  if (!empty($operation['success message'])) {
    drupal_set_message($operation['success message']);

  // Check if that operation has defined an undo callback.
  if (isset($operation['undo callback']) && $undo_function = $operation['undo callback']) {
    // Add in callback arguments if present.
    if (isset($operation['undo callback arguments'])) {
      $undo_args = array_merge(array($threads), $operation['undo callback arguments']);
    else {
      $undo_args = array($threads);

    // Avoid saving the complete user object in the session.
    if ($account) {
      $undo_args['account'] = $account->uid;
    // Store the undo callback in the session and display a "Undo" link.
    // @todo: Provide a more flexible solution for such an undo action, operation defined string for example.
    $_SESSION['privatemsg']['undo callback'] = array(
      'function' => $undo_function,
      'args' => $undo_args,
    $undo = url('messages/undo/action', array('query' => drupal_get_destination()));

    drupal_set_message(t('The previous action can be <a href="!undo">undone</a>.', array('!undo' => $undo)));

  // Allow modules to respond to the operation.
  module_invoke_all('privatemsg_operation_executed', $operation, $threads, $account);

  return TRUE;