Move multi-conditional segment processing to Premium

[MAILPOET-3929]
This commit is contained in:
wxa
2021-12-06 18:11:38 +03:00
committed by Veljko V
parent 5e486462c0
commit 5641efb0d7
3 changed files with 43 additions and 5 deletions

View File

@@ -17,8 +17,21 @@ use MailPoet\Segments\DynamicSegments\Filters\WooCommerceNumberOfOrders;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceSubscription; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceSubscription;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceTotalSpent; use MailPoet\Segments\DynamicSegments\Filters\WooCommerceTotalSpent;
use MailPoet\WP\Functions as WPFunctions;
class FilterDataMapper { class FilterDataMapper {
/** @var WPFunctions */
private $wp;
public function __construct(
WPFunctions $wp = null
) {
if (!$wp) {
$wp = WPFunctions::get();
}
$this->wp = $wp;
}
/** /**
* @param array $data * @param array $data
* @return DynamicSegmentFilterData[] * @return DynamicSegmentFilterData[]
@@ -28,11 +41,16 @@ class FilterDataMapper {
if (!isset($data['filters']) || count($data['filters'] ?? []) < 1) { if (!isset($data['filters']) || count($data['filters'] ?? []) < 1) {
throw new InvalidFilterException('Filters are missing', InvalidFilterException::MISSING_FILTER); throw new InvalidFilterException('Filters are missing', InvalidFilterException::MISSING_FILTER);
} }
foreach ($data['filters'] as $filter) { $processFilter = function ($filter, $data) {
$filter['connect'] = $data['filters_connect'] ?? DynamicSegmentFilterData::CONNECT_TYPE_AND; $filter['connect'] = $data['filters_connect'] ?? DynamicSegmentFilterData::CONNECT_TYPE_AND;
$filters[] = $this->createFilter($filter); return $this->createFilter($filter);
};
$wpFilterName = 'mailpoet_dynamic_segments_filters_map';
if ($this->wp->hasFilter($wpFilterName)) {
return $this->wp->applyFilters($wpFilterName, $data, $processFilter);
} }
return $filters; $filter = reset($data['filters']);
return [$processFilter($filter, $data)];
} }
private function createFilter(array $filterData): DynamicSegmentFilterData { private function createFilter(array $filterData): DynamicSegmentFilterData {

View File

@@ -29,14 +29,19 @@ class SegmentsRepository extends Repository {
/** @var FormsRepository */ /** @var FormsRepository */
private $formsRepository; private $formsRepository;
/** @var WPFunctions */
private $wp;
public function __construct( public function __construct(
EntityManager $entityManager, EntityManager $entityManager,
NewsletterSegmentRepository $newsletterSegmentRepository, NewsletterSegmentRepository $newsletterSegmentRepository,
FormsRepository $formsRepository FormsRepository $formsRepository,
WPFunctions $wp
) { ) {
parent::__construct($entityManager); parent::__construct($entityManager);
$this->newsletterSegmentRepository = $newsletterSegmentRepository; $this->newsletterSegmentRepository = $newsletterSegmentRepository;
$this->formsRepository = $formsRepository; $this->formsRepository = $formsRepository;
$this->wp = $wp;
} }
protected function getEntityClassName() { protected function getEntityClassName() {
@@ -137,7 +142,8 @@ class SegmentsRepository extends Repository {
$this->entityManager->remove($filterEntity); $this->entityManager->remove($filterEntity);
} }
} }
foreach ($filtersData as $key => $filterData) {
$createOrUpdateFilter = function ($filterData, $key) use ($segment) {
if ($filterData instanceof DynamicSegmentFilterData) { if ($filterData instanceof DynamicSegmentFilterData) {
$filterEntity = $segment->getDynamicFilters()->get($key); $filterEntity = $segment->getDynamicFilters()->get($key);
if (!$filterEntity instanceof DynamicSegmentFilterEntity) { if (!$filterEntity instanceof DynamicSegmentFilterEntity) {
@@ -148,7 +154,17 @@ class SegmentsRepository extends Repository {
$filterEntity->setFilterData($filterData); $filterEntity->setFilterData($filterData);
} }
} }
};
$wpActionName = 'mailpoet_dynamic_segments_filters_save';
if ($this->wp->hasAction($wpActionName)) {
$this->wp->doAction($wpActionName, $createOrUpdateFilter, $filtersData);
} else {
$filterData = reset($filtersData);
$key = key($filtersData);
$createOrUpdateFilter($filterData, $key);
} }
$this->flush(); $this->flush();
return $segment; return $segment;
} }

View File

@@ -317,6 +317,10 @@ class Functions {
return get_user_by($field, $value); return get_user_by($field, $value);
} }
public function hasAction($tag, $functionToCheck = false) {
return has_action($tag, $functionToCheck);
}
public function hasFilter($tag, $functionToCheck = false) { public function hasFilter($tag, $functionToCheck = false) {
return has_filter($tag, $functionToCheck); return has_filter($tag, $functionToCheck);
} }