13
13
use Mautic \EmailBundle \Event \EmailSendEvent ;
14
14
use Mautic \EmailBundle \EventListener \MatchFilterForLeadTrait ;
15
15
use Mautic \LeadBundle \Entity \LeadList ;
16
+ use Mautic \LeadBundle \Exception \OperatorsNotFoundException ;
17
+ use Mautic \LeadBundle \Segment \OperatorOptions ;
16
18
use MauticPlugin \CustomObjectsBundle \CustomItemEvents ;
17
19
use MauticPlugin \CustomObjectsBundle \CustomObjectEvents ;
18
20
use MauticPlugin \CustomObjectsBundle \DTO \TableConfig ;
@@ -350,14 +352,14 @@ public function onTokenReplacement(TokenReplacementEvent $event): void
350
352
351
353
$ isCustomObject = false ;
352
354
foreach ($ data ['filters ' ] as $ filter ) {
353
- $ customFieldValues = $ this ->getCustomFieldDataForLead ($ filter ['filters ' ], (int ) $ lead ['id ' ]);
355
+ $ customFieldValues = $ this ->getCustomFieldDataForLead ($ filter ['filters ' ], (string ) $ lead ['id ' ]);
354
356
355
357
if (!empty ($ customFieldValues )) {
356
358
$ isCustomObject = true ;
357
359
$ lead = array_merge ($ lead , $ customFieldValues );
358
360
}
359
361
360
- if ($ isCustomObject && $ this ->matchFilterForLead ($ filter ['filters ' ], $ lead )) {
362
+ if ($ isCustomObject && $ this ->matchFilterForLeadInCustomObject ($ filter ['filters ' ], $ lead )) {
361
363
$ filterContent = $ filter ['content ' ];
362
364
break ;
363
365
}
@@ -374,7 +376,7 @@ public function onTokenReplacement(TokenReplacementEvent $event): void
374
376
*
375
377
* @return array<mixed>
376
378
*/
377
- private function getCustomFieldDataForLead (array $ filters , int $ leadId ): array
379
+ private function getCustomFieldDataForLead (array $ filters , string $ leadId ): array
378
380
{
379
381
$ customFieldValues = $ cachedCustomItems = [];
380
382
@@ -418,9 +420,9 @@ private function getCustomFieldDataForLead(array $filters, int $leadId): array
418
420
/**
419
421
* @param array<mixed> $customItems
420
422
*
421
- * @throws InvalidCustomObjectFormatListException
423
+ * @return array<mixed>
422
424
*/
423
- private function getCustomFieldValue (CustomObject $ customObject , string $ customFieldAlias , array $ customItems ): string
425
+ private function getCustomFieldValue (CustomObject $ customObject , string $ customFieldAlias , array $ customItems ): array
424
426
{
425
427
$ fieldValues = [];
426
428
@@ -449,22 +451,193 @@ private function getCustomFieldValue(CustomObject $customObject, string $customF
449
451
}
450
452
}
451
453
452
- return $ this -> tokenFormatter -> format ( $ fieldValues, TokenFormatter:: DEFAULT_FORMAT ) ;
454
+ return $ fieldValues ;
453
455
}
454
456
455
457
/**
456
458
* @return array<mixed>
457
459
*/
458
- private function getCustomItems (CustomObject $ customObject , int $ leadId ): array
460
+ private function getCustomItems (CustomObject $ customObject , string $ leadId ): array
459
461
{
460
462
$ orderBy = CustomItem::TABLE_ALIAS .'.id ' ;
461
463
$ orderDir = 'DESC ' ;
462
464
463
- $ tableConfig = new TableConfig (1 , 1 , $ orderBy , $ orderDir );
465
+ $ tableConfig = new TableConfig (15 , 1 , $ orderBy , $ orderDir );
464
466
$ tableConfig ->addParameter ('customObjectId ' , $ customObject ->getId ());
465
467
$ tableConfig ->addParameter ('filterEntityType ' , 'contact ' );
466
468
$ tableConfig ->addParameter ('filterEntityId ' , $ leadId );
467
469
468
470
return $ this ->customItemModel ->getArrayTableData ($ tableConfig );
469
471
}
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
+ }
470
643
}
0 commit comments