diff --git a/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php b/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php index 03bc7de96d..6f59f73405 100644 --- a/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php +++ b/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php @@ -55,8 +55,8 @@ class TriggerHandler { // ensure subjects are registered and loadable $loadedSubjects = []; - foreach ($subjects as $key => $args) { - $loadedSubjects[] = $this->subjectLoader->loadSubject($key, $args); + foreach ($subjects as $subject) { + $loadedSubjects[] = $this->subjectLoader->loadSubject($subject['key'], $subject['args']); } $workflowRun = new WorkflowRun($workflow->getId(), $trigger->getKey(), $loadedSubjects); diff --git a/mailpoet/lib/Automation/Engine/Storage/WorkflowRunStorage.php b/mailpoet/lib/Automation/Engine/Storage/WorkflowRunStorage.php index ba23372273..92002472c3 100644 --- a/mailpoet/lib/Automation/Engine/Storage/WorkflowRunStorage.php +++ b/mailpoet/lib/Automation/Engine/Storage/WorkflowRunStorage.php @@ -42,11 +42,9 @@ class WorkflowRunStorage { if ($result) { $data = (array)$result; - $subjects = []; - foreach (Json::decode($data['subjects']) as $key => $args) { - $subjects[$key] = $this->subjectLoader->loadSubject($key, $args); - } - $data['subjects'] = $subjects; + $data['subjects'] = array_map(function (array $subject) { + return $this->subjectLoader->loadSubject($subject['key'], $subject['args']); + }, Json::decode($data['subjects'])); return WorkflowRun::fromArray($data); } return null; diff --git a/mailpoet/lib/Automation/Engine/Workflows/WorkflowRun.php b/mailpoet/lib/Automation/Engine/Workflows/WorkflowRun.php index c1326bf87e..d393e4249e 100644 --- a/mailpoet/lib/Automation/Engine/Workflows/WorkflowRun.php +++ b/mailpoet/lib/Automation/Engine/Workflows/WorkflowRun.php @@ -76,7 +76,14 @@ class WorkflowRun { } /** @return Subject[] */ - public function getSubjects(): array { + public function getSubjects(string $key = null): array { + if ($key) { + return array_values( + array_filter($this->subjects, function (Subject $subject) use ($key) { + return $subject->getKey() === $key; + }) + ); + } return $this->subjects; } @@ -88,10 +95,9 @@ class WorkflowRun { 'created_at' => $this->createdAt->format(DateTimeImmutable::W3C), 'updated_at' => $this->updatedAt->format(DateTimeImmutable::W3C), 'subjects' => Json::encode( - array_reduce($this->subjects, function (array $subjects, Subject $subject): array { - $subjects[$subject->getKey()] = $subject->pack(); - return $subjects; - }, []) + array_map(function (Subject $subject): array { + return ['key' => $subject->getKey(), 'args' => $subject->pack()]; + }, $this->subjects) ), ]; } diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Actions/SendWelcomeEmailAction.php b/mailpoet/lib/Automation/Integrations/MailPoet/Actions/SendWelcomeEmailAction.php index eb6fd4163f..3ae96b0bcc 100644 --- a/mailpoet/lib/Automation/Integrations/MailPoet/Actions/SendWelcomeEmailAction.php +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Actions/SendWelcomeEmailAction.php @@ -4,6 +4,7 @@ namespace MailPoet\Automation\Integrations\MailPoet\Actions; use MailPoet\Automation\Engine\Workflows\Action; use MailPoet\Automation\Engine\Workflows\Step; +use MailPoet\Automation\Engine\Workflows\Subject; use MailPoet\Automation\Engine\Workflows\Workflow; use MailPoet\Automation\Engine\Workflows\WorkflowRun; use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject; @@ -61,16 +62,20 @@ class SendWelcomeEmailAction implements Action { } catch (InvalidStateException $exception) { return false; } - - $segmentSubject = $subjects['mailpoet:segment'] ?? null; - $subscriberSubject = $subjects['mailpoet:subscriber'] ?? null; - return $segmentSubject instanceof SegmentSubject && $subscriberSubject instanceof SubscriberSubject; + $segmentSubjects = array_filter($subjects, function (Subject $subject) { + return $subject->getKey() === SegmentSubject::KEY; + }); + $subscriberSubjects = array_filter($subjects, function (Subject $subject) { + return $subject->getKey() === SubscriberSubject::KEY; + }); + + return count($segmentSubjects) === 1 && count($subscriberSubjects) === 1; } public function run(Workflow $workflow, WorkflowRun $workflowRun, Step $step): void { $newsletter = $this->getWelcomeEmailForStep($step); - $subscriberSubject = $workflowRun->getSubjects()['mailpoet:subscriber'] ?? null; + $subscriberSubject = $workflowRun->getSubjects('mailpoet:subscriber')[0] ?? null; if (!$subscriberSubject instanceof SubscriberSubject) { throw InvalidStateException::create()->withMessage('A mailpoet:subscriber subject is required.'); } @@ -86,7 +91,7 @@ class SendWelcomeEmailAction implements Action { throw InvalidStateException::create()->withMessage(sprintf("Cannot schedule a newsletter for subscriber ID '%s' because their status is '%s'.", $subscriber->getId(), $subscriber->getStatus())); } - $segmentSubject = $workflowRun->getSubjects()['mailpoet:segment'] ?? null; + $segmentSubject = $workflowRun->getSubjects('mailpoet:segment')[0] ?? null; if (!$segmentSubject instanceof SegmentSubject) { throw InvalidStateException::create()->withMessage('A mailpoet:segment subject is required.'); } @@ -119,7 +124,7 @@ class SendWelcomeEmailAction implements Action { ->withErrors($errors); } } - + private function getWelcomeEmailForStep(Step $step): NewsletterEntity { $welcomeEmailId = $step->getArgs()['welcomeEmailId'] ?? null; if ($welcomeEmailId === null) { diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SegmentSubscribedTrigger.php b/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SegmentSubscribedTrigger.php index aadc4e0090..efce304620 100644 --- a/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SegmentSubscribedTrigger.php +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SegmentSubscribedTrigger.php @@ -41,8 +41,18 @@ class SegmentSubscribedTrigger implements Trigger { } $this->wp->doAction(Hooks::TRIGGER, $this, [ - SegmentSubject::KEY => ['segment_id' => $segment->getId()], - SubscriberSubject::KEY => ['subscriber_id' => $subscriber->getId()], + [ + 'key' => SegmentSubject::KEY, + 'args' => [ + 'segment_id' => $segment->getId(), + ], + ], + [ + 'key' => SubscriberSubject::KEY, + 'args' => [ + 'subscriber_id' => $subscriber->getId(), + ], + ], ]); } }