Skip to content

Commit 92b6977

Browse files
author
Avikarsha Saha
committed
Merge branch 'MAUT-11460' into development
2 parents 264b430 + 2482e7e commit 92b6977

File tree

2 files changed

+269
-58
lines changed

2 files changed

+269
-58
lines changed

EventListener/TokenSubscriber.php

+181-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use Mautic\EmailBundle\Event\EmailSendEvent;
1414
use Mautic\EmailBundle\EventListener\MatchFilterForLeadTrait;
1515
use Mautic\LeadBundle\Entity\LeadList;
16+
use Mautic\LeadBundle\Exception\OperatorsNotFoundException;
17+
use Mautic\LeadBundle\Segment\OperatorOptions;
1618
use MauticPlugin\CustomObjectsBundle\CustomItemEvents;
1719
use MauticPlugin\CustomObjectsBundle\CustomObjectEvents;
1820
use MauticPlugin\CustomObjectsBundle\DTO\TableConfig;
@@ -350,14 +352,14 @@ public function onTokenReplacement(TokenReplacementEvent $event): void
350352

351353
$isCustomObject = false;
352354
foreach ($data['filters'] as $filter) {
353-
$customFieldValues = $this->getCustomFieldDataForLead($filter['filters'], (int) $lead['id']);
355+
$customFieldValues = $this->getCustomFieldDataForLead($filter['filters'], (string) $lead['id']);
354356

355357
if (!empty($customFieldValues)) {
356358
$isCustomObject = true;
357359
$lead = array_merge($lead, $customFieldValues);
358360
}
359361

360-
if ($isCustomObject && $this->matchFilterForLead($filter['filters'], $lead)) {
362+
if ($isCustomObject && $this->matchFilterForLeadInCustomObject($filter['filters'], $lead)) {
361363
$filterContent = $filter['content'];
362364
break;
363365
}
@@ -374,7 +376,7 @@ public function onTokenReplacement(TokenReplacementEvent $event): void
374376
*
375377
* @return array<mixed>
376378
*/
377-
private function getCustomFieldDataForLead(array $filters, int $leadId): array
379+
private function getCustomFieldDataForLead(array $filters, string $leadId): array
378380
{
379381
$customFieldValues = $cachedCustomItems = [];
380382

@@ -418,9 +420,9 @@ private function getCustomFieldDataForLead(array $filters, int $leadId): array
418420
/**
419421
* @param array<mixed> $customItems
420422
*
421-
* @throws InvalidCustomObjectFormatListException
423+
* @return array<mixed>
422424
*/
423-
private function getCustomFieldValue(CustomObject $customObject, string $customFieldAlias, array $customItems): string
425+
private function getCustomFieldValue(CustomObject $customObject, string $customFieldAlias, array $customItems): array
424426
{
425427
$fieldValues = [];
426428

@@ -449,22 +451,193 @@ private function getCustomFieldValue(CustomObject $customObject, string $customF
449451
}
450452
}
451453

452-
return $this->tokenFormatter->format($fieldValues, TokenFormatter::DEFAULT_FORMAT);
454+
return $fieldValues;
453455
}
454456

455457
/**
456458
* @return array<mixed>
457459
*/
458-
private function getCustomItems(CustomObject $customObject, int $leadId): array
460+
private function getCustomItems(CustomObject $customObject, string $leadId): array
459461
{
460462
$orderBy = CustomItem::TABLE_ALIAS.'.id';
461463
$orderDir = 'DESC';
462464

463-
$tableConfig = new TableConfig(1, 1, $orderBy, $orderDir);
465+
$tableConfig = new TableConfig(15, 1, $orderBy, $orderDir);
464466
$tableConfig->addParameter('customObjectId', $customObject->getId());
465467
$tableConfig->addParameter('filterEntityType', 'contact');
466468
$tableConfig->addParameter('filterEntityId', $leadId);
467469

468470
return $this->customItemModel->getArrayTableData($tableConfig);
469471
}
472+
473+
// We have a similar function in MatchFilterForLeadTrait since we are unable to alter anything in Mautic 4.4, hence there is some duplication of code.
474+
475+
/**
476+
* @param array<mixed> $filter
477+
* @param array<mixed> $lead
478+
*
479+
* @throws OperatorsNotFoundException
480+
*/
481+
protected function matchFilterForLeadInCustomObject(array $filter, array $lead): bool
482+
{
483+
if (empty($lead['id'])) {
484+
// Lead in generated for preview with faked data
485+
return false;
486+
}
487+
488+
$groups = [];
489+
$groupNum = 0;
490+
491+
foreach ($filter as $data) {
492+
if (!array_key_exists($data['field'], $lead)) {
493+
continue;
494+
}
495+
496+
/*
497+
* Split the filters into groups based on the glue.
498+
* The first filter and any filters whose glue is
499+
* "or" will start a new group.
500+
*/
501+
if (0 === $groupNum || 'or' === $data['glue']) {
502+
++$groupNum;
503+
$groups[$groupNum] = null;
504+
}
505+
506+
/*
507+
* If the group has been marked as false, there
508+
* is no need to continue checking the others
509+
* in the group.
510+
*/
511+
if (false === $groups[$groupNum]) {
512+
continue;
513+
}
514+
515+
/*
516+
* If we are checking the first filter in a group
517+
* assume that the group will not match.
518+
*/
519+
if (null === $groups[$groupNum]) {
520+
$groups[$groupNum] = false;
521+
}
522+
523+
$leadValues = $lead[$data['field']];
524+
$filterVal = $data['filter'];
525+
$subgroup = null;
526+
527+
if (is_array($leadValues)) {
528+
foreach ($leadValues as $leadVal) {
529+
if ($subgroup) {
530+
break;
531+
}
532+
533+
switch ($data['type']) {
534+
case 'boolean':
535+
if (null !== $leadVal) {
536+
$leadVal = (bool) $leadVal;
537+
}
538+
539+
if (null !== $filterVal) {
540+
$filterVal = (bool) $filterVal;
541+
}
542+
break;
543+
case 'datetime':
544+
case 'time':
545+
$leadValCount = substr_count($leadVal, ':');
546+
$filterValCount = substr_count($filterVal, ':');
547+
548+
if (2 === $leadValCount && 1 === $filterValCount) {
549+
$filterVal .= ':00';
550+
}
551+
break;
552+
case 'tags':
553+
case 'select':
554+
case 'multiselect':
555+
if (!is_null($leadVal) && !is_array($leadVal)) {
556+
$leadVal = explode('|', $leadVal);
557+
}
558+
if (!is_null($filterVal) && !is_array($filterVal)) {
559+
$filterVal = explode('|', $filterVal);
560+
}
561+
break;
562+
case 'number':
563+
$leadVal = (int) $leadVal;
564+
$filterVal = (int) $filterVal;
565+
break;
566+
}
567+
568+
switch ($data['operator']) {
569+
case '=':
570+
if ('boolean' === $data['type']) {
571+
$groups[$groupNum] = $leadVal === $filterVal;
572+
} else {
573+
$groups[$groupNum] = $leadVal == $filterVal;
574+
}
575+
break;
576+
case '!=':
577+
if ('boolean' === $data['type']) {
578+
$groups[$groupNum] = $leadVal !== $filterVal;
579+
} else {
580+
$groups[$groupNum] = $leadVal != $filterVal;
581+
}
582+
break;
583+
case 'gt':
584+
$groups[$groupNum] = $leadVal > $filterVal;
585+
break;
586+
case 'gte':
587+
$groups[$groupNum] = $leadVal >= $filterVal;
588+
break;
589+
case 'lt':
590+
$groups[$groupNum] = $leadVal < $filterVal;
591+
break;
592+
case 'lte':
593+
$groups[$groupNum] = $leadVal <= $filterVal;
594+
break;
595+
case 'empty':
596+
$groups[$groupNum] = empty($leadVal);
597+
break;
598+
case '!empty':
599+
$groups[$groupNum] = !empty($leadVal);
600+
break;
601+
case 'like':
602+
$filterVal = str_replace(['.', '*', '%'], ['\.', '\*', '.*'], $filterVal);
603+
$groups[$groupNum] = 1 === preg_match('/'.$filterVal.'/', $leadVal);
604+
break;
605+
case '!like':
606+
$filterVal = str_replace(['.', '*'], ['\.', '\*'], $filterVal);
607+
$filterVal = str_replace('%', '.*', $filterVal);
608+
$groups[$groupNum] = 1 !== preg_match('/'.$filterVal.'/', $leadVal);
609+
break;
610+
case OperatorOptions::IN:
611+
$groups[$groupNum] = $this->checkLeadValueIsInFilter($leadVal, $filterVal, false);
612+
break;
613+
case OperatorOptions::NOT_IN:
614+
$groups[$groupNum] = $this->checkLeadValueIsInFilter($leadVal, $filterVal, true);
615+
break;
616+
case 'regexp':
617+
$groups[$groupNum] = 1 === preg_match('/'.$filterVal.'/i', $leadVal);
618+
break;
619+
case '!regexp':
620+
$groups[$groupNum] = 1 !== preg_match('/'.$filterVal.'/i', $leadVal);
621+
break;
622+
case 'startsWith':
623+
$groups[$groupNum] = 0 === strncmp($leadVal, $filterVal, strlen($filterVal));
624+
break;
625+
case 'endsWith':
626+
$endOfString = substr($leadVal, strlen($leadVal) - strlen($filterVal));
627+
$groups[$groupNum] = 0 === strcmp($endOfString, $filterVal);
628+
break;
629+
case 'contains':
630+
$groups[$groupNum] = false !== strpos((string) $leadVal, (string) $filterVal);
631+
break;
632+
default:
633+
throw new OperatorsNotFoundException('Operator is not defined or invalid operator found.');
634+
}
635+
636+
$subgroup = $groups[$groupNum];
637+
}
638+
}
639+
}
640+
641+
return in_array(true, $groups);
642+
}
470643
}

0 commit comments

Comments
 (0)