PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.0
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | back/Controllers/Campaigns/Edition.php +195 -116 10.0.1 → 11.1.0 View file →
@@ -5,14 +5,12 @@
5 5 use AcyMailing\Classes\CampaignClass;
6 6 use AcyMailing\Classes\MailArchiveClass;
7 7 use AcyMailing\Classes\MailClass;
8 8 use AcyMailing\Classes\ListClass;
9 -use AcyMailing\Classes\MailStatClass;
10 9 use AcyMailing\Classes\QueueClass;
11 10 use AcyMailing\Classes\SegmentClass;
12 11 use AcyMailing\Classes\TagClass;
13 12 use AcyMailing\Classes\UserClass;
14 -use AcyMailing\Controllers\AutomationController;
15 13 use AcyMailing\Controllers\MailsController;
16 14 use AcyMailing\Controllers\SegmentsController;
17 15 use AcyMailing\Helpers\EditorHelper;
18 16 use AcyMailing\Helpers\EntitySelectHelper;
@@ -23,11 +21,12 @@
23 21 use stdClass;
24 22
25 23 trait Edition
26 24 {
27 - public function newEmail()
25 + public function newEmail(): void
28 26 {
29 27 acym_setVar('layout', 'new_email');
28 + $mailClass = new MailClass();
30 29
31 30 $data = [
32 31 'selectedType' => acym_getVar('string', 'email_type', ''),
33 32 'menuClass' => $this->menuClass,
@@ -35,9 +34,9 @@
35 34
36 35 $listClass = new ListClass();
37 36 if (acym_isAdmin()) {
38 37 $returnUrl = urlencode(base64_encode(acym_completeLink('campaigns')));
39 - $favoriteTemplate = $this->config->get('favorite_template', 0);
38 + $favoriteTemplate = $mailClass->getFavoriteTemplateId();
40 39 $welcomeUnsub = '&list_id={dataid}&type_editor=acyEditor&return='.$returnUrl;
41 40
42 41 if (empty($favoriteTemplate)) {
43 42 $data = array_merge(
@@ -101,26 +100,27 @@
101 100
102 101 parent::display($data);
103 102 }
104 103
105 - private function prepareSegmentDisplay(&$data, $sendingParams)
104 + private function prepareSegmentDisplay(array &$data, ?array $sendingParams): void
106 105 {
107 106 $data['menuClass'] = $this->menuClass;
108 107 $data['displaySegmentTab'] = !empty($sendingParams) && array_key_exists('segment', $sendingParams);
109 108 }
110 109
111 - public function chooseTemplate()
110 + public function chooseTemplate(): void
112 111 {
113 112 acym_setVar('layout', 'choose_email');
114 113 acym_setVar('step', 'chooseTemplate');
115 114 $pagination = new PaginationHelper();
116 115
116 + // Get filters data
117 117 $campaignId = acym_getVar('int', 'campaignId', 0);
118 118 $campaignClass = new CampaignClass();
119 119 $searchFilter = $this->getVarFiltersListing('string', 'mailchoose_search', '');
120 120 $tagFilter = $this->getVarFiltersListing('string', 'mailchoose_tag', '');
121 - $ordering = $this->getVarFiltersListing('string', 'mailchoose_ordering', 'creation_date');
122 - $orderingSortOrder = $this->getVarFiltersListing('string', 'mailchoose_ordering_sort_order', 'DESC');
121 + $ordering = $this->getVarFiltersListing('cmd', 'mailchoose_ordering', 'creation_date');
122 + $orderingSortOrder = $this->getVarFiltersListing('cmd', 'mailchoose_ordering_sort_order', 'DESC');
123 123 $campaign = $campaignClass->getOneByIdWithMail($campaignId);
124 124 $campaignType = $this->getVarFiltersListing('string', 'campaign_type', 'now');
125 125 $abTest = acym_getVar('bool', 'abtest', false);
126 126
@@ -134,8 +134,9 @@
134 134 } else {
135 135 $this->breadcrumb[acym_translation('ACYM_NEW_CAMPAIGN')] = '';
136 136 }
137 137
138 + // Get pagination data
138 139 $mailsPerPage = $pagination->getListLimit();
139 140 $page = $this->getVarFiltersListing('int', 'mailchoose_pagination_page', 1);
140 141
141 142 $mailClass = new MailClass();
@@ -151,9 +152,10 @@
151 152 'gettingTemplates' => true,
152 153 ]
153 154 );
154 155
155 - $pagination->setStatus($matchingMails['total'], $page, $mailsPerPage);
156 + // Prepare the pagination
157 + $pagination->setStatus($matchingMails['total']->total, $page, $mailsPerPage);
156 158
157 159 $tagClass = new TagClass();
158 160
159 161 $data = [
@@ -167,9 +169,9 @@
167 169 'campaign_type' => $campaignType,
168 170 'abtest' => $abTest,
169 171 ];
170 172 $this->prepareListingClasses($data);
171 - $this->prepareSegmentDisplay($data, empty($campaign->sending_params) ? false : $campaign->sending_params);
173 + $this->prepareSegmentDisplay($data, empty($campaign->sending_params) ? [] : $campaign->sending_params);
172 174
173 175 $data['menuClass'] = $this->menuClass;
174 176
175 177 parent::display($data);
@@ -174,19 +176,24 @@
174 176
175 177 parent::display($data);
176 178 }
177 179
178 - protected function setFrontEndParamsForTemplateChoose()
180 + protected function setFrontEndParamsForTemplateChoose(): int
179 181 {
180 - return '';
182 + return 0;
181 183 }
182 184
183 - private function prepareEditCampaign(&$data)
185 + private function prepareEditCampaign(array &$data): void
184 186 {
185 187 $campaignId = acym_getVar('int', 'campaignId', 0);
186 188 $mailId = acym_getVar('int', 'from', 0);
187 189 $mailClass = new MailClass();
188 190 $data['mailClass'] = $mailClass;
191 +
192 + if ($mailId > 0 && !$mailClass->hasUserAccess($mailId)) {
193 + die('Access denied for this email');
194 + }
195 + // Check autosave only if mail already saved in campaign and not just selected template (from parameter)
189 196 $checkAutosave = empty($mailId);
190 197 $editLink = 'campaigns&task=edit&step=editEmail';
191 198
192 199 if (empty($campaignId)) {
@@ -251,9 +258,9 @@
251 258 $data['mailInformation']->body = $mail->body;
252 259 $data['mailInformation']->settings = $mail->settings;
253 260 $data['mailInformation']->stylesheet = $mail->stylesheet;
254 261 $data['mailInformation']->headers = $mail->headers;
255 - $data['mailInformation']->attachments = empty($mail->attachments) ? [] : json_decode($mail->attachments);
262 + $data['mailInformation']->attachments = empty($mail->attachments) ? [] : json_decode($mail->attachments, true);
256 263 $data['mailInformation']->links_language = $mail->links_language;
257 264
258 265 $data['mailInformation']->from_email = $mail->from_email;
259 266 $data['mailInformation']->from_name = $mail->from_name;
@@ -268,17 +275,20 @@
268 275 $data['mailId'] = $mailId;
269 276 $data['campaignID'] = $data['mailInformation']->id;
270 277
271 278 $pluginHelper = new PluginHelper();
279 + if (empty($data['mailInformation']->body)) {
280 + $data['mailInformation']->body = '';
281 + }
272 282 $pluginHelper->cleanHtml($data['mailInformation']->body);
273 283
274 284 $editLink .= '&type_editor='.$data['typeEditor'];
275 - $this->breadcrumb[acym_escape(empty($data['mailInformation']->name) ? acym_translation('ACYM_NEW_CAMPAIGN') : $data['mailInformation']->name)] = acym_completeLink(
285 + $this->breadcrumb[empty($data['mailInformation']->name) ? acym_translation('ACYM_NEW_CAMPAIGN') : $data['mailInformation']->name] = acym_completeLink(
276 286 $editLink
277 287 );
278 288 }
279 289
280 - private function prepareEditor(&$data)
290 + private function prepareEditor(array &$data): void
281 291 {
282 292 $data['editor'] = new EditorHelper();
283 293 $data['editor']->content = $data['mailInformation']->body;
284 294 $data['editor']->autoSave = !empty($data['mailInformation']->autosave) ? $data['mailInformation']->autosave : '';
@@ -295,10 +305,12 @@
295 305 }
296 306
297 307 $data['editor']->editor = $data['typeEditor'];
298 308 if ($data['editor']->editor != 'acyEditor' || empty($data['editor']->editor)) {
299 - if (!isset($data['mailInformation']->stylesheet)) $data['mailInformation']->stylesheet = '';
300 - $data['needDisplayStylesheet'] = '<input type="hidden" name="editor_stylesheet" value="'.acym_escape($data['mailInformation']->stylesheet).'">';
309 + if (!isset($data['mailInformation']->stylesheet)) {
310 + $data['mailInformation']->stylesheet = '';
311 + }
312 + $data['needDisplayStylesheet'] = $data['mailInformation']->stylesheet;
301 313 } else {
302 314 $data['needDisplayStylesheet'] = '';
303 315 }
304 316
@@ -311,9 +323,9 @@
311 323 $this->loadScripts['edit_email'][] = 'dtextPicker';
312 324 }
313 325 }
314 326
315 - public function prepareMaxUpload(&$data)
327 + public function prepareMaxUpload(array &$data): void
316 328 {
317 329 $maxupload = ini_get('upload_max_filesize');
318 330 $maxpost = ini_get('post_max_size');
319 331 $data['maxupload'] = acym_bytes($maxupload) > acym_bytes($maxpost) ? $maxpost : $maxupload;
@@ -318,21 +330,21 @@
318 330 $maxpost = ini_get('post_max_size');
319 331 $data['maxupload'] = acym_bytes($maxupload) > acym_bytes($maxpost) ? $maxpost : $maxupload;
320 332 }
321 333
322 - private function prepareAbTest(&$data, $editor = true)
334 + private function prepareAbTest(array &$data, bool $editor = true): void
323 335 {
324 336 $data['abtest'] = false;
325 337
326 338 }
327 339
328 - private function prepareMultilingual(&$data, $editor = true)
340 + private function prepareMultilingual(array &$data, bool $editor = true): void
329 341 {
330 342 $data['multilingual'] = 0;
331 343
332 344 }
333 345
334 - private function prepareAllMailsForAbtest(&$data)
346 + private function prepareAllMailsForAbtest(array &$data): void
335 347 {
336 348 $mailClass = new MailClass();
337 349
338 350 $mails = $mailClass->getParentAndChildMails($data['mailId']);
@@ -343,15 +355,15 @@
343 355 return;
344 356 }
345 357
346 358 foreach ($mails as $key => $oneMail) {
347 - $mails[$key] = $this->prepareMailDataSummary($data, $oneMail->id);
359 + $mails[$key] = $this->prepareMailDataSummary($data, (int)$oneMail->id);
348 360 }
349 361
350 362 $data['abtest_mails'] = $mails;
351 363 }
352 364
353 - private function prepareAllMailsForMultilingual(&$data)
365 + private function prepareAllMailsForMultilingual(array &$data): void
354 366 {
355 367 $mailClass = new MailClass();
356 368
357 369 $mails = $mailClass->getMultilingualMails($data['mailId']);
@@ -362,15 +374,15 @@
362 374 return;
363 375 }
364 376
365 377 foreach ($mails as $key => $oneMail) {
366 - $mails[$key] = $this->prepareMailDataSummary($data, $oneMail->id);
378 + $mails[$key] = $this->prepareMailDataSummary($data, (int)$oneMail->id);
367 379 }
368 380
369 381 $data['multilingual_mails'] = $mails;
370 382 }
371 383
372 - public function editEmail()
384 + public function editEmail(): void
373 385 {
374 386 acym_setVar('layout', 'edit_email');
375 387 acym_setVar('numberattachment', '0');
376 388 acym_setVar('step', 'editEmail');
@@ -391,14 +403,14 @@
391 403 $this->prepareMaxUpload($data);
392 404 $this->prepareAbTest($data);
393 405 $this->prepareMultilingual($data);
394 406 $this->prepareListingClasses($data);
395 - $this->prepareSegmentDisplay($data, empty($data['mailInformation']->sending_params) ? false : $data['mailInformation']->sending_params);
407 + $this->prepareSegmentDisplay($data, empty($data['mailInformation']->sending_params) ? [] : $data['mailInformation']->sending_params);
396 408
397 409 $data['before-save'] = '';
398 410
399 411 if ($data['editor']->editor === 'acyEditor') {
400 - $data['before-save'] = 'acym-data-before="acym_editorWysidVersions.storeCurrentValues(true);acym_editorWysidFormAction.cleanMceInput();"';
412 + $data['before-save'] = 'wysidSwitch';
401 413 }
402 414
403 415 $data['menuClass'] = $this->menuClass;
404 416
@@ -404,9 +416,9 @@
404 416
405 417 parent::display($data);
406 418 }
407 419
408 - public function recipients()
420 + public function recipients(): void
409 421 {
410 422 acym_setVar('layout', 'recipients');
411 423 acym_setVar('step', 'recipients');
412 424
@@ -418,9 +430,9 @@
418 430 die('Access denied for this campaign');
419 431 }
420 432
421 433 $currentCampaign = $campaignClass->getOneByIdWithMail($campaignId);
422 - $this->breadcrumb[acym_escape($currentCampaign->name)] = acym_completeLink('campaigns&task=edit&step=recipients&campaignId='.$campaignId);
434 + $this->breadcrumb[$currentCampaign->name] = acym_completeLink('campaigns&task=edit&step=recipients&campaignId='.$campaignId);
423 435
424 436 $campaign = [
425 437 'campaignInformation' => $campaignId,
426 438 'currentCampaign' => $currentCampaign,
@@ -438,9 +450,9 @@
438 450
439 451 parent::display($campaign);
440 452 }
441 453
442 - public function segment()
454 + public function segment(): void
443 455 {
444 456 acym_setVar('layout', 'segment');
445 457 acym_setVar('step', 'segment');
446 458
@@ -465,13 +477,13 @@
465 477 'workflowHelper' => new WorkflowHelper(),
466 478 ];
467 479
468 480
469 - $this->breadcrumb[acym_escape($mail->name)] = acym_completeLink(acym_completeLink('campaigns&task=edit&step=recipients&campaignId='.$campaign->id));
481 + $this->breadcrumb[$mail->name] = acym_completeLink(acym_completeLink('campaigns&task=edit&step=recipients&campaignId='.$campaign->id));
470 482 parent::display($data);
471 483 }
472 484
473 - public function sendSettings()
485 + public function sendSettings(): void
474 486 {
475 487 acym_setVar('layout', 'send_settings');
476 488 acym_setVar('step', 'sendSettings');
477 489 $campaignId = acym_getVar('int', 'campaignId');
@@ -488,46 +500,59 @@
488 500 if (!$campaignClass->hasUserAccess($campaignId)) {
489 501 die('Access denied for this campaign');
490 502 }
491 503
504 + //To know if we create or modify the campaign
492 505 $from = acym_getVar('string', 'from');
493 506
494 507 $campaignClass = new CampaignClass();
495 508 $currentCampaign = $campaignClass->getOneByIdWithMail($campaignId);
496 - $this->breadcrumb[acym_escape($currentCampaign->name)] = acym_completeLink('campaigns&task=edit&step=sendSettings&campaignId='.$campaignId);
509 + $this->breadcrumb[$currentCampaign->name] = acym_completeLink('campaigns&task=edit&step=sendSettings&campaignId='.$campaignId);
497 510
498 511 if (!empty($currentCampaign->sent) && empty($currentCampaign->active)) {
499 512 $currentCampaign->sending_date = '';
500 513 }
501 514
502 - $campaign = [];
515 + $data = [
516 + 'nbSubscribers' => $campaignClass->countUsersCampaign($campaignId, true),
517 + 'from' => $from,
518 + 'suggestedDate' => acym_date('1534771620', 'j M Y H:i'),
519 + 'campaignClass' => $campaignClass,
520 + ];
503 521
504 - $campaign['currentCampaign'] = $currentCampaign;
505 - $campaign['nbSubscribers'] = $campaignClass->countUsersCampaign($campaignId, true);
506 - $campaign['from'] = $from;
507 - $campaign['suggestedDate'] = acym_date('1534771620', 'j M Y H:i');
508 - $campaign['senderInformations'] = new stdClass();
509 - $campaign['config_values'] = new stdClass();
510 - $campaign['currentCampaign']->send_now = $currentCampaign->sending_type == CampaignClass::SENDING_TYPE_NOW;
511 - $campaign['currentCampaign']->send_scheduled = $currentCampaign->sending_type == CampaignClass::SENDING_TYPE_SCHEDULED;
512 - $campaign['currentCampaign']->send_auto = $currentCampaign->sending_type == CampaignClass::SENDING_TYPE_AUTO;
513 - $campaign['campaignClass'] = $campaignClass;
522 + $data['currentCampaign'] = $currentCampaign;
523 + $data['currentCampaign']->bcc = $currentCampaign->bcc ?? '';
524 + $data['currentCampaign']->bounce_email = $currentCampaign->bounce_email ?? '';
525 + $data['currentCampaign']->send_now = $currentCampaign->sending_type === CampaignClass::SENDING_TYPE_NOW;
526 + $data['currentCampaign']->send_scheduled = $currentCampaign->sending_type === CampaignClass::SENDING_TYPE_SCHEDULED;
527 + $data['currentCampaign']->send_auto = $currentCampaign->sending_type === CampaignClass::SENDING_TYPE_AUTO;
514 528
515 - $campaign['currentCampaign']->send_specific = [];
529 + // Handle special emails
530 + $data['currentCampaign']->send_specific = [];
516 531 if (!in_array($currentCampaign->sending_type, CampaignClass::SENDING_TYPES)) {
517 - acym_trigger('getCampaignSpecificSendSettings', [$currentCampaign->sending_type, $currentCampaign->sending_params, &$campaign['currentCampaign']->send_specific]);
532 + acym_trigger(
533 + 'getCampaignSpecificSendSettings',
534 + [
535 + $currentCampaign->sending_type,
536 + $currentCampaign->sending_params,
537 + &$data['currentCampaign']->send_specific,
538 + ]
539 + );
518 540 }
519 541
520 - $campaign['senderInformations']->from_name = empty($currentCampaign->from_name) ? '' : $currentCampaign->from_name;
521 - $campaign['senderInformations']->from_email = empty($currentCampaign->from_email) ? '' : $currentCampaign->from_email;
522 - $campaign['senderInformations']->reply_to_name = empty($currentCampaign->reply_to_name) ? '' : $currentCampaign->reply_to_name;
523 - $campaign['senderInformations']->reply_to_email = empty($currentCampaign->reply_to_email) ? '' : $currentCampaign->reply_to_email;
524 - $campaign['senderInformations']->bounce_email = empty($currentCampaign->bounce_email) ? '' : $currentCampaign->bounce_email;
542 + $data['senderInformations'] = new stdClass();
543 + $data['senderInformations']->from_name = empty($currentCampaign->from_name) ? '' : $currentCampaign->from_name;
544 + $data['senderInformations']->from_email = empty($currentCampaign->from_email) ? '' : $currentCampaign->from_email;
545 + $data['senderInformations']->reply_to_name = empty($currentCampaign->reply_to_name) ? '' : $currentCampaign->reply_to_name;
546 + $data['senderInformations']->reply_to_email = empty($currentCampaign->reply_to_email) ? '' : $currentCampaign->reply_to_email;
547 + $data['senderInformations']->bounce_email = empty($currentCampaign->bounce_email) ? '' : $currentCampaign->bounce_email;
525 548
526 - $campaign['config_values']->from_name = $this->config->get('from_name', '');
527 - $campaign['config_values']->from_email = $this->config->get('from_email', '');
528 - $campaign['config_values']->reply_to_name = $this->config->get('replyto_name', '');
529 - $campaign['config_values']->reply_to_email = $this->config->get('replyto_email', '');
549 + $data['config_values'] = new stdClass();
550 + $data['config_values']->from_name = $this->config->get('from_name');
551 + $data['config_values']->from_email = $this->config->get('from_email');
552 + $data['config_values']->reply_to_name = $this->config->get('replyto_name');
553 + $data['config_values']->reply_to_email = $this->config->get('replyto_email');
554 + $data['config_values']->bounce_email = $this->config->get('bounce_email');
530 555
531 556 $triggers = [];
532 557
533 558 acym_trigger('onAcymDeclareTriggers', [&$triggers, &$currentCampaign->sending_params], 'plgAcymTime');
@@ -532,34 +557,47 @@
532 557
533 558 acym_trigger('onAcymDeclareTriggers', [&$triggers, &$currentCampaign->sending_params], 'plgAcymTime');
534 559 $triggers = $triggers['classic'];
535 560
536 - $campaign['triggers_select'] = [];
537 - $campaign['triggers_display'] = [];
561 + $data['triggers_select'] = [];
562 + $data['triggers_display'] = [];
538 563
539 564 foreach ($triggers as $key => $trigger) {
540 - $campaign['triggers_select'][$key] = $trigger->name;
541 - $campaign['triggers_display'][$key] = $trigger->option;
565 + $data['triggers_select'][$key] = $trigger->name;
566 + $data['triggers_display'][$key] = $trigger;
542 567 }
543 568
544 - if (!empty($campaign['currentCampaign']->sending_params) && empty($campaign['currentCampaign']->sending_params['trigger_type'])) {
569 + if (!empty($data['currentCampaign']->sending_params) && empty($data['currentCampaign']->sending_params['trigger_type'])) {
545 570 foreach (array_keys($triggers) as $oneTrigger) {
546 - if (!empty($campaign['currentCampaign']->sending_params[$oneTrigger])) $campaign['currentCampaign']->sending_params['trigger_type'] = $oneTrigger;
571 + if (!empty($data['currentCampaign']->sending_params[$oneTrigger])) {
572 + $data['currentCampaign']->sending_params['trigger_type'] = $oneTrigger;
573 + }
547 574 }
548 575 }
549 576
550 - $campaign['containerClass'] = $this->stepContainerClass;
551 - $campaign['langChoice'] = acym_isMultilingual() ? '' : acym_languageOption($campaign['currentCampaign']->links_language, 'senderInformation[links_language]');
552 - $this->prepareListingClasses($campaign);
553 - $this->prepareSegmentDisplay($campaign, $campaign['currentCampaign']->sending_params);
554 - $this->prepareMultilingualOption($campaign);
577 + $data['containerClass'] = $this->stepContainerClass;
578 + if (acym_isMultilingual()) {
579 + $data['langChoice'] = [];
580 + } else {
581 + $languages = acym_getLanguages(true, true);
582 + $data['langChoice'] = count($languages) < 2
583 + ? []
584 + : [
585 + 'links' => $data['currentCampaign']->links_language,
586 + 'name' => 'senderInformation[links_language]',
587 + ];
588 + }
555 589
556 - parent::display($campaign);
590 + $this->prepareListingClasses($data);
591 + $this->prepareSegmentDisplay($data, $data['currentCampaign']->sending_params);
592 + $this->prepareMultilingualOption($data);
593 +
594 + parent::display($data);
557 595 }
558 596
559 - public function saveEditEmail($ajax = false)
597 + public function saveEditEmail(bool $ajax = false): int
560 598 {
561 - acym_checkToken();
599 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
562 600
563 601 $campaignClass = new CampaignClass();
564 602 $mailClass = new MailClass();
565 603 $formData = acym_getVar('array', 'mail', []);
@@ -584,9 +622,9 @@
584 622
585 623 $campaign = new stdClass();
586 624 $campaign->draft = 1;
587 625 $campaign->active = 0;
588 - $campaign->sending_type = $types[$campaignType];
626 + $campaign->sending_type = $types[$campaignType] ?? CampaignClass::SENDING_TYPE_NOW;
589 627 $campaign->sent = 0;
590 628 $campaign->sending_params = [];
591 629 } else {
592 630 if (!$campaignClass->hasUserAccess($campaignId)) {
@@ -597,13 +635,14 @@
597 635 $mail = $mailClass->getOneById($campaign->mail_id);
598 636 $mailArchiveClass = new MailArchiveClass();
599 637 $archive = $mailArchiveClass->getOneByMailId($mail->id);
600 638 if (!empty($archive)) {
601 - $mailArchiveClass->delete($archive->id);
639 + $mailArchiveClass->delete([$archive->id]);
602 640 }
603 641 }
604 642 $campaign->visible = acym_getVar('int', 'visible', 1);
605 643
644 + // Get the name and subject
606 645 foreach ($formData as $name => $data) {
607 646 if (!in_array($name, $allowedFields)) {
608 647 continue;
609 648 }
@@ -609,8 +648,9 @@
609 648 }
610 649 $mail->{acym_secureDBColumn($name)} = $data;
611 650 }
612 651
652 + // Name is mandatory. If empty copy subject (can't be an empty field)
613 653 if (empty($mail->name)) $mail->name = empty($mail->subject) ? acym_translation('ACYM_CAMPAIGN_NAME') : $mail->subject;
614 654
615 655 if (empty($mail->subject)) $mail->subject = acym_translation('ACYM_EMAIL_SUBJECT');
616 656
@@ -624,9 +664,9 @@
624 664 $mail->reply_to_name = acym_getVar('string', 'reply_to_name', '', 'REQUEST');
625 665 $mail->drag_editor = strpos($mail->body, 'acym__wysid__template') === false ? 0 : 1;
626 666 $mail->attachments = empty($mail->attachments) ? [] : json_decode($mail->attachments, true);
627 667
628 - $mainColors = acym_getVar('string', 'main_colors', '', 'REQUEST', ACYM_ALLOWRAW);;
668 + $mainColors = acym_getVar('string', 'main_colors', '', 'REQUEST', ACYM_ALLOWRAW);
629 669 if (!empty($mail->mail_settings)) {
630 670 $mailSettings = json_decode($mail->mail_settings, false);
631 671 } else {
632 672 $mailSettings = new stdClass();
@@ -642,10 +682,10 @@
642 682 if (!empty($versions)) {
643 683 if (!empty($versions['main']['subject'])) $mail->subject = $versions['main']['subject'];
644 684 if (!empty($versions['main']['preview'])) $mail->preheader = $versions['main']['preview'];
645 685 if (!empty($versions['main']['content'])) $mail->body = $versions['main']['content'];
646 - if (!empty($versions['main']['content'])) $mail->settings = $versions['main']['settings'];
647 - if (!empty($versions['main']['content'])) $mail->stylesheet = $versions['main']['stylesheet'];
686 + if (!empty($versions['main']['settings'])) $mail->settings = $versions['main']['settings'];
687 + if (!empty($versions['main']['stylesheet'])) $mail->stylesheet = $versions['main']['stylesheet'];
648 688
649 689 if ($versionType === 'multilingual') {
650 690 $mail->links_language = $this->config->get('multilingual_default');
651 691 }
@@ -652,9 +692,10 @@
652 692
653 693 unset($versions['main']);
654 694 }
655 695
656 - if ($mailID = $mailClass->save($mail)) {
696 + $mailID = $mailClass->save($mail);
697 + if (!empty($mailID)) {
657 698 if (acym_getVar('string', 'nextstep', '') === 'listing') {
658 699 acym_enqueueMessage(acym_translation('ACYM_SUCCESSFULLY_SAVED'));
659 700 }
660 701 } else {
@@ -666,9 +707,9 @@
666 707 if (!$ajax) {
667 708 $this->listing();
668 709 }
669 710
670 - return false;
711 + return 0;
671 712 }
672 713
673 714 if (!empty($versions) && in_array($versionType, ['multilingual', 'abtest'])) {
674 715 $abTestSendingParams = empty($campaign->sending_params['abtest']) ? [] : $campaign->sending_params['abtest'];
@@ -674,11 +715,11 @@
674 715 $abTestSendingParams = empty($campaign->sending_params['abtest']) ? [] : $campaign->sending_params['abtest'];
675 716 foreach ($versions as $code => $version) {
676 717 if (empty($version['subject'])) {
677 718 if ($versionType === 'multilingual') {
678 - $mailClass->delete($mailClass->getTranslationId($mailID, $code));
719 + $mailClass->delete([$mailClass->getTranslationId($mailID, $code)]);
679 720 } elseif (!empty($abTestSendingParams[$code])) {
680 - $mailClass->delete($abTestSendingParams[$code]);
721 + $mailClass->delete([$abTestSendingParams[$code]]);
681 722 }
682 723 continue;
683 724 }
684 725
@@ -716,21 +757,28 @@
716 757
717 758 $campaign->mail_id = $mailID;
718 759 $campaign->id = $campaignClass->save($campaign);
719 760
720 - if ($ajax) {
721 - return $campaign->id;
761 + if (!$ajax) {
762 + acym_setVar('campaignId', $campaign->id);
763 + $this->edit();
722 764 }
723 765
724 - acym_setVar('campaignId', $campaign->id);
725 -
726 - return $this->edit();
766 + return (int)$campaign->id;
727 767 }
728 768
729 - public function saveRecipients()
769 + public function saveRecipients(): void
730 770 {
771 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
772 +
731 773 $allLists = json_decode(acym_getVar('string', 'acym__entity_select__selected'));
732 774 $allListsUnselected = json_decode(acym_getVar('string', 'acym__entity_select__unselected'));
775 + if (empty($allLists)) {
776 + $allLists = [];
777 + }
778 + if (empty($allListsUnselected)) {
779 + $allListsUnselected = [];
780 + }
733 781 $campaignId = acym_getVar('int', 'campaignId');
734 782 $addSegmentStep = acym_getVar('int', 'add_segment_step');
735 783
736 784 $campaignClass = new CampaignClass();
@@ -766,16 +814,21 @@
766 814
767 815 $this->edit();
768 816 }
769 817
770 - public function saveSegment()
818 + public function saveSegment(): void
771 819 {
772 - if (!acym_isAdmin()) {
820 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
821 +
822 + if (!acym_isAdmin() || !acym_isAllowed('campaigns')) {
773 823 die('Access denied for segments');
774 824 }
775 825
776 826 $segmentSelected = acym_getVar('int', 'segment_selected', 0);
777 827 $filters = acym_getVar('array', 'acym_action', []);
828 + if (acym_conditionsContainRestrictedFilter($filters) && !acym_hasAdminPermissions()) {
829 + die('Access denied for segments');
830 + }
778 831 $campaignId = acym_getVar('int', 'campaignId', 0);
779 832
780 833 if (empty($campaignId)) {
781 834 acym_enqueueMessage(acym_translation('ACYM_ERROR_SAVING'), 'error');
@@ -814,10 +867,12 @@
814 867
815 868 $this->edit();
816 869 }
817 870
818 - public function saveSendSettings()
871 + public function saveSendSettings(): void
819 872 {
873 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
874 +
820 875 $campaignClass = new CampaignClass();
821 876 $mailClass = new MailClass();
822 877 $campaignId = acym_getVar('int', 'campaignId');
823 878
@@ -829,9 +884,9 @@
829 884 $sendingDate = acym_getVar('string', 'sendingDate');
830 885 $sendingType = acym_getVar('string', 'sending_type', CampaignClass::SENDING_TYPE_NOW);
831 886 $sendingParams = acym_getVar('array', 'sending_params', []);
832 887 $specificSendingParams = [];
833 - $isScheduled = CampaignClass::SENDING_TYPE_SCHEDULED == $sendingType;
888 + $isScheduled = CampaignClass::SENDING_TYPE_SCHEDULED === $sendingType;
834 889
835 890 $currentCampaign = $campaignClass->getOneById($campaignId);
836 891
837 892 if (empty($currentCampaign)) {
@@ -841,9 +896,9 @@
841 896
842 897 return;
843 898 }
844 899
845 - if (CampaignClass::SENDING_TYPE_AUTO == $sendingType) {
900 + if (CampaignClass::SENDING_TYPE_AUTO === $sendingType) {
846 901 $triggerType = acym_getVar('string', 'acym_triggers', '');
847 902 if (empty($triggerType)) {
848 903 acym_enqueueMessage(acym_translation('ACYM_ERROR_SAVING'), 'error');
849 904 $this->listing();
@@ -858,11 +913,11 @@
858 913 'need_confirm_to_send' => $needConfirmToSend,
859 914 'trigger_type' => $triggerType,
860 915 ];
861 916
862 - $startDate = acym_getVar('string', 'start_date', 0);
863 - if (!empty($startDate)) {
864 - $specificSendingParams['start_date'] = acym_date(acym_getTime($startDate), 'Y-m-d H:i:s', false);
917 + $nextDate = acym_getVar('string', 'next_date', 0);
918 + if (!empty($nextDate)) {
919 + $currentCampaign->next_trigger = acym_getTime($nextDate);
865 920 }
866 921
867 922 if (!empty($currentCampaign->sending_params['number_generated'])) {
868 923 $specificSendingParams['number_generated'] = $currentCampaign->sending_params['number_generated'];
@@ -867,8 +922,9 @@
867 922 if (!empty($currentCampaign->sending_params['number_generated'])) {
868 923 $specificSendingParams['number_generated'] = $currentCampaign->sending_params['number_generated'];
869 924 }
870 925
926 + // Clean old settings saved in the campaign
871 927 $triggers = [];
872 928 $fakeSettings = [];
873 929 acym_trigger('onAcymDeclareTriggers', [&$triggers, &$fakeSettings], 'plgAcymTime');
874 930 $settings = array_merge(array_keys($triggers['classic']), ['trigger_type', 'need_confirm_to_send']);
@@ -880,8 +936,9 @@
880 936 if (!empty($currentCampaign->sending_params['abtest']) && !empty($sendingParams['abtest'])) {
881 937 $sendingParams['abtest'] = array_merge($currentCampaign->sending_params['abtest'], $sendingParams['abtest']);
882 938 }
883 939
940 + // Handle special emails
884 941 if (!in_array($sendingType, CampaignClass::SENDING_TYPES)) {
885 942 $specialSendings = [];
886 943 acym_trigger('saveCampaignSpecificSendSettings', [$currentCampaign->sending_type, &$specialSendings]);
887 944 if (!empty($specialSendings)) {
@@ -893,10 +950,16 @@
893 950 $currentMail = $mailClass->getOneById($currentCampaign->mail_id);
894 951 }
895 952
896 953 $currentCampaign->sending_type = $sendingType;
897 - if (empty($currentCampaign->sending_params)) $currentCampaign->sending_params = [];
954 + if (empty($currentCampaign->sending_params)) {
955 + $currentCampaign->sending_params = [];
956 + }
957 +
898 958 $currentCampaign->sending_params = array_merge($currentCampaign->sending_params, $sendingParams, $specificSendingParams);
959 + if (!empty($currentCampaign->sending_params['admin_notification_emails']) && empty($sendingParams['admin_notification_emails'])) {
960 + $currentCampaign->sending_params['admin_notification_emails'] = [];
961 + }
899 962
900 963 if (empty($currentMail) || empty($senderInformation)) {
901 964 $this->listing();
902 965
@@ -919,9 +982,10 @@
919 982 $currentCampaign->sending_date = acym_date(acym_getTime($sendingDate), 'Y-m-d H:i:s', false);
920 983 if ($currentCampaign->sending_date < acym_date('now', 'Y-m-d H:i:s', false)) acym_enqueueMessage(acym_translation('ACYM_BE_CAREFUL_SENDING_DATE_IN_PAST'), 'warning');
921 984 }
922 985
923 - if ($campaignClass->save($currentCampaign)) {
986 + $savedCampaignId = $campaignClass->save($currentCampaign);
987 + if (!empty($savedCampaignId)) {
924 988 if (acym_getVar('string', 'nextstep', '') === 'listing') {
925 989 acym_enqueueMessage(acym_translation('ACYM_SUCCESSFULLY_SAVED'));
926 990 }
927 991 } else {
@@ -937,14 +1001,17 @@
937 1001
938 1002 $this->edit();
939 1003 }
940 1004
941 - public function saveSummary()
1005 + /**
1006 + * Needed for the steps system
1007 + */
1008 + public function saveSummary(): void
942 1009 {
943 1010 $this->edit();
944 1011 }
945 1012
946 - public function summary()
1013 + public function summary(): void
947 1014 {
948 1015 acym_setVar('step', 'summary');
949 1016 acym_setVar('layout', 'summary');
950 1017
@@ -961,9 +1028,9 @@
961 1028
962 1029 return;
963 1030 }
964 1031
965 - $data['mailInformation'] = $this->prepareMailDataSummary($data, $data['campaignInformation']->mail_id);
1032 + $data['mailInformation'] = $this->prepareMailDataSummary($data, (int)$data['campaignInformation']->mail_id);
966 1033 $this->prepareReceiversSummary($data);
967 1034 $this->prepareAbTest($data, false);
968 1035 $this->prepareAllMailsForAbtest($data);
969 1036 $this->prepareMultilingual($data, false);
@@ -975,11 +1042,13 @@
975 1042 $this->breadcrumb[$data['campaignInformation']->name] = acym_completeLink('campaigns&task=edit&step=summary&campaignId='.$data['campaignInformation']->id);
976 1043 parent::display($data);
977 1044 }
978 1045
979 - private function prepareSegmentData(&$data)
1046 + private function prepareSegmentData(array &$data): void
980 1047 {
981 - if (empty($data['campaignInformation']->sending_params['segment'])) return;
1048 + if (empty($data['campaignInformation']->sending_params['segment'])) {
1049 + return;
1050 + }
982 1051
983 1052 $segmentParams = $data['campaignInformation']->sending_params['segment'];
984 1053
985 1054 $isExcluded = !empty($segmentParams['invert']) && $segmentParams['invert'] === 'exclude';
@@ -991,9 +1060,9 @@
991 1060 $segment = $segmentClass->getOneById($segmentParams['segment_id']);
992 1061
993 1062 $data['segment'] = [
994 1063 'name' => $segment->name,
995 - 'count' => $segmentController->countSegmentById($segment->id, $data['listsIds'], false, $isExcluded),
1064 + 'count' => $segmentController->countSegmentById((int)$segment->id, $data['listsIds'], false, $isExcluded),
996 1065 ];
997 1066 } else {
998 1067 $data['segment'] = [
999 1068 'name' => acym_translation('ACYM_YOUR_CUSTOM_SEGMENT'),
@@ -1001,9 +1070,9 @@
1001 1070 ];
1002 1071 }
1003 1072 }
1004 1073
1005 - protected function prepareCurrentUserSummary(&$data)
1074 + private function prepareCurrentUserSummary(array &$data): void
1006 1075 {
1007 1076 $userClass = new UserClass();
1008 1077 $currentUserEmail = acym_currentUserEmail();
1009 1078 $data['receiver'] = $userClass->getOneByEmail($currentUserEmail);
@@ -1010,13 +1079,15 @@
1010 1079 if (empty($data['receiver'])) {
1011 1080 $receiver = new stdClass();
1012 1081 $receiver->email = $currentUserEmail;
1013 1082 $newID = $userClass->save($receiver);
1014 - $data['receiver'] = $userClass->getOneById($newID);
1083 + if (!empty($newID)) {
1084 + $data['receiver'] = $userClass->getOneById($newID);
1085 + }
1015 1086 }
1016 1087 }
1017 1088
1018 - protected function prepareCampaignSummary(&$data): bool
1089 + private function prepareCampaignSummary(array &$data): bool
1019 1090 {
1020 1091 $campaignId = acym_getVar('int', 'campaignId');
1021 1092 $campaignClass = new CampaignClass();
1022 1093 $campaign = empty($campaignId) ? null : $campaignClass->getOneByIdWithMail($campaignId);
@@ -1027,18 +1098,20 @@
1027 1098 if (!$campaignClass->hasUserAccess($campaignId)) {
1028 1099 die('Access denied for this campaign');
1029 1100 }
1030 1101
1031 - $campaign->isAuto = $campaign->sending_type == $campaignClass->getConstAuto();
1102 + $campaign->isAuto = $campaign->sending_type === CampaignClass::SENDING_TYPE_AUTO;
1032 1103
1033 - $startDate = '';
1104 + $nextDate = '';
1034 1105 if ($campaign->isAuto) {
1035 1106 $textToDisplay = new stdClass();
1036 1107 $textToDisplay->triggers = $campaign->sending_params;
1037 1108 acym_trigger('onAcymDeclareSummary_triggers', [&$textToDisplay], 'plgAcymTime');
1038 1109 $textToDisplay = $textToDisplay->triggers;
1039 - if (!empty($campaign->sending_params['start_date'])) {
1040 - $startDate = $campaign->sending_params['start_date'];
1110 + if (!empty($campaign->next_trigger)) {
1111 + $nextDate = $campaign->next_trigger;
1112 + } elseif (!empty($campaign->sending_params['start_date'])) {
1113 + $nextDate = $campaign->sending_params['start_date'];
1041 1114 }
1042 1115 }
1043 1116
1044 1117 $data['automatic'] = [
@@ -1047,9 +1120,9 @@
1047 1120 ? ''
1048 1121 : acym_translation('ACYM_THIS_WILL_GENERATE_CAMPAIGN_AUTOMATICALLY').' '.acym_strtolower(
1049 1122 $textToDisplay[$textToDisplay['trigger_type']]
1050 1123 ),
1051 - 'startDate' => $startDate,
1124 + 'nextDate' => $nextDate,
1052 1125 ];
1053 1126 $data['campaignInformation'] = $campaign;
1054 1127 $data['mailId'] = $campaign->mail_id;
1055 1128
@@ -1057,9 +1130,9 @@
1057 1130
1058 1131 return true;
1059 1132 }
1060 1133
1061 - protected function prepareMailDataSummary(&$data, $mailId)
1134 + private function prepareMailDataSummary(array &$data, int $mailId): object
1062 1135 {
1063 1136 $mailArchiveClass = new MailArchiveClass();
1064 1137 $data['isArchiveCached'] = !empty($mailArchiveClass->getOneByMailId($mailId));
1065 1138
@@ -1095,9 +1168,9 @@
1095 1168
1096 1169 return $mailData;
1097 1170 }
1098 1171
1099 - protected function prepareReceiversSummary(&$data)
1172 + protected function prepareReceiversSummary(array &$data): void
1100 1173 {
1101 1174 $nbSubscribers = 0;
1102 1175 $campaignLists = $data['mailClass']->getAllListsWithCountSubscribersByMailIds([$data['campaignInformation']->mail_id]);
1103 1176 $listsIds = [];
@@ -1107,13 +1180,15 @@
1107 1180 $listsIds[] = $oneList->list_id;
1108 1181 }
1109 1182
1110 1183 if (empty($data['campaignInformation']->sending_params)) {
1184 + // No segment saved, get subscribers count the easy way
1111 1185 $listClass = new ListClass();
1112 1186 $nbSubscribers = $listClass->getSubscribersCount($listsIds);
1113 1187 } else {
1188 + // There may be segments
1114 1189 $campaignClass = new CampaignClass();
1115 - $nbSubscribers = $campaignClass->countUsersCampaign($data['campaignInformation']->id);
1190 + $nbSubscribers = $campaignClass->countUsersCampaign($data['campaignInformation']->id, true);
1116 1191 }
1117 1192 }
1118 1193
1119 1194 $data['listsReceiver'] = $campaignLists;
@@ -1119,8 +1194,9 @@
1119 1194 $data['listsReceiver'] = $campaignLists;
1120 1195 $data['listsIds'] = $listsIds;
1121 1196 $data['nbSubscribers'] = $nbSubscribers;
1122 1197
1198 + // Campaign already sent, calculate the number of new receivers
1123 1199 if (!empty($data['campaignInformation']->sent) && !empty($data['campaignInformation']->active)) {
1124 1200 $queueClass = new QueueClass();
1125 1201 $data['mailInformation']->sending_params = $data['campaignInformation']->sending_params;
1126 1202
@@ -1129,9 +1205,9 @@
1129 1205 $automationHelper->removeFlag(SegmentsController::FLAG_COUNT);
1130 1206 }
1131 1207 }
1132 1208
1133 - public function tests()
1209 + public function tests(): void
1134 1210 {
1135 1211 $campaignClass = new CampaignClass();
1136 1212 acym_setVar('step', 'tests');
1137 1213 acym_setVar('layout', 'tests');
@@ -1153,8 +1229,10 @@
1153 1229
1154 1230 $mailClass = new MailClass();
1155 1231 $emailsToTest = $mailClass->getParentAndChildMails($campaign->mail_id);
1156 1232
1233 + $isDemo = false;
1234 +
1157 1235 $data = [
1158 1236 'id' => $campaign->id,
1159 1237 'currentCampaign' => $campaign,
1160 1238 'test_emails' => $defaultEmails,
@@ -1160,8 +1238,9 @@
1160 1238 'test_emails' => $defaultEmails,
1161 1239 'upgrade' => !acym_level(ACYM_ESSENTIAL),
1162 1240 'version' => 'enterprise',
1163 1241 'emails_to_test' => $emailsToTest,
1242 + 'isDemo' => $isDemo,
1164 1243 ];
1165 1244 if (!acym_isAcyCheckerInstalled()) {
1166 1245 $lists = $campaignClass->getListsByMailId($campaign->mail_id);
1167 1246 $listClass = new ListClass();
@@ -1170,15 +1249,15 @@
1170 1249
1171 1250 $this->prepareListingClasses($data);
1172 1251 $this->prepareSegmentDisplay($data, $campaign->sending_params);
1173 1252
1174 - $this->breadcrumb[acym_escape($campaign->name)] = acym_completeLink('campaigns&task=edit&step=tests&campaignId='.$campaign->id);
1253 + $this->breadcrumb[$campaign->name] = acym_completeLink('campaigns&task=edit&step=tests&campaignId='.$campaign->id);
1175 1254 parent::display($data);
1176 1255 }
1177 1256
1178 - public function saveTests()
1257 + public function saveTests(): void
1179 1258 {
1180 - if (!acym_isAdmin()) {
1259 + if (!acym_isAdmin() || !acym_isAllowed('campaigns')) {
1181 1260 die('Access denied for tests step');
1182 1261 }
1183 1262
1184 1263 $this->edit();