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 +66 -19 10.10.2 → 11.1.0 View file →
@@ -9,9 +9,8 @@
9 9 use AcyMailing\Classes\QueueClass;
10 10 use AcyMailing\Classes\SegmentClass;
11 11 use AcyMailing\Classes\TagClass;
12 12 use AcyMailing\Classes\UserClass;
13 -use AcyMailing\Controllers\AutomationController;
14 13 use AcyMailing\Controllers\MailsController;
15 14 use AcyMailing\Controllers\SegmentsController;
16 15 use AcyMailing\Helpers\EditorHelper;
17 16 use AcyMailing\Helpers\EntitySelectHelper;
@@ -25,8 +24,9 @@
25 24 {
26 25 public function newEmail(): void
27 26 {
28 27 acym_setVar('layout', 'new_email');
28 + $mailClass = new MailClass();
29 29
30 30 $data = [
31 31 'selectedType' => acym_getVar('string', 'email_type', ''),
32 32 'menuClass' => $this->menuClass,
@@ -34,9 +34,9 @@
34 34
35 35 $listClass = new ListClass();
36 36 if (acym_isAdmin()) {
37 37 $returnUrl = urlencode(base64_encode(acym_completeLink('campaigns')));
38 - $favoriteTemplate = $this->config->get('favorite_template', 0);
38 + $favoriteTemplate = $mailClass->getFavoriteTemplateId();
39 39 $welcomeUnsub = '&list_id={dataid}&type_editor=acyEditor&return='.$returnUrl;
40 40
41 41 if (empty($favoriteTemplate)) {
42 42 $data = array_merge(
@@ -100,9 +100,9 @@
100 100
101 101 parent::display($data);
102 102 }
103 103
104 - private function prepareSegmentDisplay(array &$data, array $sendingParams): void
104 + private function prepareSegmentDisplay(array &$data, ?array $sendingParams): void
105 105 {
106 106 $data['menuClass'] = $this->menuClass;
107 107 $data['displaySegmentTab'] = !empty($sendingParams) && array_key_exists('segment', $sendingParams);
108 108 }
@@ -112,14 +112,15 @@
112 112 acym_setVar('layout', 'choose_email');
113 113 acym_setVar('step', 'chooseTemplate');
114 114 $pagination = new PaginationHelper();
115 115
116 + // Get filters data
116 117 $campaignId = acym_getVar('int', 'campaignId', 0);
117 118 $campaignClass = new CampaignClass();
118 119 $searchFilter = $this->getVarFiltersListing('string', 'mailchoose_search', '');
119 120 $tagFilter = $this->getVarFiltersListing('string', 'mailchoose_tag', '');
120 - $ordering = $this->getVarFiltersListing('string', 'mailchoose_ordering', 'creation_date');
121 - $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');
122 123 $campaign = $campaignClass->getOneByIdWithMail($campaignId);
123 124 $campaignType = $this->getVarFiltersListing('string', 'campaign_type', 'now');
124 125 $abTest = acym_getVar('bool', 'abtest', false);
125 126
@@ -133,8 +134,9 @@
133 134 } else {
134 135 $this->breadcrumb[acym_translation('ACYM_NEW_CAMPAIGN')] = '';
135 136 }
136 137
138 + // Get pagination data
137 139 $mailsPerPage = $pagination->getListLimit();
138 140 $page = $this->getVarFiltersListing('int', 'mailchoose_pagination_page', 1);
139 141
140 142 $mailClass = new MailClass();
@@ -150,8 +152,9 @@
150 152 'gettingTemplates' => true,
151 153 ]
152 154 );
153 155
156 + // Prepare the pagination
154 157 $pagination->setStatus($matchingMails['total']->total, $page, $mailsPerPage);
155 158
156 159 $tagClass = new TagClass();
157 160
@@ -184,8 +187,13 @@
184 187 $campaignId = acym_getVar('int', 'campaignId', 0);
185 188 $mailId = acym_getVar('int', 'from', 0);
186 189 $mailClass = new MailClass();
187 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)
188 196 $checkAutosave = empty($mailId);
189 197 $editLink = 'campaigns&task=edit&step=editEmail';
190 198
191 199 if (empty($campaignId)) {
@@ -273,9 +281,9 @@
273 281 }
274 282 $pluginHelper->cleanHtml($data['mailInformation']->body);
275 283
276 284 $editLink .= '&type_editor='.$data['typeEditor'];
277 - $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(
278 286 $editLink
279 287 );
280 288 }
281 289
@@ -297,10 +305,12 @@
297 305 }
298 306
299 307 $data['editor']->editor = $data['typeEditor'];
300 308 if ($data['editor']->editor != 'acyEditor' || empty($data['editor']->editor)) {
301 - if (!isset($data['mailInformation']->stylesheet)) $data['mailInformation']->stylesheet = '';
302 - $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;
303 313 } else {
304 314 $data['needDisplayStylesheet'] = '';
305 315 }
306 316
@@ -398,9 +408,9 @@
398 408
399 409 $data['before-save'] = '';
400 410
401 411 if ($data['editor']->editor === 'acyEditor') {
402 - $data['before-save'] = 'data-before-action="wysidSwitch"';
412 + $data['before-save'] = 'wysidSwitch';
403 413 }
404 414
405 415 $data['menuClass'] = $this->menuClass;
406 416
@@ -420,9 +430,9 @@
420 430 die('Access denied for this campaign');
421 431 }
422 432
423 433 $currentCampaign = $campaignClass->getOneByIdWithMail($campaignId);
424 - $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);
425 435
426 436 $campaign = [
427 437 'campaignInformation' => $campaignId,
428 438 'currentCampaign' => $currentCampaign,
@@ -467,9 +477,9 @@
467 477 'workflowHelper' => new WorkflowHelper(),
468 478 ];
469 479
470 480
471 - $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));
472 482 parent::display($data);
473 483 }
474 484
475 485 public function sendSettings(): void
@@ -490,13 +500,14 @@
490 500 if (!$campaignClass->hasUserAccess($campaignId)) {
491 501 die('Access denied for this campaign');
492 502 }
493 503
504 + //To know if we create or modify the campaign
494 505 $from = acym_getVar('string', 'from');
495 506
496 507 $campaignClass = new CampaignClass();
497 508 $currentCampaign = $campaignClass->getOneByIdWithMail($campaignId);
498 - $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);
499 510
500 511 if (!empty($currentCampaign->sent) && empty($currentCampaign->active)) {
501 512 $currentCampaign->sending_date = '';
502 513 }
@@ -508,12 +519,15 @@
508 519 'campaignClass' => $campaignClass,
509 520 ];
510 521
511 522 $data['currentCampaign'] = $currentCampaign;
523 + $data['currentCampaign']->bcc = $currentCampaign->bcc ?? '';
524 + $data['currentCampaign']->bounce_email = $currentCampaign->bounce_email ?? '';
512 525 $data['currentCampaign']->send_now = $currentCampaign->sending_type === CampaignClass::SENDING_TYPE_NOW;
513 526 $data['currentCampaign']->send_scheduled = $currentCampaign->sending_type === CampaignClass::SENDING_TYPE_SCHEDULED;
514 527 $data['currentCampaign']->send_auto = $currentCampaign->sending_type === CampaignClass::SENDING_TYPE_AUTO;
515 528
529 + // Handle special emails
516 530 $data['currentCampaign']->send_specific = [];
517 531 if (!in_array($currentCampaign->sending_type, CampaignClass::SENDING_TYPES)) {
518 532 acym_trigger(
519 533 'getCampaignSpecificSendSettings',
@@ -548,9 +562,9 @@
548 562 $data['triggers_display'] = [];
549 563
550 564 foreach ($triggers as $key => $trigger) {
551 565 $data['triggers_select'][$key] = $trigger->name;
552 - $data['triggers_display'][$key] = $trigger->option;
566 + $data['triggers_display'][$key] = $trigger;
553 567 }
554 568
555 569 if (!empty($data['currentCampaign']->sending_params) && empty($data['currentCampaign']->sending_params['trigger_type'])) {
556 570 foreach (array_keys($triggers) as $oneTrigger) {
@@ -560,9 +574,20 @@
560 574 }
561 575 }
562 576
563 577 $data['containerClass'] = $this->stepContainerClass;
564 - $data['langChoice'] = acym_isMultilingual() ? '' : acym_languageOption($data['currentCampaign']->links_language, 'senderInformation[links_language]');
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 + }
589 +
565 590 $this->prepareListingClasses($data);
566 591 $this->prepareSegmentDisplay($data, $data['currentCampaign']->sending_params);
567 592 $this->prepareMultilingualOption($data);
568 593
@@ -570,9 +595,9 @@
570 595 }
571 596
572 597 public function saveEditEmail(bool $ajax = false): int
573 598 {
574 - acym_checkToken();
599 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
575 600
576 601 $campaignClass = new CampaignClass();
577 602 $mailClass = new MailClass();
578 603 $formData = acym_getVar('array', 'mail', []);
@@ -597,9 +622,9 @@
597 622
598 623 $campaign = new stdClass();
599 624 $campaign->draft = 1;
600 625 $campaign->active = 0;
601 - $campaign->sending_type = $types[$campaignType];
626 + $campaign->sending_type = $types[$campaignType] ?? CampaignClass::SENDING_TYPE_NOW;
602 627 $campaign->sent = 0;
603 628 $campaign->sending_params = [];
604 629 } else {
605 630 if (!$campaignClass->hasUserAccess($campaignId)) {
@@ -615,8 +640,9 @@
615 640 }
616 641 }
617 642 $campaign->visible = acym_getVar('int', 'visible', 1);
618 643
644 + // Get the name and subject
619 645 foreach ($formData as $name => $data) {
620 646 if (!in_array($name, $allowedFields)) {
621 647 continue;
622 648 }
@@ -622,8 +648,9 @@
622 648 }
623 649 $mail->{acym_secureDBColumn($name)} = $data;
624 650 }
625 651
652 + // Name is mandatory. If empty copy subject (can't be an empty field)
626 653 if (empty($mail->name)) $mail->name = empty($mail->subject) ? acym_translation('ACYM_CAMPAIGN_NAME') : $mail->subject;
627 654
628 655 if (empty($mail->subject)) $mail->subject = acym_translation('ACYM_EMAIL_SUBJECT');
629 656
@@ -740,8 +767,10 @@
740 767 }
741 768
742 769 public function saveRecipients(): void
743 770 {
771 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
772 +
744 773 $allLists = json_decode(acym_getVar('string', 'acym__entity_select__selected'));
745 774 $allListsUnselected = json_decode(acym_getVar('string', 'acym__entity_select__unselected'));
746 775 if (empty($allLists)) {
747 776 $allLists = [];
@@ -787,14 +816,19 @@
787 816 }
788 817
789 818 public function saveSegment(): void
790 819 {
791 - if (!acym_isAdmin()) {
820 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
821 +
822 + if (!acym_isAdmin() || !acym_isAllowed('campaigns')) {
792 823 die('Access denied for segments');
793 824 }
794 825
795 826 $segmentSelected = acym_getVar('int', 'segment_selected', 0);
796 827 $filters = acym_getVar('array', 'acym_action', []);
828 + if (acym_conditionsContainRestrictedFilter($filters) && !acym_hasAdminPermissions()) {
829 + die('Access denied for segments');
830 + }
797 831 $campaignId = acym_getVar('int', 'campaignId', 0);
798 832
799 833 if (empty($campaignId)) {
800 834 acym_enqueueMessage(acym_translation('ACYM_ERROR_SAVING'), 'error');
@@ -835,8 +869,10 @@
835 869 }
836 870
837 871 public function saveSendSettings(): void
838 872 {
873 + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
874 +
839 875 $campaignClass = new CampaignClass();
840 876 $mailClass = new MailClass();
841 877 $campaignId = acym_getVar('int', 'campaignId');
842 878
@@ -886,8 +922,9 @@
886 922 if (!empty($currentCampaign->sending_params['number_generated'])) {
887 923 $specificSendingParams['number_generated'] = $currentCampaign->sending_params['number_generated'];
888 924 }
889 925
926 + // Clean old settings saved in the campaign
890 927 $triggers = [];
891 928 $fakeSettings = [];
892 929 acym_trigger('onAcymDeclareTriggers', [&$triggers, &$fakeSettings], 'plgAcymTime');
893 930 $settings = array_merge(array_keys($triggers['classic']), ['trigger_type', 'need_confirm_to_send']);
@@ -899,8 +936,9 @@
899 936 if (!empty($currentCampaign->sending_params['abtest']) && !empty($sendingParams['abtest'])) {
900 937 $sendingParams['abtest'] = array_merge($currentCampaign->sending_params['abtest'], $sendingParams['abtest']);
901 938 }
902 939
940 + // Handle special emails
903 941 if (!in_array($sendingType, CampaignClass::SENDING_TYPES)) {
904 942 $specialSendings = [];
905 943 acym_trigger('saveCampaignSpecificSendSettings', [$currentCampaign->sending_type, &$specialSendings]);
906 944 if (!empty($specialSendings)) {
@@ -963,8 +1001,11 @@
963 1001
964 1002 $this->edit();
965 1003 }
966 1004
1005 + /**
1006 + * Needed for the steps system
1007 + */
967 1008 public function saveSummary(): void
968 1009 {
969 1010 $this->edit();
970 1011 }
@@ -1139,11 +1180,13 @@
1139 1180 $listsIds[] = $oneList->list_id;
1140 1181 }
1141 1182
1142 1183 if (empty($data['campaignInformation']->sending_params)) {
1184 + // No segment saved, get subscribers count the easy way
1143 1185 $listClass = new ListClass();
1144 1186 $nbSubscribers = $listClass->getSubscribersCount($listsIds);
1145 1187 } else {
1188 + // There may be segments
1146 1189 $campaignClass = new CampaignClass();
1147 1190 $nbSubscribers = $campaignClass->countUsersCampaign($data['campaignInformation']->id, true);
1148 1191 }
1149 1192 }
@@ -1151,8 +1194,9 @@
1151 1194 $data['listsReceiver'] = $campaignLists;
1152 1195 $data['listsIds'] = $listsIds;
1153 1196 $data['nbSubscribers'] = $nbSubscribers;
1154 1197
1198 + // Campaign already sent, calculate the number of new receivers
1155 1199 if (!empty($data['campaignInformation']->sent) && !empty($data['campaignInformation']->active)) {
1156 1200 $queueClass = new QueueClass();
1157 1201 $data['mailInformation']->sending_params = $data['campaignInformation']->sending_params;
1158 1202
@@ -1185,8 +1229,10 @@
1185 1229
1186 1230 $mailClass = new MailClass();
1187 1231 $emailsToTest = $mailClass->getParentAndChildMails($campaign->mail_id);
1188 1232
1233 + $isDemo = false;
1234 +
1189 1235 $data = [
1190 1236 'id' => $campaign->id,
1191 1237 'currentCampaign' => $campaign,
1192 1238 'test_emails' => $defaultEmails,
@@ -1192,8 +1238,9 @@
1192 1238 'test_emails' => $defaultEmails,
1193 1239 'upgrade' => !acym_level(ACYM_ESSENTIAL),
1194 1240 'version' => 'enterprise',
1195 1241 'emails_to_test' => $emailsToTest,
1242 + 'isDemo' => $isDemo,
1196 1243 ];
1197 1244 if (!acym_isAcyCheckerInstalled()) {
1198 1245 $lists = $campaignClass->getListsByMailId($campaign->mail_id);
1199 1246 $listClass = new ListClass();
@@ -1202,15 +1249,15 @@
1202 1249
1203 1250 $this->prepareListingClasses($data);
1204 1251 $this->prepareSegmentDisplay($data, $campaign->sending_params);
1205 1252
1206 - $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);
1207 1254 parent::display($data);
1208 1255 }
1209 1256
1210 1257 public function saveTests(): void
1211 1258 {
1212 - if (!acym_isAdmin()) {
1259 + if (!acym_isAdmin() || !acym_isAllowed('campaigns')) {
1213 1260 die('Access denied for tests step');
1214 1261 }
1215 1262
1216 1263 $this->edit();