Add 'not contains' option for text custom fields
MAILPOET-4996
This commit is contained in:
committed by
Aschepikov
parent
aece1b60a9
commit
fe318f5a30
@@ -18,6 +18,7 @@ export function validateText(item: WordpressRoleFormItem): boolean {
|
||||
item.value.length > 0 &&
|
||||
(item.operator === 'equals' ||
|
||||
item.operator === 'contains' ||
|
||||
item.operator === 'not_contains' ||
|
||||
item.operator === 'not_equals' ||
|
||||
item.operator === 'more_than' ||
|
||||
item.operator === 'less_than')
|
||||
@@ -56,6 +57,7 @@ export function Text({ filterIndex }: FilterProps): JSX.Element {
|
||||
<option value="equals">{MailPoet.I18n.t('is')}</option>
|
||||
<option value="not_equals">{MailPoet.I18n.t('isNot')}</option>
|
||||
<option value="contains">{MailPoet.I18n.t('contains')}</option>
|
||||
<option value="not_contains">{MailPoet.I18n.t('notContains')}</option>
|
||||
<option value="more_than">{MailPoet.I18n.t('moreThan')}</option>
|
||||
<option value="less_than">{MailPoet.I18n.t('lessThan')}</option>
|
||||
<option value="is_blank">{MailPoet.I18n.t('isBlank')}</option>
|
||||
|
@@ -6,6 +6,7 @@ use MailPoet\Entities\CustomFieldEntity;
|
||||
use MailPoet\Entities\DynamicSegmentFilterEntity;
|
||||
use MailPoet\Entities\SubscriberCustomFieldEntity;
|
||||
use MailPoet\Entities\SubscriberEntity;
|
||||
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
|
||||
use MailPoet\Util\Helpers;
|
||||
use MailPoet\Util\Security;
|
||||
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
||||
@@ -131,6 +132,14 @@ class MailPoetCustomFields implements Filter {
|
||||
$operator = $filterData->getParam('operator');
|
||||
$value = $filterData->getParam('value');
|
||||
|
||||
$requiresValue = !in_array($operator, ['is_blank', 'is_not_blank']);
|
||||
|
||||
if ($requiresValue && !is_string($value)) {
|
||||
throw new InvalidFilterException('Missing required value', InvalidFilterException::MISSING_VALUE);
|
||||
}
|
||||
|
||||
/** @var string $value - for PhpStan */
|
||||
|
||||
if ($operator === 'equals') {
|
||||
$queryBuilder->andWhere("subscribers_custom_field.value = $valueParam");
|
||||
$queryBuilder->setParameter($valueParam, $value);
|
||||
@@ -148,6 +157,9 @@ class MailPoetCustomFields implements Filter {
|
||||
$queryBuilder->andWhere('subscribers_custom_field.value IS NULL');
|
||||
} elseif ($operator === 'is_not_blank') {
|
||||
$queryBuilder->andWhere('subscribers_custom_field.value IS NOT NULL');
|
||||
} elseif ($operator === 'not_contains') {
|
||||
$queryBuilder->andWhere("subscribers_custom_field.value NOT LIKE $valueParam");
|
||||
$queryBuilder->setParameter($valueParam, '%' . Helpers::escapeSearch($value) . '%');
|
||||
} else {
|
||||
$queryBuilder->andWhere("subscribers_custom_field.value LIKE $valueParam");
|
||||
$queryBuilder->setParameter($valueParam, '%' . Helpers::escapeSearch($value) . '%');
|
||||
|
@@ -540,11 +540,6 @@ parameters:
|
||||
count: 1
|
||||
path: ../../lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#1 \\$search of static method MailPoet\\\\Util\\\\Helpers\\:\\:escapeSearch\\(\\) expects string, mixed given\\.$#"
|
||||
count: 1
|
||||
path: ../../lib/Segments/DynamicSegments/Filters/MailPoetCustomFields.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#2 \\$operator of method MailPoet\\\\Segments\\\\DynamicSegments\\\\Filters\\\\MailPoetCustomFields\\:\\:applyForDateEqual\\(\\) expects string\\|null, mixed given\\.$#"
|
||||
count: 1
|
||||
|
@@ -540,11 +540,6 @@ parameters:
|
||||
count: 1
|
||||
path: ../../lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#1 \\$search of static method MailPoet\\\\Util\\\\Helpers\\:\\:escapeSearch\\(\\) expects string, mixed given\\.$#"
|
||||
count: 1
|
||||
path: ../../lib/Segments/DynamicSegments/Filters/MailPoetCustomFields.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#2 \\$operator of method MailPoet\\\\Segments\\\\DynamicSegments\\\\Filters\\\\MailPoetCustomFields\\:\\:applyForDateEqual\\(\\) expects string\\|null, mixed given\\.$#"
|
||||
count: 1
|
||||
|
@@ -539,11 +539,6 @@ parameters:
|
||||
count: 1
|
||||
path: ../../lib/Segments/DynamicSegments/Filters/EmailOpensAbsoluteCountAction.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#1 \\$search of static method MailPoet\\\\Util\\\\Helpers\\:\\:escapeSearch\\(\\) expects string, mixed given\\.$#"
|
||||
count: 1
|
||||
path: ../../lib/Segments/DynamicSegments/Filters/MailPoetCustomFields.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#2 \\$operator of method MailPoet\\\\Segments\\\\DynamicSegments\\\\Filters\\\\MailPoetCustomFields\\:\\:applyForDateEqual\\(\\) expects string\\|null, mixed given\\.$#"
|
||||
count: 1
|
||||
|
@@ -56,6 +56,22 @@ class MailPoetCustomFieldsTest extends \MailPoetTest {
|
||||
$this->assertEqualsCanonicalizing([$subscriber->getEmail()], $emails);
|
||||
}
|
||||
|
||||
public function testItFiltersSubscribersWithTextNotContains(): void {
|
||||
$customField = $this->createCustomField(CustomFieldEntity::TYPE_TEXT);
|
||||
$this->entityManager->persist(new SubscriberCustomFieldEntity($this->subscribers[0], $customField, 'some value'));
|
||||
$this->entityManager->persist(new SubscriberCustomFieldEntity($this->subscribers[1], $customField, 'different value'));
|
||||
$this->entityManager->persist($customField);
|
||||
$this->entityManager->flush();
|
||||
$segmentFilterData = new DynamicSegmentFilterData(DynamicSegmentFilterData::TYPE_USER_ROLE, MailPoetCustomFields::TYPE, [
|
||||
'custom_field_id' => $customField->getId(),
|
||||
'custom_field_type' => CustomFieldEntity::TYPE_TEXT,
|
||||
'operator' => 'not_contains',
|
||||
'value' => 'me val',
|
||||
]);
|
||||
$emails = $this->tester->getSubscriberEmailsMatchingDynamicFilter($segmentFilterData, $this->filter);
|
||||
$this->assertEqualsCanonicalizing([$this->subscribers[1]->getEmail()], $emails);
|
||||
}
|
||||
|
||||
public function testItFiltersSubscribersTextNotEquals(): void {
|
||||
$customField = $this->createCustomField(CustomFieldEntity::TYPE_TEXT);
|
||||
$this->entityManager->persist(new SubscriberCustomFieldEntity($this->subscribers[1], $customField, 'something else'));
|
||||
|
Reference in New Issue
Block a user