/** * A draft can be loaded from the database if an id was supplied * or filled with dummy data if no id was supplied. If no id was supplied, * the user wants to create a new email. In this case, the id defaults to * -1. If the user requests to save the draft later on, the id will be updated * to the value of the auto_increment field of the table. * Along with an id the application will need a folder_id so it can tell whether * an existing view has to be updated if this draft was edited and the folder * is currently visible. * Note, that getDraft will also be executed when the user wants to reply to * an email or forward an email. in this case, the id defaults to the email to * which the user wants to forward/ reply to. * * The method awaits 4 POST parameters: * id - the original message to reply to OR the id of the draft that is being * edited * type - the context the draft is in: can be either "new", "forward", * "reply", "reply_all" or "edit" * name: the name of an recipient to send this email to * address: the address of an recipient to send this email to. If that value is not * empty. id will be set to -1 and type will be set to new. If address equals * to name or if name is left empty, only the address will be used to send the * email to. Address is given presedence in any case */ public function getDraftAction() { if ($this->_helper->conjoonContext()->getCurrentContext() != self::CONTEXT_JSON) { /** * see Conjoon_Controller_Action_InvalidContextException */ require_once 'Conjoon/Controller/Action/InvalidContextException.php'; throw new Conjoon_Controller_Action_InvalidContextException("Invalid context for action, expected \"" . self::CONTEXT_JSON . "\", got \"" . $this->_helper->conjoonContext()->getCurrentContext() . "\""); } $path = $_POST['path']; // check if folder is remote folder /** * @see Conjoon_Text_Parser_Mail_MailboxFolderPathJsonParser */ require_once 'Conjoon/Text/Parser/Mail/MailboxFolderPathJsonParser.php'; $parser = new Conjoon_Text_Parser_Mail_MailboxFolderPathJsonParser(); $pathInfo = $parser->parse($path); /** * @see Conjoon_Modules_Groupware_Email_Folder_Facade */ require_once 'Conjoon/Modules/Groupware/Email/Folder/Facade.php'; $facade = Conjoon_Modules_Groupware_Email_Folder_Facade::getInstance(); if (!empty($pathInfo) && $facade->isRemoteFolder($pathInfo['rootId'])) { return $this->getDraftFromRemoteServer($_POST['id'], $path, $_POST['type']); } /** * @see Conjoon_Keys */ require_once 'Conjoon/Keys.php'; /** * @see Conjoon_BeanContext_Inspector */ require_once 'Conjoon/BeanContext/Inspector.php'; /** * @see Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse */ require_once 'Conjoon/Modules/Groupware/Email/Draft/Filter/DraftResponse.php'; /** * @see Conjoon_Modules_Groupware_Email_Account_Model_Account */ require_once 'Conjoon/Modules/Groupware/Email/Account/Model/Account.php'; /** * @see Conjoon_Util_Array */ require_once 'Conjoon/Util/Array.php'; $auth = Zend_Registry::get(Conjoon_Keys::REGISTRY_AUTH_OBJECT); $userId = $auth->getIdentity()->getId(); $id = (int) $_POST['id']; $type = (string) $_POST['type']; $accountModel = new Conjoon_Modules_Groupware_Email_Account_Model_Account(); // create a new draft so that the user is able to write an email from scratch! if ($id <= 0) { /** * @see Conjoon_Modules_Groupware_Email_Draft */ require_once 'Conjoon/Modules/Groupware/Email/Draft.php'; $standardId = $accountModel->getStandardAccountIdForUser($userId); if ($standardId == 0) { $this->view->error = $this->getErrorDto('Error while opening draft', 'Please configure an email account first.', Conjoon_Error::LEVEL_ERROR); $this->view->draft = null; $this->view->success = false; return; } $post = $_POST; Conjoon_Util_Array::apply($post, array('groupwareEmailAccountsId' => $standardId, 'groupwareEmailFoldersId' => -1)); $draftFilter = new Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse($post, Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse::CONTEXT_NEW); $data = $draftFilter->getProcessedData(); $draft = Conjoon_BeanContext_Inspector::create('Conjoon_Modules_Groupware_Email_Draft', $data); $this->view->success = true; $this->view->error = null; $this->view->draft = $draft->getDto(); $this->view->type = $type; return; } // load an email to edit, to reply or to forward it /** * @see Conjoon_Modules_Groupware_Email_Draft_Model_Draft */ require_once 'Conjoon/Modules/Groupware/Email/Draft/Model/Draft.php'; $draftModel = new Conjoon_Modules_Groupware_Email_Draft_Model_Draft(); $draftData = $draftModel->getDraft($id, $userId, $type); if (empty($draftData)) { $this->view->error = $this->getErrorDto('Error while opening draft', 'Could not find the referenced draft.', Conjoon_Error::LEVEL_ERROR); $this->view->draft = null; $this->view->success = false; return; } switch ($type) { case 'reply': $context = Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse::CONTEXT_REPLY; break; case 'reply_all': $context = Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse::CONTEXT_REPLY_ALL; break; case 'forward': $context = Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse::CONTEXT_FORWARD; break; case 'edit': $context = Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse::CONTEXT_EDIT; break; default: throw new Exception("Type {$type} not supported."); break; } Conjoon_Util_Array::camelizeKeys($draftData); $addresses = $accountModel->getEmailAddressesForUser($userId); $draftData['userEmailAddresses'] = $addresses; /** * @ticket CN-708 * if context is not edit and equals to reply* or forward, read out the * "to" address and find the matching account we'll be using for setting as * account from which the mail gets edited */ $matchingAccountId = -1; if ($context !== Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse::CONTEXT_EDIT) { $orgTo = $draftData['to']; $matchingAccountId = $this->guessMailAccountForAddress($orgTo); if ($matchingAccountId > -1) { $draftData['groupwareEmailAccountsId'] = $matchingAccountId; } } $draftFilter = new Conjoon_Modules_Groupware_Email_Draft_Filter_DraftResponse($draftData, $context); $data = $draftFilter->getProcessedData(); $templateData = $data; // needed for draft forward because of Bean_Inspector unset($data['userEmailAddresses']); unset($data['from']); unset($data['replyTo']); if ($type == 'forward') { $data['to'] = array(); $data['cc'] = array(); } // convert email addresses /** * @see Conjoon_Modules_Groupware_Email_Address */ require_once 'Conjoon/Modules/Groupware/Email/Address.php'; $to = array(); $cc = array(); $bcc = array(); foreach ($data['to'] as $add) { $to[] = new Conjoon_Modules_Groupware_Email_Address($add); } foreach ($data['cc'] as $add) { $cc[] = new Conjoon_Modules_Groupware_Email_Address($add); } foreach ($data['bcc'] as $add) { $bcc[] = new Conjoon_Modules_Groupware_Email_Address($add); } $data['to'] = $to; $data['cc'] = $cc; $data['bcc'] = $bcc; $draft = Conjoon_BeanContext_Inspector::create('Conjoon_Modules_Groupware_Email_Draft', $data)->getDto(); if ($type == 'forward') { $applicationPath = $this->_helper->registryAccess()->getApplicationPath(); /** * @see Conjoon_Text_PhpTemplate */ require_once 'Conjoon/Text/PhpTemplate.php'; /** * @see Conjoon_Filter_StringWrap */ require_once 'Conjoon/Filter/StringWrap.php'; /** * @see Zend_Filter_HtmlEntities */ require_once 'Zend/Filter/HtmlEntities.php'; $cfsw = new Conjoon_Filter_StringWrap('[Fwd: ', ']'); $zfhe = new Zend_Filter_HtmlEntities(array('quotestyle' => ENT_COMPAT, 'charset' => 'UTF-8')); $draft->subject = $cfsw->filter($templateData['subject']); $templateData['subject'] = $zfhe->filter($templateData['subject']); $phpTemplate = new Conjoon_Text_PhpTemplate(array(Conjoon_Text_PhpTemplate::PATH => $applicationPath . '/templates/groupware/email/message.forward.phtml', Conjoon_Text_PhpTemplate::VARS => $templateData)); $draft->contentTextPlain = $phpTemplate->getParsedTemplate(); } $this->view->success = true; $this->view->error = null; $this->view->draft = $draft; $this->view->type = $type; }
/** * Returns an assoc array with the data of an draft. The returned array * has all properties as according to Conjoon_Modules_Groupware_Email_Draft. * * @param integer $itemId * @param integer $userId * @param string $context The context used to fetch the draft. Important * when dealign with contexts "reply", "reply_all" and "forward". * - context "forward": fields "references" and "in_reply_to" will be set * to an empty string * - context "reply", "reply_all": "in_reply_to" will be set to the message-id * of the email, references will be concatenated with the message-id * * @return array */ public function getDraft($itemId, $userId, $context = '') { $itemId = (int) $itemId; if ($itemId <= 0) { return array(); } $itemModel = new Conjoon_Modules_Groupware_Email_Item_Model_Item(); $row = $itemModel->fetchRow($itemModel->select()->from($itemModel)->where('id = ?', $itemId)); if (!$row) { return array(); } $draft = array('id' => $row->id, 'date' => $row->date, 'subject' => $row->subject, 'from' => $row->from, 'reply_to' => $row->reply_to, 'to' => $row->to, 'cc' => $row->cc, 'bcc' => $row->bcc, 'in_reply_to' => $row->in_reply_to, 'references' => $row->references, 'content_text_plain' => $row->content_text_plain, 'content_text_html' => $row->content_text_html, 'groupware_email_folders_id' => $row->groupware_email_folders_id, 'attachments' => array()); // clear memory unset($row); // set in_reply_to, references according to the context switch ($context) { case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_REPLY: case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_REPLY_ALL: $inboxModel = new Conjoon_Modules_Groupware_Email_Item_Model_Inbox(); $messageId = $inboxModel->getMessageIdForItem($draft['id']); if ($messageId != "") { $draft['in_reply_to'] = $messageId; $draft['references'] = $draft['references'] != '' ? $draft['references'] . ' ' . $messageId : $messageId; } else { $draft['in_reply_to'] = ''; $draft['references'] = ''; } break; case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_FORWARD: $draft['in_reply_to'] = ''; $draft['references'] = ''; case '': case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_EDIT: /** * @see Conjoon_Modules_Groupware_Email_Attachment_Model_Attachment */ require_once 'Conjoon/Modules/Groupware/Email/Attachment/Model/Attachment.php'; $attachmentModel = new Conjoon_Modules_Groupware_Email_Attachment_Model_Attachment(); $draft['attachments'] = $attachmentModel->getAttachmentsForItem($draft['id'])->toArray(); break; } // check if the item is available in outbox and get the id of it under which it was // created. Otherwise, get the standard account out of the accounts-table $outboxModel = new Conjoon_Modules_Groupware_Email_Item_Model_Outbox(); $accIdRow = $outboxModel->fetchRow($outboxModel->select()->from($outboxModel, array('groupware_email_accounts_id'))->where('groupware_email_items_id = ? ', $draft['id'])); $accountModel = new Conjoon_Modules_Groupware_Email_Account_Model_Account(); if (!$accIdRow) { $accId = $accountModel->getStandardAccountIdForUser($userId); } else { $accId = $accIdRow->groupware_email_accounts_id; // check if the account still exists $account = $accountModel->getAccount($accId, $userId); if (empty($account)) { $accId = $accountModel->getStandardAccountIdForUser($userId); if ($accId == 0) { return array(); } } } $draft['groupware_email_accounts_id'] = $accId; return $draft; }