| @@ -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)) { |
| @@ -250,9 +258,9 @@ | ||
| 250 | 258 | $data['mailInformation']->body = $mail->body; |
| 251 | 259 | $data['mailInformation']->settings = $mail->settings; |
| 252 | 260 | $data['mailInformation']->stylesheet = $mail->stylesheet; |
| 253 | 261 | $data['mailInformation']->headers = $mail->headers; |
| 254 | - $data['mailInformation']->attachments = empty($mail->attachments) ? [] : json_decode($mail->attachments); | |
| 262 | + $data['mailInformation']->attachments = empty($mail->attachments) ? [] : json_decode($mail->attachments, true); | |
| 255 | 263 | $data['mailInformation']->links_language = $mail->links_language; |
| 256 | 264 | |
| 257 | 265 | $data['mailInformation']->from_email = $mail->from_email; |
| 258 | 266 | $data['mailInformation']->from_name = $mail->from_name; |
| @@ -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'] = 'acym-data-before="acym_editorWysidVersions.storeCurrentValues(true);acym_editorWysidFormAction.cleanMceInput();"'; | |
| 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)) { |
| @@ -610,13 +635,14 @@ | ||
| 610 | 635 | $mail = $mailClass->getOneById($campaign->mail_id); |
| 611 | 636 | $mailArchiveClass = new MailArchiveClass(); |
| 612 | 637 | $archive = $mailArchiveClass->getOneByMailId($mail->id); |
| 613 | 638 | if (!empty($archive)) { |
| 614 | - $mailArchiveClass->delete($archive->id); | |
| 639 | + $mailArchiveClass->delete([$archive->id]); | |
| 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 | |
| @@ -637,9 +664,9 @@ | ||
| 637 | 664 | $mail->reply_to_name = acym_getVar('string', 'reply_to_name', '', 'REQUEST'); |
| 638 | 665 | $mail->drag_editor = strpos($mail->body, 'acym__wysid__template') === false ? 0 : 1; |
| 639 | 666 | $mail->attachments = empty($mail->attachments) ? [] : json_decode($mail->attachments, true); |
| 640 | 667 | |
| 641 | - $mainColors = acym_getVar('string', 'main_colors', '', 'REQUEST', ACYM_ALLOWRAW);; | |
| 668 | + $mainColors = acym_getVar('string', 'main_colors', '', 'REQUEST', ACYM_ALLOWRAW); | |
| 642 | 669 | if (!empty($mail->mail_settings)) { |
| 643 | 670 | $mailSettings = json_decode($mail->mail_settings, false); |
| 644 | 671 | } else { |
| 645 | 672 | $mailSettings = new stdClass(); |
| @@ -655,10 +682,10 @@ | ||
| 655 | 682 | if (!empty($versions)) { |
| 656 | 683 | if (!empty($versions['main']['subject'])) $mail->subject = $versions['main']['subject']; |
| 657 | 684 | if (!empty($versions['main']['preview'])) $mail->preheader = $versions['main']['preview']; |
| 658 | 685 | if (!empty($versions['main']['content'])) $mail->body = $versions['main']['content']; |
| 659 | - if (!empty($versions['main']['content'])) $mail->settings = $versions['main']['settings']; | |
| 660 | - 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']; | |
| 661 | 688 | |
| 662 | 689 | if ($versionType === 'multilingual') { |
| 663 | 690 | $mail->links_language = $this->config->get('multilingual_default'); |
| 664 | 691 | } |
| @@ -665,9 +692,10 @@ | ||
| 665 | 692 | |
| 666 | 693 | unset($versions['main']); |
| 667 | 694 | } |
| 668 | 695 | |
| 669 | - if ($mailID = $mailClass->save($mail)) { | |
| 696 | + $mailID = $mailClass->save($mail); | |
| 697 | + if (!empty($mailID)) { | |
| 670 | 698 | if (acym_getVar('string', 'nextstep', '') === 'listing') { |
| 671 | 699 | acym_enqueueMessage(acym_translation('ACYM_SUCCESSFULLY_SAVED')); |
| 672 | 700 | } |
| 673 | 701 | } else { |
| @@ -687,11 +715,11 @@ | ||
| 687 | 715 | $abTestSendingParams = empty($campaign->sending_params['abtest']) ? [] : $campaign->sending_params['abtest']; |
| 688 | 716 | foreach ($versions as $code => $version) { |
| 689 | 717 | if (empty($version['subject'])) { |
| 690 | 718 | if ($versionType === 'multilingual') { |
| 691 | - $mailClass->delete($mailClass->getTranslationId($mailID, $code)); | |
| 719 | + $mailClass->delete([$mailClass->getTranslationId($mailID, $code)]); | |
| 692 | 720 | } elseif (!empty($abTestSendingParams[$code])) { |
| 693 | - $mailClass->delete($abTestSendingParams[$code]); | |
| 721 | + $mailClass->delete([$abTestSendingParams[$code]]); | |
| 694 | 722 | } |
| 695 | 723 | continue; |
| 696 | 724 | } |
| 697 | 725 | |
| @@ -739,10 +767,18 @@ | ||
| 739 | 767 | } |
| 740 | 768 | |
| 741 | 769 | public function saveRecipients(): void |
| 742 | 770 | { |
| 771 | + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token'); | |
| 772 | + | |
| 743 | 773 | $allLists = json_decode(acym_getVar('string', 'acym__entity_select__selected')); |
| 744 | 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 | + } | |
| 745 | 781 | $campaignId = acym_getVar('int', 'campaignId'); |
| 746 | 782 | $addSegmentStep = acym_getVar('int', 'add_segment_step'); |
| 747 | 783 | |
| 748 | 784 | $campaignClass = new CampaignClass(); |
| @@ -780,14 +816,19 @@ | ||
| 780 | 816 | } |
| 781 | 817 | |
| 782 | 818 | public function saveSegment(): void |
| 783 | 819 | { |
| 784 | - if (!acym_isAdmin()) { | |
| 820 | + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token'); | |
| 821 | + | |
| 822 | + if (!acym_isAdmin() || !acym_isAllowed('campaigns')) { | |
| 785 | 823 | die('Access denied for segments'); |
| 786 | 824 | } |
| 787 | 825 | |
| 788 | 826 | $segmentSelected = acym_getVar('int', 'segment_selected', 0); |
| 789 | 827 | $filters = acym_getVar('array', 'acym_action', []); |
| 828 | + if (acym_conditionsContainRestrictedFilter($filters) && !acym_hasAdminPermissions()) { | |
| 829 | + die('Access denied for segments'); | |
| 830 | + } | |
| 790 | 831 | $campaignId = acym_getVar('int', 'campaignId', 0); |
| 791 | 832 | |
| 792 | 833 | if (empty($campaignId)) { |
| 793 | 834 | acym_enqueueMessage(acym_translation('ACYM_ERROR_SAVING'), 'error'); |
| @@ -828,8 +869,10 @@ | ||
| 828 | 869 | } |
| 829 | 870 | |
| 830 | 871 | public function saveSendSettings(): void |
| 831 | 872 | { |
| 873 | + wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token'); | |
| 874 | + | |
| 832 | 875 | $campaignClass = new CampaignClass(); |
| 833 | 876 | $mailClass = new MailClass(); |
| 834 | 877 | $campaignId = acym_getVar('int', 'campaignId'); |
| 835 | 878 | |
| @@ -870,11 +913,11 @@ | ||
| 870 | 913 | 'need_confirm_to_send' => $needConfirmToSend, |
| 871 | 914 | 'trigger_type' => $triggerType, |
| 872 | 915 | ]; |
| 873 | 916 | |
| 874 | - $startDate = acym_getVar('string', 'start_date', 0); | |
| 875 | - if (!empty($startDate)) { | |
| 876 | - $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); | |
| 877 | 920 | } |
| 878 | 921 | |
| 879 | 922 | if (!empty($currentCampaign->sending_params['number_generated'])) { |
| 880 | 923 | $specificSendingParams['number_generated'] = $currentCampaign->sending_params['number_generated']; |
| @@ -879,8 +922,9 @@ | ||
| 879 | 922 | if (!empty($currentCampaign->sending_params['number_generated'])) { |
| 880 | 923 | $specificSendingParams['number_generated'] = $currentCampaign->sending_params['number_generated']; |
| 881 | 924 | } |
| 882 | 925 | |
| 926 | + // Clean old settings saved in the campaign | |
| 883 | 927 | $triggers = []; |
| 884 | 928 | $fakeSettings = []; |
| 885 | 929 | acym_trigger('onAcymDeclareTriggers', [&$triggers, &$fakeSettings], 'plgAcymTime'); |
| 886 | 930 | $settings = array_merge(array_keys($triggers['classic']), ['trigger_type', 'need_confirm_to_send']); |
| @@ -892,8 +936,9 @@ | ||
| 892 | 936 | if (!empty($currentCampaign->sending_params['abtest']) && !empty($sendingParams['abtest'])) { |
| 893 | 937 | $sendingParams['abtest'] = array_merge($currentCampaign->sending_params['abtest'], $sendingParams['abtest']); |
| 894 | 938 | } |
| 895 | 939 | |
| 940 | + // Handle special emails | |
| 896 | 941 | if (!in_array($sendingType, CampaignClass::SENDING_TYPES)) { |
| 897 | 942 | $specialSendings = []; |
| 898 | 943 | acym_trigger('saveCampaignSpecificSendSettings', [$currentCampaign->sending_type, &$specialSendings]); |
| 899 | 944 | if (!empty($specialSendings)) { |
| @@ -937,9 +982,10 @@ | ||
| 937 | 982 | $currentCampaign->sending_date = acym_date(acym_getTime($sendingDate), 'Y-m-d H:i:s', false); |
| 938 | 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'); |
| 939 | 984 | } |
| 940 | 985 | |
| 941 | - if ($campaignClass->save($currentCampaign)) { | |
| 986 | + $savedCampaignId = $campaignClass->save($currentCampaign); | |
| 987 | + if (!empty($savedCampaignId)) { | |
| 942 | 988 | if (acym_getVar('string', 'nextstep', '') === 'listing') { |
| 943 | 989 | acym_enqueueMessage(acym_translation('ACYM_SUCCESSFULLY_SAVED')); |
| 944 | 990 | } |
| 945 | 991 | } else { |
| @@ -955,8 +1001,11 @@ | ||
| 955 | 1001 | |
| 956 | 1002 | $this->edit(); |
| 957 | 1003 | } |
| 958 | 1004 | |
| 1005 | + /** | |
| 1006 | + * Needed for the steps system | |
| 1007 | + */ | |
| 959 | 1008 | public function saveSummary(): void |
| 960 | 1009 | { |
| 961 | 1010 | $this->edit(); |
| 962 | 1011 | } |
| @@ -1030,9 +1079,11 @@ | ||
| 1030 | 1079 | if (empty($data['receiver'])) { |
| 1031 | 1080 | $receiver = new stdClass(); |
| 1032 | 1081 | $receiver->email = $currentUserEmail; |
| 1033 | 1082 | $newID = $userClass->save($receiver); |
| 1034 | - $data['receiver'] = $userClass->getOneById($newID); | |
| 1083 | + if (!empty($newID)) { | |
| 1084 | + $data['receiver'] = $userClass->getOneById($newID); | |
| 1085 | + } | |
| 1035 | 1086 | } |
| 1036 | 1087 | } |
| 1037 | 1088 | |
| 1038 | 1089 | private function prepareCampaignSummary(array &$data): bool |
| @@ -1049,16 +1100,18 @@ | ||
| 1049 | 1100 | } |
| 1050 | 1101 | |
| 1051 | 1102 | $campaign->isAuto = $campaign->sending_type === CampaignClass::SENDING_TYPE_AUTO; |
| 1052 | 1103 | |
| 1053 | - $startDate = ''; | |
| 1104 | + $nextDate = ''; | |
| 1054 | 1105 | if ($campaign->isAuto) { |
| 1055 | 1106 | $textToDisplay = new stdClass(); |
| 1056 | 1107 | $textToDisplay->triggers = $campaign->sending_params; |
| 1057 | 1108 | acym_trigger('onAcymDeclareSummary_triggers', [&$textToDisplay], 'plgAcymTime'); |
| 1058 | 1109 | $textToDisplay = $textToDisplay->triggers; |
| 1059 | - if (!empty($campaign->sending_params['start_date'])) { | |
| 1060 | - $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']; | |
| 1061 | 1114 | } |
| 1062 | 1115 | } |
| 1063 | 1116 | |
| 1064 | 1117 | $data['automatic'] = [ |
| @@ -1067,9 +1120,9 @@ | ||
| 1067 | 1120 | ? '' |
| 1068 | 1121 | : acym_translation('ACYM_THIS_WILL_GENERATE_CAMPAIGN_AUTOMATICALLY').' '.acym_strtolower( |
| 1069 | 1122 | $textToDisplay[$textToDisplay['trigger_type']] |
| 1070 | 1123 | ), |
| 1071 | - 'startDate' => $startDate, | |
| 1124 | + 'nextDate' => $nextDate, | |
| 1072 | 1125 | ]; |
| 1073 | 1126 | $data['campaignInformation'] = $campaign; |
| 1074 | 1127 | $data['mailId'] = $campaign->mail_id; |
| 1075 | 1128 | |
| @@ -1127,13 +1180,15 @@ | ||
| 1127 | 1180 | $listsIds[] = $oneList->list_id; |
| 1128 | 1181 | } |
| 1129 | 1182 | |
| 1130 | 1183 | if (empty($data['campaignInformation']->sending_params)) { |
| 1184 | + // No segment saved, get subscribers count the easy way | |
| 1131 | 1185 | $listClass = new ListClass(); |
| 1132 | 1186 | $nbSubscribers = $listClass->getSubscribersCount($listsIds); |
| 1133 | 1187 | } else { |
| 1188 | + // There may be segments | |
| 1134 | 1189 | $campaignClass = new CampaignClass(); |
| 1135 | - $nbSubscribers = $campaignClass->countUsersCampaign($data['campaignInformation']->id); | |
| 1190 | + $nbSubscribers = $campaignClass->countUsersCampaign($data['campaignInformation']->id, true); | |
| 1136 | 1191 | } |
| 1137 | 1192 | } |
| 1138 | 1193 | |
| 1139 | 1194 | $data['listsReceiver'] = $campaignLists; |
| @@ -1139,8 +1194,9 @@ | ||
| 1139 | 1194 | $data['listsReceiver'] = $campaignLists; |
| 1140 | 1195 | $data['listsIds'] = $listsIds; |
| 1141 | 1196 | $data['nbSubscribers'] = $nbSubscribers; |
| 1142 | 1197 | |
| 1198 | + // Campaign already sent, calculate the number of new receivers | |
| 1143 | 1199 | if (!empty($data['campaignInformation']->sent) && !empty($data['campaignInformation']->active)) { |
| 1144 | 1200 | $queueClass = new QueueClass(); |
| 1145 | 1201 | $data['mailInformation']->sending_params = $data['campaignInformation']->sending_params; |
| 1146 | 1202 | |
| @@ -1173,8 +1229,10 @@ | ||
| 1173 | 1229 | |
| 1174 | 1230 | $mailClass = new MailClass(); |
| 1175 | 1231 | $emailsToTest = $mailClass->getParentAndChildMails($campaign->mail_id); |
| 1176 | 1232 | |
| 1233 | + $isDemo = false; | |
| 1234 | + | |
| 1177 | 1235 | $data = [ |
| 1178 | 1236 | 'id' => $campaign->id, |
| 1179 | 1237 | 'currentCampaign' => $campaign, |
| 1180 | 1238 | 'test_emails' => $defaultEmails, |
| @@ -1180,8 +1238,9 @@ | ||
| 1180 | 1238 | 'test_emails' => $defaultEmails, |
| 1181 | 1239 | 'upgrade' => !acym_level(ACYM_ESSENTIAL), |
| 1182 | 1240 | 'version' => 'enterprise', |
| 1183 | 1241 | 'emails_to_test' => $emailsToTest, |
| 1242 | + 'isDemo' => $isDemo, | |
| 1184 | 1243 | ]; |
| 1185 | 1244 | if (!acym_isAcyCheckerInstalled()) { |
| 1186 | 1245 | $lists = $campaignClass->getListsByMailId($campaign->mail_id); |
| 1187 | 1246 | $listClass = new ListClass(); |
| @@ -1190,15 +1249,15 @@ | ||
| 1190 | 1249 | |
| 1191 | 1250 | $this->prepareListingClasses($data); |
| 1192 | 1251 | $this->prepareSegmentDisplay($data, $campaign->sending_params); |
| 1193 | 1252 | |
| 1194 | - $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); | |
| 1195 | 1254 | parent::display($data); |
| 1196 | 1255 | } |
| 1197 | 1256 | |
| 1198 | 1257 | public function saveTests(): void |
| 1199 | 1258 | { |
| 1200 | - if (!acym_isAdmin()) { | |
| 1259 | + if (!acym_isAdmin() || !acym_isAllowed('campaigns')) { | |
| 1201 | 1260 | die('Access denied for tests step'); |
| 1202 | 1261 | } |
| 1203 | 1262 | |
| 1204 | 1263 | $this->edit(); |