If you need Facebook like single thread messaging between two users
even while using new message form, using privatemsg in your drupal
website.
I have a patch for the privatemsg module.
There is a better way though, If you dont want to patch the privatemsg module,
you can use hook_privatemsg_message_presave_alter();
You can try db_query() to get an existing thread between current user and the recipient and then change the $message->thread_id there.
For sake of easier illustration I have created a patch
Nothing much on privatemsg.pages.inc I have added the redirect to the
thread view page, assigned previously in _privatemsg_send().
I have a patch for the privatemsg module.
There is a better way though, If you dont want to patch the privatemsg module,
you can use hook_privatemsg_message_presave_alter();
You can try db_query() to get an existing thread between current user and the recipient and then change the $message->thread_id there.
For sake of easier illustration I have created a patch
Index: privatemsg.module
===================================================================
--- privatemsg.module
+++ privatemsg.module
@@ -1832,7 +1836,7 @@
->fields($args)
->execute();
$message->mid = $mid;
-
+
// Thread ID is the same as the mid if it's the first message in the thread.
if (!isset($message->thread_id)) {
$message->thread_id = $mid;
@@ -1841,6 +1845,21 @@
// 2) Save message to recipients.
// Each recipient gets a record in the pm_index table.
foreach ($message->recipients as $recipient) {
+ // To continue old msg thread between two users when submitting new msg
+ if(count($message->recipients) == 1){
+ $res = db_query("select author, recipient, thread_id , name from {pm_message} msg
+ left join {pm_index} ind on msg.mid = ind.mid
+ left join {users} u on u.uid = ind.recipient
+ where ((recipient = :recipient and author = :uid) or (author = :recipient and recipient = :uid))
+ and (select count(distinct(recipient)) from {pm_index} where thread_id=ind.thread_id ) < 3
+ order by thread_id desc",array(':recipient'=>$recipient->recipient, ':uid' => $message->author->uid));
+ if($thread = $res->fetchObject()){
+ $thread_id = $thread->thread_id;
+ $_REQUEST['destination'] = 'messages/view/' . $thread_id;
+ $message->thread_id = $thread_id;
+ }
+
+ }
$query->values(array(
'mid' => $mid,
'thread_id' => $message->thread_id,
Index: privatemsg.pages.inc
===================================================================
--- privatemsg.pages.inc (revision 14816)
+++ privatemsg.pages.inc (working copy)
@@ -638,6 +638,10 @@
elseif (!empty($redirect)) {
$form_state['redirect'] = $redirect;
}
+ }else{
+ if($_REQUEST['destination'])
+ $form_state['redirect'] = $_REQUEST['destination'];
}
}
catch (Exception $e) {
Here I have tested if the message is sent to a single recipient, and
done the query to get one existing thread between the current user and
recipient and then assign the thread_id to the $message object.
<?php
if(count($message->recipients) == 1){
$res = db_query("select author, recipient, thread_id , name from {pm_message} msg
left join {pm_index} ind on msg.mid = ind.mid
left join {users} u on u.uid = ind.recipient
where ((recipient = :recipient and author = :uid) or (author = :recipient and recipient = :uid))
and (select count(distinct(recipient)) from {pm_index} where thread_id=ind.thread_id ) < 3
order by thread_id desc",array(':recipient'=>$recipient->recipient, ':uid' => $message->author->uid));
if($thread = $res->fetchObject()){
$thread_id = $thread->thread_id;
$_REQUEST['destination'] = 'messages/view/' . $thread_id;
$message->thread_id = $thread_id;
}
}
?>
+ $_REQUEST['destination'] = 'messages/view/' . $thread_id;
so that after new msg is sent the user gets into the thread view.+ if($_REQUEST['destination'])
+ $form_state['redirect'] = $_REQUEST['destination'];
No comments:
Post a Comment