Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
06b69b18 | 4 | | CiviCRM version 4.5 | |
6a488035 | 5 | +--------------------------------------------------------------------+ |
06b69b18 | 6 | | Copyright CiviCRM LLC (c) 2004-2014 | |
6a488035 TO |
7 | +--------------------------------------------------------------------+ |
8 | | This file is a part of CiviCRM. | | |
9 | | | | |
10 | | CiviCRM is free software; you can copy, modify, and distribute it | | |
11 | | under the terms of the GNU Affero General Public License | | |
12 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. | | |
13 | | | | |
14 | | CiviCRM is distributed in the hope that it will be useful, but | | |
15 | | WITHOUT ANY WARRANTY; without even the implied warranty of | | |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | | |
17 | | See the GNU Affero General Public License for more details. | | |
18 | | | | |
19 | | You should have received a copy of the GNU Affero General Public | | |
20 | | License and the CiviCRM Licensing Exception along | | |
21 | | with this program; if not, contact CiviCRM LLC | | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
25 | +--------------------------------------------------------------------+ | |
26 | */ | |
27 | ||
28 | /** | |
29 | * | |
30 | * @package CRM | |
06b69b18 | 31 | * @copyright CiviCRM LLC (c) 2004-2014 |
6a488035 TO |
32 | * $Id$ |
33 | * | |
34 | */ | |
35 | ||
36 | /** | |
37 | * Form to send test mail | |
38 | */ | |
39 | class CRM_Mailing_Form_Test extends CRM_Core_Form { | |
40 | ||
41 | /** | |
c490a46a | 42 | * set variables up before form is built |
6a488035 TO |
43 | * |
44 | * @return void | |
45 | * @access public | |
46 | */ | |
47 | public function preProcess() { | |
48 | //when user come from search context. | |
49 | $ssID = $this->get('ssID'); | |
50 | $this->assign('ssid',$ssID); | |
51 | $this->_searchBasedMailing = CRM_Contact_Form_Search::isSearchContext($this->get('context')); | |
52 | if(CRM_Contact_Form_Search::isSearchContext($this->get('context')) && !$ssID){ | |
53 | $params = array(); | |
54 | $result = CRM_Core_BAO_PrevNextCache::getSelectedContacts(); | |
55 | $this->assign("value", $result); | |
56 | } | |
57 | } | |
58 | ||
59 | /** | |
c490a46a | 60 | * Set default values for the form. |
6a488035 TO |
61 | * |
62 | * @access public | |
63 | * | |
355ba699 | 64 | * @return void |
6a488035 TO |
65 | */ |
66 | function setDefaultValues() { | |
67 | $count = $this->get('count'); | |
68 | $this->assign('count', $count); | |
69 | } | |
70 | ||
71 | public function buildQuickForm() { | |
72 | $session = CRM_Core_Session::singleton(); | |
73 | $this->add('text', 'test_email', ts('Send to This Address')); | |
74 | $defaults['test_email'] = $session->get('ufUniqID'); | |
75 | $qfKey = $this->get('qfKey'); | |
76 | ||
77 | $this->add('select', | |
78 | 'test_group', | |
79 | ts('Send to This Group'), | |
80 | array('' => ts('- none -')) + CRM_Core_PseudoConstant::group('Mailing') | |
81 | ); | |
82 | $this->setDefaults($defaults); | |
83 | ||
84 | $this->add('submit', 'sendtest', ts('Send a Test Mailing')); | |
85 | $name = ts('Next >>'); | |
86 | if (CRM_Mailing_Info::workflowEnabled()) { | |
87 | if (!CRM_Core_Permission::check('schedule mailings') && | |
88 | CRM_Core_Permission::check('create mailings') | |
89 | ) { | |
90 | $name = ts('Inform Scheduler'); | |
91 | } | |
92 | } | |
93 | ||
94 | $buttons = array( | |
95 | array('type' => 'back', | |
96 | 'name' => ts('<< Previous'), | |
97 | ), | |
98 | array( | |
99 | 'type' => 'next', | |
100 | 'name' => $name, | |
101 | 'spacing' => ' ', | |
102 | 'isDefault' => TRUE, | |
103 | ), | |
104 | array( | |
105 | 'type' => 'submit', | |
106 | 'name' => ts('Save & Continue Later'), | |
107 | ), | |
108 | array( | |
109 | 'type' => 'cancel', | |
110 | 'name' => ts('Cancel'), | |
111 | ), | |
112 | ); | |
113 | ||
114 | $this->addButtons($buttons); | |
115 | ||
116 | $mailingID = $this->get('mailing_id'); | |
117 | $textFile = $this->get('textFile'); | |
118 | $htmlFile = $this->get('htmlFile'); | |
119 | ||
120 | $this->addFormRule(array('CRM_Mailing_Form_Test', 'testMail'), $this); | |
121 | $preview = array(); | |
122 | if ($textFile) { | |
123 | $preview['text_link'] = CRM_Utils_System::url('civicrm/mailing/preview', "type=text&qfKey=$qfKey"); | |
124 | } | |
125 | if ($htmlFile) { | |
126 | $preview['html_link'] = CRM_Utils_System::url('civicrm/mailing/preview', "type=html&qfKey=$qfKey"); | |
127 | } | |
128 | ||
129 | $preview['attachment'] = CRM_Core_BAO_File::attachmentInfo('civicrm_mailing', $mailingID); | |
130 | $this->assign('preview', $preview); | |
131 | //Token Replacement of Subject in preview mailing | |
132 | $options = array(); | |
133 | $prefix = "CRM_Mailing_Controller_Send_$qfKey"; | |
134 | if ($this->_searchBasedMailing) { | |
135 | $prefix = "CRM_Contact_Controller_Search_$qfKey"; | |
136 | } | |
137 | $session->getVars($options, $prefix); | |
138 | ||
139 | $mailing = new CRM_Mailing_BAO_Mailing(); | |
140 | $mailing->id = $options['mailing_id']; | |
141 | $mailing->find(TRUE); | |
142 | $fromEmail = $mailing->from_email; | |
143 | $replyToEmail = $mailing->replyto_email; | |
144 | ||
145 | $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_mailing', | |
146 | $mailing->id | |
147 | ); | |
148 | ||
149 | $returnProperties = $mailing->getReturnProperties(); | |
150 | $userID = $session->get('userID'); | |
151 | $params = array('contact_id' => $userID); | |
152 | ||
153 | $details = CRM_Utils_Token::getTokenDetails($params, | |
154 | $returnProperties, | |
155 | TRUE, TRUE, NULL, | |
156 | $mailing->getFlattenedTokens(), | |
157 | get_class($this) | |
158 | ); | |
159 | ||
160 | $allDetails = &$mailing->compose(NULL, NULL, NULL, | |
161 | $userID, | |
162 | $fromEmail, | |
163 | $fromEmail, | |
164 | TRUE, | |
165 | $details[0][$userID], | |
166 | $attachments | |
167 | ); | |
168 | ||
169 | $this->assign('subject', $allDetails->_headers['Subject']); | |
170 | } | |
171 | ||
172 | /** | |
173 | * Form rule to send out a test mailing. | |
174 | * | |
c490a46a | 175 | * @param aray $testParams |
fd31fa4c EM |
176 | * @param array $files Any files posted to the form |
177 | * @param array $self an current this object | |
6a488035 | 178 | * |
ceb10dc7 | 179 | * @return boolean true on successful SMTP handoff |
6a488035 TO |
180 | * @access public |
181 | */ | |
fb6afb9e | 182 | static function testMail($testParams, $files, $self) { |
6a488035 TO |
183 | $error = NULL; |
184 | ||
185 | $urlString = 'civicrm/mailing/send'; | |
186 | $urlParams = "_qf_Test_display=true&qfKey={$testParams['qfKey']}"; | |
187 | ||
188 | $ssID = $self->get('ssID'); | |
189 | if ($ssID && $self->_searchBasedMailing) { | |
190 | if ($self->_action == CRM_Core_Action::BASIC) { | |
191 | $fragment = 'search'; | |
192 | } | |
193 | elseif ($self->_action == CRM_Core_Action::PROFILE) { | |
194 | $fragment = 'search/builder'; | |
195 | } | |
196 | elseif ($self->_action == CRM_Core_Action::ADVANCED) { | |
197 | $fragment = 'search/advanced'; | |
198 | } | |
199 | else { | |
200 | $fragment = 'search/custom'; | |
201 | } | |
202 | $urlString = 'civicrm/contact/' . $fragment; | |
203 | } | |
204 | $emails = NULL; | |
a7488080 | 205 | if (!empty($testParams['sendtest'])) { |
6a488035 TO |
206 | if (!($testParams['test_group'] || $testParams['test_email'])) { |
207 | CRM_Core_Session::setStatus(ts('You did not provide an email address or select a group.'), ts('Test not sent.'), 'error'); | |
208 | $error = TRUE; | |
209 | } | |
210 | ||
211 | if ($testParams['test_email']) { | |
212 | $emailAdd = explode(',', $testParams['test_email']); | |
213 | foreach ($emailAdd as $key => $value) { | |
214 | $email = trim($value); | |
215 | $testParams['emails'][] = $email; | |
216 | $emails .= $emails ? ",'$email'" : "'$email'"; | |
217 | if (!CRM_Utils_Rule::email($email)) { | |
f289559e | 218 | CRM_Core_Session::setStatus(ts('Please enter a valid email address.'), ts('Test not sent.'), 'error'); |
6a488035 TO |
219 | $error = TRUE; |
220 | } | |
221 | } | |
222 | } | |
223 | ||
224 | if ($error) { | |
225 | $url = CRM_Utils_System::url($urlString, $urlParams); | |
226 | CRM_Utils_System::redirect($url); | |
227 | return $error; | |
228 | } | |
229 | } | |
230 | ||
a7488080 | 231 | if (!empty($testParams['_qf_Test_submit'])) { |
6a488035 TO |
232 | //when user perform mailing from search context |
233 | //redirect it to search result CRM-3711. | |
234 | if ($ssID && $self->_searchBasedMailing) { | |
235 | $draftURL = CRM_Utils_System::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1'); | |
236 | $status = ts("You can continue later by clicking the 'Continue' action to resume working on it.<br />From <a href='%1'>Draft and Unscheduled Mailings</a>.", array(1 => $draftURL)); | |
237 | ||
238 | //replace user context to search. | |
239 | $context = $self->get('context'); | |
240 | if (!CRM_Contact_Form_Search::isSearchContext($context)) { | |
241 | $context = 'search'; | |
242 | } | |
243 | $urlParams = "force=1&reset=1&ssID={$ssID}&context={$context}&qfKey={$testParams['qfKey']}"; | |
244 | $url = CRM_Utils_System::url($urlString, $urlParams); | |
245 | } | |
246 | else { | |
247 | $status = ts("Click the 'Continue' action to resume working on it."); | |
248 | $url = CRM_Utils_System::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1'); | |
249 | } | |
250 | CRM_Core_Session::setStatus($status, ts('Mailing Saved'), 'success'); | |
251 | CRM_Utils_System::redirect($url); | |
252 | } | |
253 | ||
254 | if (CRM_Mailing_Info::workflowEnabled()) { | |
255 | if (!CRM_Core_Permission::check('schedule mailings') && | |
256 | CRM_Core_Permission::check('create mailings') | |
257 | ) { | |
258 | $url = CRM_Utils_System::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1'); | |
259 | CRM_Utils_System::redirect($url); | |
260 | } | |
261 | } | |
262 | ||
a7488080 | 263 | if (!empty($testParams['_qf_Test_next']) && |
fb6afb9e DS |
264 | $self->get('count') <= 0) { |
265 | return array( | |
266 | '_qf_default' => | |
267 | ts("You can not schedule or send this mailing because there are currently no recipients selected. Click 'Previous' to return to the Select Recipients step, OR click 'Save & Continue Later'."), | |
268 | ); | |
269 | } | |
270 | ||
8cc574cf | 271 | if (!empty($_POST['_qf_Import_refresh']) || !empty($testParams['_qf_Test_next']) || empty($testParams['sendtest'])) { |
6a488035 TO |
272 | $error = TRUE; |
273 | return $error; | |
274 | } | |
275 | ||
9da8dc8c | 276 | $job = new CRM_Mailing_BAO_MailingJob(); |
6a488035 TO |
277 | $job->mailing_id = $self->get('mailing_id'); |
278 | $job->is_test = TRUE; | |
279 | $job->save(); | |
280 | $newEmails = NULL; | |
281 | $session = CRM_Core_Session::singleton(); | |
282 | if (!empty($testParams['emails'])) { | |
283 | $query = " | |
284 | SELECT e.id, e.contact_id, e.email | |
285 | FROM civicrm_email e | |
286 | INNER JOIN civicrm_contact c ON e.contact_id = c.id | |
287 | WHERE e.email IN ($emails) | |
288 | AND e.on_hold = 0 | |
289 | AND c.is_opt_out = 0 | |
290 | AND c.do_not_email = 0 | |
fa6d0f5a | 291 | AND c.is_deleted = 0 |
6a488035 TO |
292 | AND c.is_deceased = 0 |
293 | GROUP BY e.id | |
294 | ORDER BY e.is_bulkmail DESC, e.is_primary DESC | |
295 | "; | |
296 | ||
297 | $dao = CRM_Core_DAO::executeQuery($query); | |
298 | $emailDetail = array(); | |
299 | // fetch contact_id and email id for all existing emails | |
300 | while ($dao->fetch()) { | |
301 | $emailDetail[$dao->email] = array( | |
302 | 'contact_id' => $dao->contact_id, | |
303 | 'email_id' => $dao->id, | |
304 | ); | |
305 | } | |
306 | ||
307 | $dao->free(); | |
308 | foreach ($testParams['emails'] as $key => $email) { | |
fa6d0f5a JM |
309 | // Email addresses are forced to lower case when saved, so ensure |
310 | // we have the same case when comparing. | |
311 | $email = trim(strtolower($email)); | |
6a488035 TO |
312 | $contactId = $emailId = NULL; |
313 | if (array_key_exists($email, $emailDetail)) { | |
314 | $emailId = $emailDetail[$email]['email_id']; | |
315 | $contactId = $emailDetail[$email]['contact_id']; | |
316 | } | |
317 | ||
318 | if (!$contactId) { | |
319 | //create new contact. | |
320 | $params = array( | |
321 | 'contact_type' => 'Individual', | |
322 | 'email' => array( | |
323 | 1 => array('email' => $email, | |
324 | 'is_primary' => 1, | |
325 | 'location_type_id' => 1, | |
326 | )), | |
327 | ); | |
328 | $contact = CRM_Contact_BAO_Contact::create($params); | |
329 | $emailId = $contact->email[0]->id; | |
330 | $contactId = $contact->id; | |
331 | $contact->free(); | |
332 | } | |
333 | $params = array( | |
334 | 'job_id' => $job->id, | |
335 | 'email_id' => $emailId, | |
336 | 'contact_id' => $contactId, | |
337 | ); | |
338 | CRM_Mailing_Event_BAO_Queue::create($params); | |
339 | } | |
340 | } | |
341 | ||
342 | $testParams['job_id'] = $job->id; | |
343 | $isComplete = FALSE; | |
344 | while (!$isComplete) { | |
9da8dc8c | 345 | $isComplete = CRM_Mailing_BAO_MailingJob::runJobs($testParams); |
6a488035 TO |
346 | } |
347 | ||
a7488080 | 348 | if (!empty($testParams['sendtest'])) { |
6a488035 TO |
349 | $status = NULL; |
350 | if (CRM_Mailing_Info::workflowEnabled()) { | |
351 | if (( | |
352 | CRM_Core_Permission::check('schedule mailings') && | |
353 | CRM_Core_Permission::check('create mailings') | |
354 | ) || | |
355 | CRM_Core_Permission::check('access CiviMail') | |
356 | ) { | |
357 | $status = ts("Click 'Next' when you are ready to Schedule or Send your live mailing (you will still have a chance to confirm or cancel sending this mailing on the next page)."); | |
358 | } | |
359 | } | |
360 | else { | |
361 | $status = ts("Click 'Next' when you are ready to Schedule or Send your live mailing (you will still have a chance to confirm or cancel sending this mailing on the next page)."); | |
362 | } | |
363 | ||
364 | if ($status) { | |
365 | CRM_Core_Session::setStatus($status, ts('Test message sent'), 'success'); | |
366 | } | |
367 | $url = CRM_Utils_System::url($urlString, $urlParams); | |
368 | CRM_Utils_System::redirect($url); | |
369 | } | |
370 | $error = TRUE; | |
371 | return $error; | |
372 | } | |
373 | ||
374 | /** | |
375 | * Display Name of the form | |
376 | * | |
377 | * @access public | |
378 | * | |
379 | * @return string | |
380 | */ | |
381 | public function getTitle() { | |
382 | return ts('Test'); | |
383 | } | |
384 | ||
385 | public function postProcess() { | |
386 | } | |
387 | ||
388 | } | |
389 |