Spaces:
No application file
No application file
File size: 2,872 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
<?php
declare(strict_types=1);
namespace Mautic\LeadBundle\Services;
use Mautic\CoreBundle\Helper\Tree\IntNode;
use Mautic\CoreBundle\Helper\Tree\NodeInterface;
use Mautic\LeadBundle\Entity\LeadList;
use Mautic\LeadBundle\Model\ListModel;
use Symfony\Component\Routing\RouterInterface;
class SegmentDependencyTreeFactory
{
/**
* @var int[]
*/
private array $usedSegmentIds = [];
public function __construct(
private ListModel $segmentModel,
private RouterInterface $router
) {
}
public function buildTree(LeadList $segment, NodeInterface $rootNode = null): NodeInterface
{
$rootNode ??= new IntNode($segment->getId());
$childSegments = $this->findChildSegments($segment);
$rootNode->addParam('name', $segment->getName());
$rootNode->addParam('link', $this->generateSegmentDetailRoute($segment));
$this->usedSegmentIds[] = $segment->getId();
foreach ($childSegments as $childSegment) {
$childNode = new IntNode($childSegment->getId());
$rootNode->addChild($childNode);
$childNode->addParam('name', $childSegment->getName());
$childNode->addParam('link', $this->generateSegmentDetailRoute($childSegment));
// Be aware of the loops here. We must stop building children
// and report the problem instead if there is a loop or duplicate segments.
if (!in_array($childSegment->getId(), $this->usedSegmentIds)) {
$this->buildTree($childSegment, $childNode);
} else {
$childNode->addParam('message', 'This segment already exists in the segment dependency tree');
}
}
return $rootNode;
}
/**
* @return LeadList[]
*/
private function findChildSegments(LeadList $segment): array
{
$segmentMembershipFilters = array_filter(
$segment->getFilters(),
fn (array $filter): bool => 'leadlist' === $filter['type']
);
if (!$segmentMembershipFilters) {
return [];
}
$childSegmentIds = [];
foreach ($segmentMembershipFilters as $filter) {
// Old segments don't use properties array.
$segmentIds = $filter['properties']['filter'] ?? $filter['filter'];
foreach ($segmentIds as $childSegmentId) {
$childSegmentIds[] = (int) $childSegmentId;
}
}
return $this->segmentModel->getRepository()->findBy(['id' => $childSegmentIds]);
}
private function generateSegmentDetailRoute(LeadList $segment): string
{
return $this->router->generate(
'mautic_segment_action',
[
'objectAction' => 'view',
'objectId' => $segment->getId(),
]
);
}
}
|