Move multi-conditional segment processing to Premium
[MAILPOET-3929]
This commit is contained in:
@@ -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 {
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user