Merge pull request #6553 from sudhabisht/C12658
[civicrm-core.git] / CRM / Mailing / Form / Upload.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
7e9e8871 4 | CiviCRM version 4.7 |
6a488035 5 +--------------------------------------------------------------------+
e7112fa7 6 | Copyright CiviCRM LLC (c) 2004-2015 |
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 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035
TO
27
28/**
29 *
30 * @package CRM
e7112fa7 31 * @copyright CiviCRM LLC (c) 2004-2015
6a488035
TO
32 * $Id$
33 *
34 */
35
36/**
37 * This file is used to build the form configuring mailing details
38 */
39class CRM_Mailing_Form_Upload extends CRM_Core_Form {
320e1703 40
6a488035 41 public $_mailingID;
03e04002 42
00be9182 43 public function preProcess() {
6a488035
TO
44 $this->_mailingID = $this->get('mailing_id');
45 if (CRM_Core_Permission::check('administer CiviCRM')) {
46 $this->assign('isAdmin', 1);
47 }
48
49 //when user come from search context.
50 $ssID = $this->get('ssID');
35f7561f 51 $this->assign('ssid', $ssID);
6a488035 52 $this->_searchBasedMailing = CRM_Contact_Form_Search::isSearchContext($this->get('context'));
9b873358 53 if (CRM_Contact_Form_Search::isSearchContext($this->get('context')) && !$ssID) {
6a488035
TO
54 $params = array();
55 $result = CRM_Core_BAO_PrevNextCache::getSelectedContacts();
56 $this->assign("value", $result);
57 }
58 }
353ffa53 59
6a488035 60 /**
c490a46a 61 * Set default values for the form.
6a488035
TO
62 * the default values are retrieved from the database
63 *
6a488035 64 *
355ba699 65 * @return void
6a488035 66 */
00be9182 67 public function setDefaultValues() {
6a488035
TO
68 $mailingID = CRM_Utils_Request::retrieve('mid', 'Integer', $this, FALSE, NULL);
69
70 //need to differentiate new/reuse mailing, CRM-2873
71 $reuseMailing = FALSE;
72 if ($mailingID) {
73 $reuseMailing = TRUE;
74 }
75 else {
76 $mailingID = $this->_mailingID;
77 }
78
79 $count = $this->get('count');
80 $this->assign('count', $count);
81
82 $this->set('skipTextFile', FALSE);
83 $this->set('skipHtmlFile', FALSE);
84
85 $defaults = array();
86
87 $htmlMessage = NULL;
88 if ($mailingID) {
89 $dao = new CRM_Mailing_DAO_Mailing();
90 $dao->id = $mailingID;
91 $dao->find(TRUE);
92 $dao->storeValues($dao, $defaults);
93
94 //we don't want to retrieve template details once it is
95 //set in session
96 $templateId = $this->get('template');
97 $this->assign('templateSelected', $templateId ? $templateId : 0);
98 if (isset($defaults['msg_template_id']) && !$templateId) {
99 $defaults['template'] = $defaults['msg_template_id'];
c6327d7d 100 $messageTemplate = new CRM_Core_DAO_MessageTemplate();
6a488035
TO
101 $messageTemplate->id = $defaults['msg_template_id'];
102 $messageTemplate->selectAdd();
103 $messageTemplate->selectAdd('msg_text, msg_html');
104 $messageTemplate->find(TRUE);
105
106 $defaults['text_message'] = $messageTemplate->msg_text;
107 $htmlMessage = $messageTemplate->msg_html;
108 }
109
110 if (isset($defaults['body_text'])) {
111 $defaults['text_message'] = $defaults['body_text'];
112 $this->set('textFile', $defaults['body_text']);
113 $this->set('skipTextFile', TRUE);
114 }
115
116 if (isset($defaults['body_html'])) {
117 $htmlMessage = $defaults['body_html'];
118 $this->set('htmlFile', $defaults['body_html']);
119 $this->set('skipHtmlFile', TRUE);
120 }
121
122 //set default from email address.
8cc574cf 123 if (!empty($defaults['from_name']) && !empty($defaults['from_email'])) {
6a488035
TO
124 $defaults['from_email_address'] = array_search('"' . $defaults['from_name'] . '" <' . $defaults['from_email'] . '>',
125 CRM_Core_OptionGroup::values('from_email_address')
126 );
127 }
128 else {
129 //get the default from email address.
130 $defaultAddress = CRM_Core_OptionGroup::values('from_email_address', NULL, NULL, NULL, ' AND is_default = 1');
131 foreach ($defaultAddress as $id => $value) {
132 $defaults['from_email_address'] = $id;
133 }
134 }
135
a7488080 136 if (!empty($defaults['replyto_email'])) {
6a488035
TO
137 $replyToEmail = CRM_Core_OptionGroup::values('from_email_address');
138 foreach ($replyToEmail as $value) {
139 if (strstr($value, $defaults['replyto_email'])) {
140 $replyToEmailAddress = $value;
141 break;
142 }
143 }
144 $replyToEmailAddress = explode('<', $replyToEmailAddress);
cc229ff1 145 if (count($replyToEmailAddress) > 1) {
146 $replyToEmailAddress = $replyToEmailAddress[0] . '<' . $replyToEmailAddress[1];
147 }
148 $defaults['reply_to_address'] = array_search($replyToEmailAddress, $replyToEmail);
6a488035
TO
149 }
150 }
151
152 //fix for CRM-2873
153 if (!$reuseMailing) {
154 $textFilePath = $this->get('textFilePath');
155 if ($textFilePath &&
156 file_exists($textFilePath)
157 ) {
158 $defaults['text_message'] = file_get_contents($textFilePath);
159 if (strlen($defaults['text_message']) > 0) {
160 $this->set('skipTextFile', TRUE);
161 }
162 }
163
164 $htmlFilePath = $this->get('htmlFilePath');
165 if ($htmlFilePath &&
166 file_exists($htmlFilePath)
167 ) {
168 $defaults['html_message'] = file_get_contents($htmlFilePath);
169 if (strlen($defaults['html_message']) > 0) {
170 $htmlMessage = $defaults['html_message'];
171 $this->set('skipHtmlFile', TRUE);
172 }
173 }
174 }
175
176 if ($this->get('html_message')) {
177 $htmlMessage = $this->get('html_message');
178 }
179
180 $htmlMessage = str_replace(array("\n", "\r"), ' ', $htmlMessage);
181 $htmlMessage = str_replace("'", "\'", $htmlMessage);
182 $this->assign('message_html', $htmlMessage);
183
184 $defaults['upload_type'] = 1;
185 if (isset($defaults['body_html'])) {
186 $defaults['html_message'] = $defaults['body_html'];
187 }
188
189 //CRM-4678 setdefault to default component when composing new mailing.
190 if (!$reuseMailing) {
191 $componentFields = array(
192 'header_id' => 'Header',
193 'footer_id' => 'Footer',
194 );
195 foreach ($componentFields as $componentVar => $componentType) {
196 $defaults[$componentVar] = CRM_Mailing_PseudoConstant::defaultComponent($componentType, '');
197 }
198 }
199
200 return $defaults;
201 }
202
203 /**
fe482240 204 * Build the form object.
6a488035 205 *
355ba699 206 * @return void
6a488035
TO
207 */
208 public function buildQuickForm() {
209 $session = CRM_Core_Session::singleton();
353ffa53 210 $config = CRM_Core_Config::singleton();
6a488035
TO
211 $options = array();
212 $tempVar = FALSE;
213
214 // this seems so hacky, not sure what we are doing here and why. Need to investigate and fix
215 $session->getVars($options,
216 "CRM_Mailing_Controller_Send_{$this->controller->_key}"
217 );
218
cbf48754 219 $fromEmailAddress = CRM_Core_OptionGroup::values('from_email_address');
6a488035
TO
220 if (empty($fromEmailAddress)) {
221 //redirect user to enter from email address.
5c3522e8 222 $url = CRM_Utils_System::url('civicrm/admin/options/from_email_address', 'action=add&reset=1');
6a488035
TO
223 $status = ts("There is no valid from email address present. You can add here <a href='%1'>Add From Email Address.</a>", array(1 => $url));
224 $session->setStatus($status, ts('Notice'));
225 }
226 else {
227 foreach ($fromEmailAddress as $key => $email) {
228 $fromEmailAddress[$key] = htmlspecialchars($fromEmailAddress[$key]);
229 }
230 }
231
232 $this->add('select', 'from_email_address',
233 ts('From Email Address'), array(
79d7553f 234 '' => '- select -',
353ffa53 235 ) + $fromEmailAddress, TRUE
6a488035
TO
236 );
237
238 //Added code to add custom field as Reply-To on form when it is enabled from Mailer settings
6098a966 239 if ((int) CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME, 'replyTo') && empty($options['override_verp'])) {
6a488035
TO
240 $this->add('select', 'reply_to_address', ts('Reply-To'),
241 array('' => '- select -') + $fromEmailAddress
242 );
243 }
a7488080 244 elseif (!empty($options['override_verp'])) {
6a488035
TO
245 $trackReplies = TRUE;
246 $this->assign('trackReplies', $trackReplies);
247 }
248
249 $this->add('text', 'subject', ts('Mailing Subject'),
250 CRM_Core_DAO::getAttribute('CRM_Mailing_DAO_Mailing', 'subject'), TRUE
251 );
252
253 $attributes = array('onclick' => "showHideUpload();");
254 $options = array(ts('Upload Content'), ts('Compose On-screen'));
255
256 $this->addRadio('upload_type', ts('I want to'), $options, $attributes, "&nbsp;&nbsp;");
257
258 CRM_Mailing_BAO_Mailing::commonCompose($this);
259
260 $this->addElement('file', 'textFile', ts('Upload TEXT Message'), 'size=30 maxlength=60');
3a6b1049 261 $this->addUploadElement('textFile');
6a488035
TO
262 $this->setMaxFileSize(1024 * 1024);
263 $this->addRule('textFile', ts('File size should be less than 1 MByte'), 'maxfilesize', 1024 * 1024);
264 $this->addRule('textFile', ts('File must be in UTF-8 encoding'), 'utf8File');
265
266 $this->addElement('file', 'htmlFile', ts('Upload HTML Message'), 'size=30 maxlength=60');
3a6b1049 267 $this->addUploadElement('htmlFile');
6a488035
TO
268 $this->setMaxFileSize(1024 * 1024);
269 $this->addRule('htmlFile',
270 ts('File size should be less than %1 MByte(s)',
271 array(1 => 1)
272 ),
273 'maxfilesize',
274 1024 * 1024
275 );
276 $this->addRule('htmlFile', ts('File must be in UTF-8 encoding'), 'utf8File');
277
278 //fix upload files when context is search. CRM-3711
279 $ssID = $this->get('ssID');
280 if ($this->_searchBasedMailing && $ssID) {
281 $this->set('uploadNames', array('textFile', 'htmlFile'));
282 }
283
284 CRM_Core_BAO_File::buildAttachment($this,
285 'civicrm_mailing',
286 $this->_mailingID
287 );
288
289 $this->add('select', 'header_id', ts('Mailing Header'),
290 array('' => ts('- none -')) + CRM_Mailing_PseudoConstant::component('Header')
291 );
292
293 $this->add('select', 'footer_id', ts('Mailing Footer'),
294 array('' => ts('- none -')) + CRM_Mailing_PseudoConstant::component('Footer')
295 );
296
297 $this->addFormRule(array('CRM_Mailing_Form_Upload', 'formRule'), $this);
298
299 $buttons = array(
35f7561f 300 array(
f212d37d
CW
301 'type' => 'back',
302 'name' => ts('Previous'),
6a488035
TO
303 ),
304 array(
305 'type' => 'upload',
f212d37d 306 'name' => ts('Next'),
6a488035
TO
307 'spacing' => '&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;',
308 'isDefault' => TRUE,
309 ),
310 array(
311 'type' => 'upload',
312 'name' => ts('Save & Continue Later'),
313 'subName' => 'save',
314 ),
315 array(
316 'type' => 'cancel',
317 'name' => ts('Cancel'),
318 ),
319 );
320 $this->addButtons($buttons);
321 }
322
323 public function postProcess() {
353ffa53 324 $params = $ids = array();
6a488035 325 $uploadParams = array('header_id', 'footer_id', 'subject', 'from_name', 'from_email');
353ffa53 326 $fileType = array('textFile', 'htmlFile');
6a488035
TO
327
328 $formValues = $this->controller->exportValues($this->_name);
329
330 foreach ($uploadParams as $key) {
a7488080 331 if (!empty($formValues[$key]) ||
6a488035
TO
332 in_array($key, array('header_id', 'footer_id'))
333 ) {
334 $params[$key] = $formValues[$key];
335 $this->set($key, $formValues[$key]);
336 }
337 }
338
339 if (!$formValues['upload_type']) {
340 foreach ($fileType as $key) {
341 $contents = NULL;
342 if (isset($formValues[$key]) &&
343 !empty($formValues[$key])
344 ) {
345 $contents = file_get_contents($formValues[$key]['name']);
346 $this->set($key, $formValues[$key]['name']);
347 }
348 if ($contents) {
349 $params['body_' . substr($key, 0, 4)] = $contents;
350 }
351 else {
352 $params['body_' . substr($key, 0, 4)] = 'NULL';
353 }
354 }
355 }
356 else {
357 $text_message = $formValues['text_message'];
358 $params['body_text'] = $text_message;
359 $this->set('textFile', $params['body_text']);
360 $this->set('text_message', $params['body_text']);
361 $html_message = $formValues['html_message'];
362
363 // dojo editor does some html conversion when tokens are
364 // inserted as links. Hence token replacement fails.
365 // this is hack to revert html conversion for { to %7B and
366 // } to %7D by dojo editor
367 $html_message = str_replace('%7B', '{', str_replace('%7D', '}', $html_message));
368
369 $params['body_html'] = $html_message;
370 $this->set('htmlFile', $params['body_html']);
371 $this->set('html_message', $params['body_html']);
372 }
373
374 $params['name'] = $this->get('name');
375
376 $session = CRM_Core_Session::singleton();
377 $params['contact_id'] = $session->get('userID');
378 $composeFields = array(
353ffa53
TO
379 'template',
380 'saveTemplate',
381 'updateTemplate',
382 'saveTemplateName',
6a488035
TO
383 );
384 $msgTemplate = NULL;
385 //mail template is composed
386 if ($formValues['upload_type']) {
387 $composeParams = array();
388
389 foreach ($composeFields as $key) {
a7488080 390 if (!empty($formValues[$key])) {
6a488035
TO
391 $composeParams[$key] = $formValues[$key];
392 $this->set($key, $formValues[$key]);
393 }
394 }
395
a7488080 396 if (!empty($composeParams['updateTemplate'])) {
6a488035
TO
397 $templateParams = array(
398 'msg_text' => $text_message,
399 'msg_html' => $html_message,
400 'msg_subject' => $params['subject'],
401 'is_active' => TRUE,
402 );
403
404 $templateParams['id'] = $formValues['template'];
405
c6327d7d 406 $msgTemplate = CRM_Core_BAO_MessageTemplate::add($templateParams);
6a488035
TO
407 }
408
a7488080 409 if (!empty($composeParams['saveTemplate'])) {
6a488035
TO
410 $templateParams = array(
411 'msg_text' => $text_message,
412 'msg_html' => $html_message,
413 'msg_subject' => $params['subject'],
414 'is_active' => TRUE,
415 );
416
417 $templateParams['msg_title'] = $composeParams['saveTemplateName'];
418
c6327d7d 419 $msgTemplate = CRM_Core_BAO_MessageTemplate::add($templateParams);
6a488035
TO
420 }
421
422 if (isset($msgTemplate->id)) {
423 $params['msg_template_id'] = $msgTemplate->id;
424 }
425 else {
426 $params['msg_template_id'] = CRM_Utils_Array::value('template', $formValues);
427 }
428 $this->set('template', $params['msg_template_id']);
429 }
430
431 CRM_Core_BAO_File::formatAttachment($formValues,
432 $params,
433 'civicrm_mailing',
434 $this->_mailingID
435 );
436 $ids['mailing_id'] = $this->_mailingID;
437
438 //handle mailing from name & address.
439 $fromEmailAddress = CRM_Utils_Array::value($formValues['from_email_address'],
cbf48754 440 CRM_Core_OptionGroup::values('from_email_address')
6a488035
TO
441 );
442
443 //get the from email address
444 $params['from_email'] = CRM_Utils_Mail::pluckEmailFromHeader($fromEmailAddress);
445
446 //get the from Name
447 $params['from_name'] = CRM_Utils_Array::value(1, explode('"', $fromEmailAddress));
448
449 //Add Reply-To to headers
a7488080 450 if (!empty($formValues['reply_to_address'])) {
cbf48754 451 $replyToEmail = CRM_Core_OptionGroup::values('from_email_address');
6a488035
TO
452 $params['replyto_email'] = CRM_Utils_Array::value($formValues['reply_to_address'], $replyToEmail);
453 }
454
455 /* Build the mailing object */
456
457 CRM_Mailing_BAO_Mailing::create($params, $ids);
458
459 if (isset($this->_submitValues['_qf_Upload_upload_save']) &&
460 $this->_submitValues['_qf_Upload_upload_save'] == 'Save & Continue Later'
461 ) {
462 //when user perform mailing from search context
463 //redirect it to search result CRM-3711.
464 $ssID = $this->get('ssID');
465 if ($ssID && $this->_searchBasedMailing) {
466 if ($this->_action == CRM_Core_Action::BASIC) {
467 $fragment = 'search';
468 }
469 elseif ($this->_action == CRM_Core_Action::PROFILE) {
470 $fragment = 'search/builder';
471 }
472 elseif ($this->_action == CRM_Core_Action::ADVANCED) {
473 $fragment = 'search/advanced';
474 }
475 else {
476 $fragment = 'search/custom';
477 }
478
479 $context = $this->get('context');
480 if (!CRM_Contact_Form_Search::isSearchContext($context)) {
481 $context = 'search';
482 }
483 $urlParams = "force=1&reset=1&ssID={$ssID}&context={$context}";
484 $qfKey = CRM_Utils_Request::retrieve('qfKey', 'String', $this);
485 if (CRM_Utils_Rule::qfKey($qfKey)) {
486 $urlParams .= "&qfKey=$qfKey";
487 }
488
353ffa53 489 $session = CRM_Core_Session::singleton();
6a488035 490 $draftURL = CRM_Utils_System::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1');
353ffa53 491 $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));
6a488035
TO
492 CRM_Core_Session::setStatus($status, ts('Mailing Saved'), 'success');
493
494 // Redirect user to search.
495 $url = CRM_Utils_System::url('civicrm/contact/' . $fragment, $urlParams);
496 }
497 else {
498 $status = ts("Click the 'Continue' action to resume working on it.");
499 $url = CRM_Utils_System::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1');
500 }
501 CRM_Core_Session::setStatus($status, ts('Mailing Saved'), 'success');
502 return $this->controller->setDestination($url);
503 }
504 }
505
506 /**
fe482240 507 * Validation.
6a488035 508 *
90c8230e
TO
509 * @param array $params
510 * (ref.) an assoc array of name/value pairs.
6a488035 511 *
2a6da8d7
EM
512 * @param $files
513 * @param $self
514 *
72b3a70c
CW
515 * @return bool|array
516 * mixed true or array of errors
6a488035 517 */
00be9182 518 public static function formRule($params, $files, $self) {
a7488080 519 if (!empty($_POST['_qf_Import_refresh'])) {
6a488035
TO
520 return TRUE;
521 }
522 $errors = array();
523 $template = CRM_Core_Smarty::singleton();
524
6a488035
TO
525 if (isset($params['html_message'])) {
526 $htmlMessage = str_replace(array("\n", "\r"), ' ', $params['html_message']);
527 $htmlMessage = str_replace("'", "\'", $htmlMessage);
528 $template->assign('htmlContent', $htmlMessage);
529 }
530
531 $domain = CRM_Core_BAO_Domain::getDomain();
532
533 $mailing = new CRM_Mailing_BAO_Mailing();
534 $mailing->id = $self->_mailingID;
535 $mailing->find(TRUE);
536
537 $session = CRM_Core_Session::singleton();
35f7561f 538 $values = array(
353ffa53 539 'contact_id' => $session->get('userID'),
6a488035
TO
540 'version' => 3,
541 );
542 require_once 'api/api.php';
543 $contact = civicrm_api('contact', 'get', $values);
544
545 //CRM-4524
546 $contact = reset($contact['values']);
547
548 $verp = array_flip(array('optOut', 'reply', 'unsubscribe', 'resubscribe', 'owner'));
549 foreach ($verp as $key => $value) {
550 $verp[$key]++;
551 }
552
553 $urls = array_flip(array('forward', 'optOutUrl', 'unsubscribeUrl', 'resubscribeUrl'));
554 foreach ($urls as $key => $value) {
555 $urls[$key]++;
556 }
557
6a488035
TO
558 // set $header and $footer
559 foreach (array(
353ffa53 560 'header',
79d7553f 561 'footer',
353ffa53 562 ) as $part) {
6a488035
TO
563 $$part = array();
564 if ($params["{$part}_id"]) {
565 //echo "found<p>";
566 $component = new CRM_Mailing_BAO_Component();
567 $component->id = $params["{$part}_id"];
568 $component->find(TRUE);
569 ${$part}['textFile'] = $component->body_text;
570 ${$part}['htmlFile'] = $component->body_html;
571 $component->free();
572 }
573 else {
574 ${$part}['htmlFile'] = ${$part}['textFile'] = '';
575 }
576 }
577
6a488035
TO
578 $skipTextFile = $self->get('skipTextFile');
579 $skipHtmlFile = $self->get('skipHtmlFile');
580
581 if (!$params['upload_type']) {
582 if ((!isset($files['textFile']) || !file_exists($files['textFile']['tmp_name'])) &&
583 (!isset($files['htmlFile']) || !file_exists($files['htmlFile']['tmp_name']))
584 ) {
585 if (!($skipTextFile || $skipHtmlFile)) {
586 $errors['textFile'] = ts('Please provide either a Text or HTML formatted message - or both.');
587 }
588 }
589 }
590 else {
8cc574cf 591 if (empty($params['text_message']) && empty($params['html_message'])) {
6a488035
TO
592 $errors['html_message'] = ts('Please provide either a Text or HTML formatted message - or both.');
593 }
8cc574cf 594 if (!empty($params['saveTemplate']) && empty($params['saveTemplateName'])) {
6a488035
TO
595 $errors['saveTemplateName'] = ts('Please provide a Template Name.');
596 }
597 }
598
599 foreach (array(
353ffa53 600 'text',
79d7553f 601 'html',
353ffa53 602 ) as $file) {
6a488035
TO
603 if (!$params['upload_type'] && !file_exists(CRM_Utils_Array::value('tmp_name', $files[$file . 'File']))) {
604 continue;
605 }
606 if ($params['upload_type'] && !$params[$file . '_message']) {
607 continue;
608 }
609
610 if (!$params['upload_type']) {
611 $str = file_get_contents($files[$file . 'File']['tmp_name']);
612 $name = $files[$file . 'File']['name'];
613 }
614 else {
353ffa53
TO
615 $str = $params[$file . '_message'];
616 $str = ($file == 'html') ? str_replace('%7B', '{', str_replace('%7D', '}', $str)) : $str;
6a488035
TO
617 $name = $file . ' message';
618 }
619
620 /* append header/footer */
621
622 $str = $header[$file . 'File'] . $str . $footer[$file . 'File'];
623
624 $dataErrors = array();
625
626 /* First look for missing tokens */
627
9babb598
OB
628 if (!CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME, 'disable_mandatory_tokens_check')) {
629 $err = CRM_Utils_Token::requiredTokens($str);
630 if ($err !== TRUE) {
631 foreach ($err as $token => $desc) {
632 $dataErrors[] = '<li>' . ts('This message is missing a required token - {%1}: %2',
353ffa53
TO
633 array(1 => $token, 2 => $desc)
634 ) . '</li>';
9babb598 635 }
6a488035
TO
636 }
637 }
638
639 /* Do a full token replacement on a dummy verp, the current
e70a7fc0 640 * contact and domain, and the first organization. */
6a488035 641
6a488035
TO
642 // here we make a dummy mailing object so that we
643 // can retrieve the tokens that we need to replace
644 // so that we do get an invalid token error
645 // this is qute hacky and I hope that there might
646 // be a suggestion from someone on how to
647 // make it a bit more elegant
648
353ffa53
TO
649 $dummy_mail = new CRM_Mailing_BAO_Mailing();
650 $mess = "body_{$file}";
6a488035 651 $dummy_mail->$mess = $str;
353ffa53 652 $tokens = $dummy_mail->getTokens();
6a488035
TO
653
654 $str = CRM_Utils_Token::replaceSubscribeInviteTokens($str);
655 $str = CRM_Utils_Token::replaceDomainTokens($str, $domain, NULL, $tokens[$file]);
656 $str = CRM_Utils_Token::replaceMailingTokens($str, $mailing, NULL, $tokens[$file]);
657 $str = CRM_Utils_Token::replaceOrgTokens($str, $org);
658 $str = CRM_Utils_Token::replaceActionTokens($str, $verp, $urls, NULL, $tokens[$file]);
659 $str = CRM_Utils_Token::replaceContactTokens($str, $contact, NULL, $tokens[$file]);
660
661 $unmatched = CRM_Utils_Token::unmatchedTokens($str);
662
663 if (!empty($unmatched) && 0) {
664 foreach ($unmatched as $token) {
665 $dataErrors[] = '<li>' . ts('Invalid token code') . ' {' . $token . '}</li>';
666 }
667 }
668 if (!empty($dataErrors)) {
669 $errors[$file . 'File'] = ts('The following errors were detected in %1:', array(
79d7553f 670 1 => $name,
353ffa53 671 )) . ' <ul>' . implode('', $dataErrors) . '</ul><br /><a href="' . CRM_Utils_System::docURL2('Sample CiviMail Messages', TRUE, NULL, NULL, NULL, "wiki") . '" target="_blank">' . ts('More information on required tokens...') . '</a>';
6a488035
TO
672 }
673 }
674
c6327d7d 675 $templateName = CRM_Core_BAO_MessageTemplate::getMessageTemplates();
a7488080 676 if (!empty($params['saveTemplate']) && in_array(CRM_Utils_Array::value('saveTemplateName', $params), $templateName)
6a488035
TO
677 ) {
678 $errors['saveTemplate'] = ts('Duplicate Template Name.');
679 }
680 return empty($errors) ? TRUE : $errors;
681 }
682
683 /**
fe482240 684 * Display Name of the form.
6a488035 685 *
6a488035
TO
686 *
687 * @return string
688 */
689 public function getTitle() {
690 return ts('Mailing Content');
691 }
96025800 692
5ec6b0ad
TM
693 /**
694 * List available tokens for this form.
695 *
696 * @return array
697 */
698 public function listTokens() {
699 $tokens = CRM_Core_SelectValues::contactTokens();
700 $tokens = array_merge(CRM_Core_SelectValues::mailingTokens(), $tokens);
701 return $tokens;
702 }
703
6a488035 704}