Add 'not contains' option for text custom fields

MAILPOET-4996
This commit is contained in:
John Oleksowicz
2023-07-18 15:54:46 -05:00
committed by Aschepikov
parent aece1b60a9
commit fe318f5a30
6 changed files with 30 additions and 15 deletions

View File

@@ -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>

View File

@@ -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) . '%');

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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'));