Skip to content

Commit 48a0dbf

Browse files
committed
Merge branch 'MAUT-12558' into development
2 parents c4cb81a + 6404e17 commit 48a0dbf

12 files changed

+808
-479
lines changed

Config/config.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -837,9 +837,8 @@
837837
'class' => \MauticPlugin\CustomObjectsBundle\EventListener\DynamicContentSubscriber::class,
838838
'arguments' => [
839839
'custom_object.query.filter.factory',
840-
'custom_object.query.filter.helper',
841840
'custom_object.config.provider',
842-
'monolog.logger.mautic',
841+
'custom_object.helper.contact_filter_matcher',
843842
],
844843
],
845844
'custom_object.serializer.subscriber' => [
@@ -863,12 +862,11 @@
863862
'custom_object.query.filter.factory',
864863
'mautic.custom.model.object',
865864
'mautic.custom.model.item',
866-
'mautic.custom.model.field',
867865
'custom_object.token.parser',
868866
'mautic.campaign.model.event',
869867
'event_dispatcher',
870868
'custom_object.helper.token_formatter',
871-
'%mautic.custom_item_fetch_limit_per_lead%',
869+
'custom_object.helper.contact_filter_matcher',
872870
],
873871
],
874872
'custom_object.segments.decorator_delegate.subscriber' => [
@@ -1177,6 +1175,18 @@
11771175
'mautic.custom.model.item',
11781176
],
11791177
],
1178+
'custom_object.helper.contact_filter_matcher' => [
1179+
'class' => \MauticPlugin\CustomObjectsBundle\Helper\ContactFilterMatcher::class,
1180+
'arguments' => [
1181+
'mautic.custom.model.field',
1182+
'mautic.custom.model.object',
1183+
'mautic.custom.model.item',
1184+
'mautic.lead.repository.lead_list',
1185+
'mautic.lead.repository.company',
1186+
'doctrine.dbal.default_connection',
1187+
'%mautic.custom_item_fetch_limit_per_lead%',
1188+
],
1189+
],
11801190
],
11811191
'validators' => [
11821192
'custom_object.allow.unique_identifier.validator' => [

EventListener/DynamicContentSubscriber.php

Lines changed: 31 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -6,57 +6,30 @@
66

77
use Mautic\DynamicContentBundle\DynamicContentEvents;
88
use Mautic\DynamicContentBundle\Event\ContactFiltersEvaluateEvent;
9-
use Mautic\EmailBundle\EventListener\MatchFilterForLeadTrait;
10-
use MauticPlugin\CustomObjectsBundle\Exception\InvalidArgumentException;
119
use MauticPlugin\CustomObjectsBundle\Exception\InvalidSegmentFilterException;
12-
use MauticPlugin\CustomObjectsBundle\Exception\NotFoundException;
13-
use MauticPlugin\CustomObjectsBundle\Helper\QueryFilterHelper;
10+
use MauticPlugin\CustomObjectsBundle\Helper\ContactFilterMatcher;
1411
use MauticPlugin\CustomObjectsBundle\Provider\ConfigProvider;
15-
use MauticPlugin\CustomObjectsBundle\Repository\DbalQueryTrait;
1612
use MauticPlugin\CustomObjectsBundle\Segment\Query\Filter\QueryFilterFactory;
17-
use PDOException;
18-
use Psr\Log\LoggerInterface;
1913
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
2014

2115
class DynamicContentSubscriber implements EventSubscriberInterface
2216
{
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;
4520

4621
public function __construct(
4722
QueryFilterFactory $queryFilterFactory,
48-
QueryFilterHelper $queryFilterHelper,
4923
ConfigProvider $configProvider,
50-
LoggerInterface $logger
24+
ContactFilterMatcher $contactFilterMatcher
5125
) {
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;
5629
}
5730

5831
/**
59-
* @return mixed[]
32+
* @return array<string,array{string,int}>
6033
*/
6134
public static function getSubscribedEvents(): array
6235
{
@@ -65,47 +38,37 @@ public static function getSubscribedEvents(): array
6538
];
6639
}
6740

68-
/**
69-
* @throws InvalidArgumentException
70-
* @throws NotFoundException
71-
*/
7241
public function evaluateFilters(ContactFiltersEvaluateEvent $event): void
7342
{
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+
) {
8147
return;
8248
}
8349

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+
}
9457

58+
/**
59+
* @param mixed[] $filters
60+
*/
61+
private function hasCustomObjectFilters(array $filters): bool
62+
{
63+
foreach ($filters as $filter) {
9564
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');
10466

105-
throw $e;
67+
return true;
68+
} catch (InvalidSegmentFilterException $e) {
10669
}
107-
108-
$event->stopPropagation(); // The filter is ours, we won't allow no more processing
10970
}
71+
72+
return false;
11073
}
11174
}

0 commit comments

Comments
 (0)