diff --git a/privatemsg.module b/privatemsg.module index 5697650..825b3ca 100755 --- a/privatemsg.module +++ b/privatemsg.module @@ -583,17 +583,8 @@ function privatemsg_cron() { $query = _privatemsg_assemble_query('deleted', variable_get('privatemsg_flush_days', 30), variable_get('privatemsg_flush_max', 200)); foreach ($query->execute()->fetchCol() as $mid) { - $message = privatemsg_message_load($mid); - module_invoke_all('privatemsg_message_flush', $message); - - // Delete recipients of the message. - db_delete('pm_index') - ->condition('mid', $mid) - ->execute(); - // Delete message itself. - db_delete('pm_message') - ->condition('mid', $mid) - ->execute(); + // Delete each message + privatemsg_message_delete($mid); } } @@ -1313,9 +1304,9 @@ function _privatemsg_delete_data($account) { if (!empty($mids)) { // Delete recipient entries in {pm_index} of the messages the user wrote. - db_delete('pm_index') - ->condition('mid', $mids) - ->execute(); + foreach ($mids as $mid) { + privatemsg_message_delete($mid); + } } // Delete messages the user wrote. @@ -1680,7 +1671,7 @@ function privatemsg_new_thread($recipients, $subject, $body = NULL, $options = a $validated = _privatemsg_validate_message($message); if ($validated['success']) { - $validated['message'] = _privatemsg_send($message); + $validated['message'] = privatemsg_message_save($message); if ($validated['message'] !== FALSE) { _privatemsg_handle_recipients($validated['message']->mid, $validated['message']->recipients, FALSE); } @@ -1760,7 +1751,7 @@ function privatemsg_reply($thread_id, $body, $options = array()) { $message->subject = $first_message->subject; $validated = _privatemsg_validate_message($message); if ($validated['success']) { - $validated['message'] = _privatemsg_send($message); + $validated['message'] = privatemsg_message_save($message); if ($validated['message'] !== FALSE) { _privatemsg_handle_recipients($validated['message']->mid, $validated['message']->recipients, FALSE); } @@ -1865,7 +1856,7 @@ function _privatemsg_validate_message(&$message, $form = FALSE) { } /** - * Internal function to save a message. + * Public API to save a message. * * @param $message * A $message array with the data that should be saved. If a thread_id exists @@ -1875,7 +1866,7 @@ function _privatemsg_validate_message(&$message, $form = FALSE) { * @return * The updated $message array. */ -function _privatemsg_send($message) { +function privatemsg_message_save($message) { $transaction = db_transaction(); try { drupal_alter('privatemsg_message_presave', $message); @@ -2057,6 +2048,28 @@ function privatemsg_message_load_multiple(array $pmids, array $conditions = arra } /** + * Delete a message, notifying any interested parties. + * + * @param $mid + * Message ID. + * + * @ingroup api + */ +function privatemsg_message_delete($mid) { + $message = privatemsg_message_load($mid); + module_invoke_all('privatemsg_message_flush', $message); + // Delete recipients of the message. + db_delete('pm_index') + ->condition('mid', $mid) + ->execute(); + // Delete message itself. + db_delete('pm_message') + ->condition('mid', $mid) + ->execute(); +} + + +/** * Generates a query based on a query id. * * @param $query @@ -3508,3 +3521,24 @@ function privatemsg_get_default_setting_ids($account = NULL) { 'global' => array(0), ); } + +/** + * Do not respond to message hooks that will cause conflicts. + * + * The message module fires entity hooks that collide with some of the methods + * in privatemsg. This is an attempt to avoid collisions. + * + * @param array $implementations + * Array list of implementations. + * @param string $hook + * Name of the currently being checked hook. + */ +function privatemsg_module_implements_alter(&$implementations, $hook) { + if ($hook == 'message_load') { + unset($implementations['privatemsg']); + } + + if ($hook == 'message_delete') { + unset($implementations['privatemsg']); + } +} diff --git a/privatemsg.pages.inc b/privatemsg.pages.inc index e4de101..0967ba3 100644 --- a/privatemsg.pages.inc +++ b/privatemsg.pages.inc @@ -700,7 +700,7 @@ function privatemsg_new_submit($form, &$form_state) { $recipient_names[] = privatemsg_recipient_format($recipient); } try { - $message = _privatemsg_send($message); + $message = privatemsg_message_save($message); _privatemsg_handle_recipients($message->mid, $message->recipients); drupal_set_message(t('A message has been sent to !recipients.', array('!recipients' => implode(', ', $recipient_names)))); // Only redirect on new threads.