public function render() { $views = array(); $last = null; $group = array(); $groups = array(); $has_description_transaction = false; foreach ($this->transactions as $transaction) { if ($transaction->getTransactionType() == ManiphestTransactionType::TYPE_DESCRIPTION) { $has_description_transaction = true; } if ($last === null) { $last = $transaction; $group[] = $transaction; continue; } else { if ($last->canGroupWith($transaction)) { $group[] = $transaction; if ($transaction->hasComments()) { $last = $transaction; } } else { $groups[] = $group; $last = $transaction; $group = array($transaction); } } } if ($group) { $groups[] = $group; } if ($has_description_transaction) { require_celerity_resource('differential-changeset-view-css'); require_celerity_resource('syntax-highlighting-css'); $whitespace_mode = DifferentialChangesetParser::WHITESPACE_SHOW_ALL; Javelin::initBehavior('differential-show-more', array('uri' => '/maniphest/task/descriptionchange/', 'whitespace' => $whitespace_mode)); } $sequence = 1; foreach ($groups as $group) { $view = new ManiphestTransactionDetailView(); $view->setUser($this->user); $view->setAuxiliaryFields($this->getAuxiliaryFields()); $view->setTransactionGroup($group); $view->setHandles($this->handles); $view->setMarkupEngine($this->markupEngine); $view->setPreview($this->preview); $view->setCommentNumber($sequence++); $views[] = $view->render(); } return '<div class="maniphest-transaction-list-view">' . implode("\n", $views) . '</div>'; }
private function sendEmail($task, $transactions, $email_to, $email_cc) { $email_to = array_filter(array_unique($email_to)); $email_cc = array_filter(array_unique($email_cc)); $phids = array(); foreach ($transactions as $transaction) { foreach ($transaction->extractPHIDs() as $phid) { $phids[$phid] = true; } } foreach ($email_to as $phid) { $phids[$phid] = true; } foreach ($email_cc as $phid) { $phids[$phid] = true; } $phids = array_keys($phids); $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles(); $view = new ManiphestTransactionDetailView(); $view->setTransactionGroup($transactions); $view->setHandles($handles); $view->setAuxiliaryFields($this->auxiliaryFields); list($action, $body) = $view->renderForEmail($with_date = false); $is_create = $this->isCreate($transactions); $task_uri = PhabricatorEnv::getURI('/T' . $task->getID()); $reply_handler = $this->buildReplyHandler($task); if ($is_create) { $body .= "\n\n" . "TASK DESCRIPTION\n" . " " . $task->getDescription(); } $body .= "\n\n" . "TASK DETAIL\n" . " " . $task_uri . "\n"; $reply_instructions = $reply_handler->getReplyHandlerInstructions(); if ($reply_instructions) { $body .= "\n" . "REPLY HANDLER ACTIONS\n" . " " . $reply_instructions . "\n"; } $thread_id = 'maniphest-task-' . $task->getPHID(); $task_id = $task->getID(); $title = $task->getTitle(); $prefix = $this->getSubjectPrefix(); $subject = trim("{$prefix} T{$task_id}: {$title}"); $vary_subject = trim("{$prefix} [{$action}] T{$task_id}: {$title}"); $mailtags = $this->getMailTags($transactions); $template = id(new PhabricatorMetaMTAMail())->setSubject($subject)->setVarySubject($vary_subject)->setFrom($transaction->getAuthorPHID())->setParentMessageID($this->parentMessageID)->addHeader('Thread-Topic', 'Maniphest Task ' . $task->getID())->setThreadID($thread_id, $is_create)->setRelatedPHID($task->getPHID())->setIsBulk(true)->setMailTags($mailtags)->setBody($body); $mails = $reply_handler->multiplexMail($template, array_select_keys($handles, $email_to), array_select_keys($handles, $email_cc)); foreach ($mails as $mail) { $mail->saveAndSend(); } }