diff --git a/mailpoet/lib/Automation/Engine/Control/FilterHandler.php b/mailpoet/lib/Automation/Engine/Control/FilterHandler.php index 6357c38f8d..53be31a76b 100644 --- a/mailpoet/lib/Automation/Engine/Control/FilterHandler.php +++ b/mailpoet/lib/Automation/Engine/Control/FilterHandler.php @@ -7,6 +7,7 @@ use MailPoet\Automation\Engine\Data\FilterGroup; use MailPoet\Automation\Engine\Data\Filters; use MailPoet\Automation\Engine\Data\StepRunArgs; use MailPoet\Automation\Engine\Exceptions; +use MailPoet\Automation\Engine\Integration\Filter; use MailPoet\Automation\Engine\Registry; class FilterHandler { @@ -40,9 +41,10 @@ class FilterHandler { public function matchesGroup(FilterGroup $group, StepRunArgs $args): bool { $operator = $group->getOperator(); - foreach ($group->getFilters() as $filter) { - $value = $args->getFieldValue($filter->getFieldKey()); - $matches = $this->matchesFilter($filter, $value); + foreach ($group->getFilters() as $filterData) { + $filter = $this->getFilter($filterData); + $value = $args->getFieldValue($filterData->getFieldKey(), $filter->getFieldParams($filterData)); + $matches = $filter->matches($filterData, $value); if ($operator === FilterGroup::OPERATOR_AND && !$matches) { return false; } @@ -53,12 +55,11 @@ class FilterHandler { return $operator === FilterGroup::OPERATOR_AND; } - /** @param mixed $value */ - private function matchesFilter(FilterData $data, $value): bool { + private function getFilter(FilterData $data): Filter { $filter = $this->registry->getFilter($data->getFieldType()); if (!$filter) { throw Exceptions::filterNotFound($data->getFieldType()); } - return $filter->matches($data, $value); + return $filter; } } diff --git a/mailpoet/lib/Automation/Engine/Data/Field.php b/mailpoet/lib/Automation/Engine/Data/Field.php index 0497dcad5e..3630c5dd88 100644 --- a/mailpoet/lib/Automation/Engine/Data/Field.php +++ b/mailpoet/lib/Automation/Engine/Data/Field.php @@ -60,8 +60,8 @@ class Field { } /** @return mixed */ - public function getValue(Payload $payload) { - return $this->getFactory()($payload); + public function getValue(Payload $payload, array $params = []) { + return $this->getFactory()($payload, $params); } public function getArgs(): array { diff --git a/mailpoet/lib/Automation/Engine/Data/StepRunArgs.php b/mailpoet/lib/Automation/Engine/Data/StepRunArgs.php index 72b2bf802a..e8e3996cef 100644 --- a/mailpoet/lib/Automation/Engine/Data/StepRunArgs.php +++ b/mailpoet/lib/Automation/Engine/Data/StepRunArgs.php @@ -137,7 +137,7 @@ class StepRunArgs { } /** @return mixed */ - public function getFieldValue(string $key) { + public function getFieldValue(string $key, array $params = []) { $field = $this->fields[$key] ?? null; $subjectKey = $this->fieldToSubjectMap[$key] ?? null; if (!$field || !$subjectKey) { @@ -146,7 +146,7 @@ class StepRunArgs { $entry = $this->getSingleSubjectEntry($subjectKey); try { - $value = $field->getValue($entry->getPayload()); + $value = $field->getValue($entry->getPayload(), $params); } catch (Throwable $e) { throw Exceptions::fieldLoadFailed($field->getKey(), $field->getArgs()); } diff --git a/mailpoet/tests/unit/Automation/Engine/Control/FilterHandlerTest.php b/mailpoet/tests/unit/Automation/Engine/Control/FilterHandlerTest.php index 3bdd6bea1a..4ac6dea47f 100644 --- a/mailpoet/tests/unit/Automation/Engine/Control/FilterHandlerTest.php +++ b/mailpoet/tests/unit/Automation/Engine/Control/FilterHandlerTest.php @@ -114,6 +114,42 @@ class FilterHandlerTest extends MailPoetUnitTest { $this->assertSame($expectation, $result); } + public function testItPassesFieldParams(): void { + $filter = new FilterData('f', Field::TYPE_STRING, 'test:field-string', '', ['value' => 'abc']); + $filters = new Filters('and', [new FilterGroup('g1', 'and', [$filter])]); + $step = new Step('step', Step::TYPE_TRIGGER, 'test:step', [], [], $filters); + + $fieldParams = null; + $subject = $this->createSubject('subject', [ + new Field('test:field-string', Field::TYPE_STRING, 'Test field string', function ($payload, $params) use (&$fieldParams) { + $fieldParams = $params; + return 'abc'; + }), + ]); + + $stepRunArgs = new StepRunArgs( + $this->createMock(Automation::class), + $this->createMock(AutomationRun::class), + $step, + [new SubjectEntry($subject, new SubjectData($subject->getKey(), []))], + 1 + ); + + $registry = Stub::make(Registry::class, [ + 'filters' => [ + Field::TYPE_STRING => $this->createFilter(Field::TYPE_STRING), + ], + ]); + + $handler = new FilterHandler($registry); + $result = $handler->matchesFilters($stepRunArgs); + $this->assertSame(true, $result); + $this->assertSame([ + 'test-param' => 'test-param-value', + 'test-param-data' => $filter, + ], $fieldParams); + } + public function dataForTestItFilters(): array { return [ // no filters @@ -287,7 +323,10 @@ class FilterHandlerTest extends MailPoetUnitTest { } public function getFieldParams(FilterData $data): array { - return []; + return [ + 'test-param' => 'test-param-value', + 'test-param-data' => $data, + ]; } public function matches(FilterData $data, $value): bool {