From f9c2c734323483ab5d10bc78f64a7228dcf434cc Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Wed, 15 Jan 2014 16:29:30 +0000 Subject: [PATCH] Get merging contact into mail template file working --- etemplate/inc/class.bo_merge.inc.php | 58 ++++++++++++++++++++------- mail/inc/class.mail_bo.inc.php | 23 ++--------- mail/inc/class.mail_compose.inc.php | 59 +++++++++++++++++++++++++++- mail/inc/class.mail_ui.inc.php | 2 +- 4 files changed, 105 insertions(+), 37 deletions(-) diff --git a/etemplate/inc/class.bo_merge.inc.php b/etemplate/inc/class.bo_merge.inc.php index 99a86fde85..88e53b1a62 100644 --- a/etemplate/inc/class.bo_merge.inc.php +++ b/etemplate/inc/class.bo_merge.inc.php @@ -1425,11 +1425,11 @@ abstract class bo_merge { case 'message/rfc822': //error_log(__METHOD__."('$document', ".array2string($ids).", '$name', dirs='$dirs')=>$content_url ->".function_backtrace()); - $bofelamimail = felamimail_bo::getInstance(); - $bofelamimail->openConnection(); + $mail_bo = mail_bo::getInstance(); + $mail_bo->openConnection(); try { - $msgs = $bofelamimail->importMessageToMergeAndSend($this, $content_url, $ids, $_folder='', $importID=''); + $msgs = $mail_bo->importMessageToMergeAndSend($this, $content_url, $ids, $_folder='', $importID=''); } catch (egw_exception_wrong_userinput $e) { @@ -1742,10 +1742,7 @@ abstract class bo_merge ); if ($file['mime'] == 'message/rfc822') { - // does not work on children for some reason, now handled in felamimail_bo::importMessageToMergeAndSend - //$documents[$file['mime']]['allowOnMultiple'] = $GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook'; - // only need confirmation for multiple receipients for addressbook, as for others we can't do it anyway - if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook') $current_level[$prefix.$file['name']]['confirm_multiple'] = lang('Do you want to send the message to all selected entries, WITHOUT further editing?'); + self::document_mail_action($current_level[$prefix.$file['name']], $file); } break; @@ -1776,10 +1773,7 @@ abstract class bo_merge ); if ($file['mime'] == 'message/rfc822') { - // does not work on children for some reason, now handled in felamimail_bo::importMessageToMergeAndSend - //$documents[$file['mime']]['allowOnMultiple'] = $GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook'; - // only need confirmation for multiple receipients for addressbook, as for others we can't do it anyway - if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook') $documents[$file['mime']]['confirm_multiple'] = lang('Do you want to send the message to all selected entries, WITHOUT further editing?'); + self::document_mail_action($documents[$prefix.$file['name']], $file); } } $documents[$file['mime']]['children'][$prefix.$file['name']] = egw_vfs::decodePath($file['name']); @@ -1794,10 +1788,7 @@ abstract class bo_merge ); if ($file['mime'] == 'message/rfc822') { - // does not work on children for some reason, now handled in felamimail_bo::importMessageToMergeAndSend - //$documents[$file['mime']]['allowOnMultiple'] = $GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook'; - // only need confirmation for multiple receipients for addressbook, as for others we can't do it anyway - if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook') $documents[$prefix.$file['name']]['confirm_multiple'] = lang('Do you want to send the message to all selected entries, WITHOUT further editing?'); + self::document_mail_action($documents[$prefix.$file['name']], $file); } } } @@ -1813,6 +1804,43 @@ abstract class bo_merge ); } + /** + * Set up a document action for an eml (email) document + * + * Email (.eml) documents get special action handling. They don't send a file + * back to the client like the other documents. Merging for a single selected + * contact opens a compose window, multiple contacts just sends. + * + * @param Array &$action Action to be modified for mail + * @param Array $file Array of information about the document from egw_vfs::find + * @return void + */ + private static function document_mail_action(Array &$action, $file) + { + unset($action['postSubmit']); + + // These parameters trigger compose + merge + $extra = array( + 'from' => 'merge', + 'document' => $file['path'], + ); + $action['confirm_multiple'] = lang('Do you want to send the message to all selected entries, WITHOUT further editing?') . + lang('Popup will close when finished'); + + // egw.open() would work, but nextmatch actions only passes 1 ID through + //$action['egw_open'] = 'edit-mail--'.implode('&',$extra); + // + // We use location and send the popup info anyway instead + $action['nm_action'] = 'location'; + $action['popup'] = egw_link::get_registry('mail', 'edit_popup'); + $action['url'] = egw_link::get_registry('mail', 'edit') + $extra + array( + // Mail edit requires ID to have a value before it will look at the other variables + egw_link::get_registry('mail', 'edit_id') => 'true', + 'preset[mailtocontactbyid]' => '$id', + ); + $action['target'] = 'compose_' .$file['path']; + } + /** * Check if given document (relative path from document_actions()) exists in one of the given dirs * diff --git a/mail/inc/class.mail_bo.inc.php b/mail/inc/class.mail_bo.inc.php index 7fe7786884..d6147ac93a 100644 --- a/mail/inc/class.mail_bo.inc.php +++ b/mail/inc/class.mail_bo.inc.php @@ -5209,7 +5209,7 @@ class mail_bo * @param string $importID ID for the imported message, used by attachments to identify them unambiguously * @return mixed array of messages with success and failed messages or exception */ - function importMessageToMergeAndSend(bo_merge $bo_merge, $document, $SendAndMergeTocontacts, &$_folder, $importID='') + function importMessageToMergeAndSend(bo_merge $bo_merge, $document, $SendAndMergeTocontacts, &$_folder, &$importID='') { $importfailed = false; $processStats = array('success'=>array(),'failed'=>array()); @@ -5291,7 +5291,7 @@ class mail_bo //error_log(__METHOD__.__LINE__.' ID:'.$val.' Data:'.array2string($contact)); $email = ($contact['email'] ? $contact['email'] : $contact['email_home']); $nfn = ($contact['n_fn'] ? $contact['n_fn'] : $contact['n_given'].' '.$contact['n_family']); - $activeMailProfiles = $this->mail->getAccountIdentities($this->profileID); + $activeMailProfiles = $this->getAccountIdentities($this->profileID); $activeMailProfile = array_shift($activeMailProfiles); //error_log(__METHOD__.__LINE__.array2string($activeMailProfile)); $mailObject->From = $activeMailProfile['ident_email']; @@ -5321,7 +5321,7 @@ class mail_bo //error_log(__METHOD__.__LINE__.' Result:'.$mailObject->Body.' error:'.array2string($e)); if (!empty($AltBody)) $mailObject->AltBody = $bo_merge->merge_string($AltBody, $val, $e, $mailObject->AltBodyContentType, array(), self::$displayCharset); - $ogServer = emailadmin_account::read($_profileID)->smtpServer(); + $ogServer = emailadmin_account::read($this->profileID)->smtpServer(); #_debug_array($ogServer); $mailObject->Host = $ogServer->host; $mailObject->Port = $ogServer->port; @@ -5424,23 +5424,8 @@ class mail_bo // no send, save successful, and message_uid present if ($savefailed===false && $messageUid && is_null($sendOK)) { + $importID = $messageUid; $openComposeWindow = true; - list($fm_width,$fm_height) = explode('x',egw_link::get_registry('felamimail','view_popup')); - $linkData = array - ( - 'menuaction' => 'felamimail.uicompose.composeFromDraft', - 'uid' => $messageUid, - 'folder' => base64_encode($_folder), - 'icServer' => $this->profileID, - 'method' => 'importMessageToMergeAndSend', - ); - $composeUrl = egw::link('/index.php',$linkData); - //error_log(__METHOD__.__LINE__.' ComposeURL:'.$composeUrl); - $GLOBALS['egw_info']['flags']['java_script_thirst'] .= '"; - $processStats['success'][] = lang("Saving of message %1 succeeded. Check Folder %2.",$Subject,$_folder); } } else diff --git a/mail/inc/class.mail_compose.inc.php b/mail/inc/class.mail_compose.inc.php index ad8b58f1af..5d2938fedc 100644 --- a/mail/inc/class.mail_compose.inc.php +++ b/mail/inc/class.mail_compose.inc.php @@ -716,7 +716,7 @@ class mail_compose $addressbookprefs =& $GLOBALS['egw_info']['user']['preferences']['addressbook']; if (method_exists($GLOBALS['egw']->contacts,'search')) { - $addressArray = split(',',$_REQUEST['preset']['mailtocontactbyid']); + $addressArray = explode(',',$_REQUEST['preset']['mailtocontactbyid']); foreach ((array)$addressArray as $id => $addressID) { $addressID = (int) $addressID; @@ -1249,7 +1249,7 @@ class mail_compose * @param type $mail_id If composing based on an existing mail, this is the ID of the mail * @param type $part_id For multi-part mails, indicates which part * @param type $from Indicates what the mail is based on, and how to extract data. - * One of 'compose', 'composeasnew', 'reply', 'reply_all' or 'forward' + * One of 'compose', 'composeasnew', 'reply', 'reply_all', 'forward' or 'merge' * @param boolean $_focusElement varchar subject, to, body supported * @param boolean $suppressSigOnTop * @param boolean $isReply @@ -1315,6 +1315,56 @@ class mail_compose error_log('Unhandled compose source: ' . $from); } } + else if ($from == 'merge' && $_REQUEST['document']) + { + /* + * Special merge from everywhere else becase all other apps merge gives + * a document to be downloaded, this either opens a compose dialog or + * just sends emails + */ + // Merge selected ID (in mailtocontactbyid or $mail_id) into given document + $document_merge = new addressbook_merge(); + $this->mail_bo->openConnection(); + $merge_ids = $_REQUEST['preset']['mailtocontactbyid'] ? $_REQUEST['preset']['mailtocontactbyid'] : $mail_id; + $merge_ids = is_array($merge_ids) ? $merge_ids : explode(',',$merge_ids); + try + { + $merged_mail_id = ''; + $folder = ''; + if($error = $document_merge->check_document($_REQUEST['document'],'')) + { + $content['msg'] = $error; + return $content; + } + + // Merge does not work correctly (missing to) if current app is not addressbook + $GLOBALS['egw_info']['flags']['currentapp'] = 'addressbook'; + + // Actually do the merge + $results = $this->mail_bo->importMessageToMergeAndSend($document_merge, egw_vfs::PREFIX . $_REQUEST['document'], $merge_ids, $folder, $merged_mail_id); + + // Handle results - one email open compose, more than one just sent + if(count($merge_ids) <= 1) + { + $merged_mail_id = trim($GLOBALS['egw_info']['user']['account_id']).mail_ui::$delimiter. + $this->mail_bo->profileID.mail_ui::$delimiter. + base64_encode($folder).mail_ui::$delimiter.$merged_mail_id; + $content = $this->getComposeFrom($merged_mail_id, $part_id, 'composefromdraft', $_focusElement, $suppressSigOnTop, $isReply); + } + else + { + $success = implode(', ',$results['success']); + $fail = implode(', ', $results['failed']); + if($success) egw_framework::message($success, 'success'); + egw_framework::window_close($fail); + } + } + catch (egw_exception_wrong_userinput $e) + { + // if this returns with an exeption, something failed big time + $content['msg'] = $e->getMessage(); + } + } return $content; } @@ -1416,6 +1466,11 @@ class mail_compose } foreach((array)$headers['TO'] as $val) { + if(!is_array($val)) + { + $this->sessionData['to'][] = $val; + continue; + } if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { continue; } diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php index c91a073d12..1c84000d53 100644 --- a/mail/inc/class.mail_ui.inc.php +++ b/mail/inc/class.mail_ui.inc.php @@ -143,7 +143,7 @@ class mail_ui )); } - $GLOBALS['egw']->session->commit_session(); + //$GLOBALS['egw']->session->commit_session(); //_debug_array($this->mail_bo->mailPreferences); //$endtime = microtime(true) - $starttime; //error_log(__METHOD__.__LINE__. " time used: ".$endtime);