6
6
7
7
use Mautic \DynamicContentBundle \DynamicContentEvents ;
8
8
use Mautic \DynamicContentBundle \Event \ContactFiltersEvaluateEvent ;
9
- use Mautic \EmailBundle \EventListener \MatchFilterForLeadTrait ;
10
- use MauticPlugin \CustomObjectsBundle \Exception \InvalidArgumentException ;
11
9
use MauticPlugin \CustomObjectsBundle \Exception \InvalidSegmentFilterException ;
12
- use MauticPlugin \CustomObjectsBundle \Exception \NotFoundException ;
13
- use MauticPlugin \CustomObjectsBundle \Helper \QueryFilterHelper ;
10
+ use MauticPlugin \CustomObjectsBundle \Helper \ContactFilterMatcher ;
14
11
use MauticPlugin \CustomObjectsBundle \Provider \ConfigProvider ;
15
- use MauticPlugin \CustomObjectsBundle \Repository \DbalQueryTrait ;
16
12
use MauticPlugin \CustomObjectsBundle \Segment \Query \Filter \QueryFilterFactory ;
17
- use PDOException ;
18
- use Psr \Log \LoggerInterface ;
19
13
use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
20
14
21
15
class DynamicContentSubscriber implements EventSubscriberInterface
22
16
{
23
- use MatchFilterForLeadTrait;
24
- use DbalQueryTrait;
25
-
26
- /**
27
- * @var QueryFilterFactory
28
- */
29
- private $ queryFilterFactory ;
30
-
31
- /**
32
- * @var QueryFilterHelper
33
- */
34
- private $ queryFilterHelper ;
35
-
36
- /**
37
- * @var ConfigProvider
38
- */
39
- private $ configProvider ;
40
-
41
- /**
42
- * @var LoggerInterface
43
- */
44
- private $ logger ;
17
+ private QueryFilterFactory $ queryFilterFactory ;
18
+ private ConfigProvider $ configProvider ;
19
+ private ContactFilterMatcher $ contactFilterMatcher ;
45
20
46
21
public function __construct (
47
22
QueryFilterFactory $ queryFilterFactory ,
48
- QueryFilterHelper $ queryFilterHelper ,
49
23
ConfigProvider $ configProvider ,
50
- LoggerInterface $ logger
24
+ ContactFilterMatcher $ contactFilterMatcher
51
25
) {
52
- $ this ->queryFilterFactory = $ queryFilterFactory ;
53
- $ this ->queryFilterHelper = $ queryFilterHelper ;
54
- $ this ->configProvider = $ configProvider ;
55
- $ this ->logger = $ logger ;
26
+ $ this ->queryFilterFactory = $ queryFilterFactory ;
27
+ $ this ->configProvider = $ configProvider ;
28
+ $ this ->contactFilterMatcher = $ contactFilterMatcher ;
56
29
}
57
30
58
31
/**
59
- * @return mixed[]
32
+ * @return array<string,array{string,int}>
60
33
*/
61
34
public static function getSubscribedEvents (): array
62
35
{
@@ -65,47 +38,37 @@ public static function getSubscribedEvents(): array
65
38
];
66
39
}
67
40
68
- /**
69
- * @throws InvalidArgumentException
70
- * @throws NotFoundException
71
- */
72
41
public function evaluateFilters (ContactFiltersEvaluateEvent $ event ): void
73
42
{
74
- if (!$ this ->configProvider ->pluginIsEnabled ()) {
75
- return ;
76
- }
77
-
78
- $ eventFilters = $ event ->getFilters ();
79
-
80
- if ($ event ->isEvaluated ()) {
43
+ if ($ event ->isEvaluated ()
44
+ || !$ this ->configProvider ->pluginIsEnabled ()
45
+ || !$ this ->hasCustomObjectFilters ($ event ->getFilters ())
46
+ ) {
81
47
return ;
82
48
}
83
49
84
- foreach ($ eventFilters as $ key => $ eventFilter ) {
85
- $ queryAlias = "filter_ {$ key }" ;
86
-
87
- try {
88
- $ filterQueryBuilder = $ this ->queryFilterFactory ->configureQueryBuilderFromSegmentFilter ($ eventFilter , $ queryAlias );
89
- } catch (InvalidSegmentFilterException $ e ) {
90
- continue ;
91
- }
92
-
93
- $ this ->queryFilterHelper ->addContactIdRestriction ($ filterQueryBuilder , $ queryAlias , (int ) $ event ->getContact ()->getId ());
50
+ $ event ->setIsEvaluated (true );
51
+ $ event ->stopPropagation ();
52
+ $ event ->setIsMatched ($ this ->contactFilterMatcher ->match (
53
+ $ event ->getFilters (),
54
+ $ event ->getContact ()->getProfileFields ()
55
+ ));
56
+ }
94
57
58
+ /**
59
+ * @param mixed[] $filters
60
+ */
61
+ private function hasCustomObjectFilters (array $ filters ): bool
62
+ {
63
+ foreach ($ filters as $ filter ) {
95
64
try {
96
- if ($ this ->executeSelect ($ filterQueryBuilder )->rowCount ()) {
97
- $ event ->setIsEvaluated (true );
98
- $ event ->setIsMatched (true );
99
- } else {
100
- $ event ->setIsEvaluated (true );
101
- }
102
- } catch (PDOException $ e ) {
103
- $ this ->logger ->addError ('Failed to evaluate dynamic content for custom object ' .$ e ->getMessage ());
65
+ $ this ->queryFilterFactory ->configureQueryBuilderFromSegmentFilter ($ filter , 'filter ' );
104
66
105
- throw $ e ;
67
+ return true ;
68
+ } catch (InvalidSegmentFilterException $ e ) {
106
69
}
107
-
108
- $ event ->stopPropagation (); // The filter is ours, we won't allow no more processing
109
70
}
71
+
72
+ return false ;
110
73
}
111
74
}
0 commit comments