Add tag filter into subscribers response
[MAILPOET-4442]
This commit is contained in:
@@ -4,6 +4,7 @@ namespace MailPoet\Subscribers;
|
|||||||
|
|
||||||
use MailPoet\Entities\SegmentEntity;
|
use MailPoet\Entities\SegmentEntity;
|
||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
|
use MailPoet\Entities\TagEntity;
|
||||||
use MailPoet\Listing\ListingDefinition;
|
use MailPoet\Listing\ListingDefinition;
|
||||||
use MailPoet\Listing\ListingRepository;
|
use MailPoet\Listing\ListingRepository;
|
||||||
use MailPoet\Segments\DynamicSegments\FilterHandler;
|
use MailPoet\Segments\DynamicSegments\FilterHandler;
|
||||||
@@ -131,21 +132,24 @@ class SubscriberListingRepository extends ListingRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function applyFilters(QueryBuilder $queryBuilder, array $filters) {
|
protected function applyFilters(QueryBuilder $queryBuilder, array $filters) {
|
||||||
if (!isset($filters['segment'])) {
|
if (isset($filters['segment'])) {
|
||||||
return;
|
if ($filters['segment'] === self::FILTER_WITHOUT_LIST) {
|
||||||
|
$this->segmentSubscribersRepository->addConstraintsForSubscribersWithoutSegment($queryBuilder);
|
||||||
|
} else {
|
||||||
|
$segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']);
|
||||||
|
if ($segment instanceof SegmentEntity && $segment->isStatic()) {
|
||||||
|
$queryBuilder->join('s.subscriberSegments', 'ss', Join::WITH, 'ss.segment = :ssSegment')
|
||||||
|
->setParameter('ssSegment', $segment->getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ($filters['segment'] === self::FILTER_WITHOUT_LIST) {
|
|
||||||
$this->segmentSubscribersRepository->addConstraintsForSubscribersWithoutSegment($queryBuilder);
|
if (isset($filters['tag'])) {
|
||||||
return;
|
$tag = $this->entityManager->find(TagEntity::class, (int)$filters['tag']);
|
||||||
}
|
if ($tag) {
|
||||||
$segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']);
|
$queryBuilder->join('s.subscriberTags', 'st', Join::WITH, 'st.tag = :stTag')
|
||||||
if (!$segment instanceof SegmentEntity) {
|
->setParameter('stTag', $tag);
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
if ($segment->isStatic()) {
|
|
||||||
$queryBuilder->join('s.subscriberSegments', 'ss', Join::WITH, 'ss.segment = :ssSegment')
|
|
||||||
->setParameter('ssSegment', $segment->getId());
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,6 +235,16 @@ class SubscriberListingRepository extends ListingRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function getFilters(ListingDefinition $definition): array {
|
public function getFilters(ListingDefinition $definition): array {
|
||||||
|
return [
|
||||||
|
'segment' => $this->getSegmentFilter($definition),
|
||||||
|
'tag' => $this->getTagsFilter($definition),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<array{label: string, value: string|int}>
|
||||||
|
*/
|
||||||
|
private function getSegmentFilter(ListingDefinition $definition): array {
|
||||||
$group = $definition->getGroup();
|
$group = $definition->getGroup();
|
||||||
|
|
||||||
$subscribersWithoutSegmentStats = $this->subscribersCountsController->getSubscribersWithoutSegmentStatisticsCount();
|
$subscribersWithoutSegmentStats = $this->subscribersCountsController->getSubscribersWithoutSegmentStatisticsCount();
|
||||||
@@ -283,7 +297,34 @@ class SubscriberListingRepository extends ListingRepository {
|
|||||||
});
|
});
|
||||||
|
|
||||||
array_unshift($segmentList, $allSubscribersList, $withoutSegmentList);
|
array_unshift($segmentList, $allSubscribersList, $withoutSegmentList);
|
||||||
return ['segment' => $segmentList];
|
return $segmentList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<int, array{label: string, value: string|int}>
|
||||||
|
*/
|
||||||
|
private function getTagsFilter(ListingDefinition $definition): array {
|
||||||
|
$group = $definition->getGroup();
|
||||||
|
|
||||||
|
$allTagsList = [
|
||||||
|
'label' => WPFunctions::get()->__('All Tags', 'mailpoet'),
|
||||||
|
'value' => '',
|
||||||
|
];
|
||||||
|
|
||||||
|
$status = in_array($group, ['all', 'trash']) ? null : $group;
|
||||||
|
$isDeleted = $group === 'trash';
|
||||||
|
$tagsStatistics = $this->subscribersCountsController->getTagsStatisticsCount($status, $isDeleted);
|
||||||
|
|
||||||
|
$tagsList = [];
|
||||||
|
foreach ($tagsStatistics as $tagStatistics) {
|
||||||
|
$tagsList[] = [
|
||||||
|
'label' => sprintf('%s (%s)', $tagStatistics['name'], number_format((float)$tagStatistics['subscribersCount'])),
|
||||||
|
'value' => $tagStatistics['id'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
array_unshift($tagsList, $allTagsList);
|
||||||
|
return $tagsList;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDataForDynamicSegment(ListingDefinition $definition, SegmentEntity $segment) {
|
private function getDataForDynamicSegment(ListingDefinition $definition, SegmentEntity $segment) {
|
||||||
|
@@ -7,6 +7,7 @@ use MailPoet\Entities\SegmentEntity;
|
|||||||
use MailPoet\InvalidStateException;
|
use MailPoet\InvalidStateException;
|
||||||
use MailPoet\Segments\SegmentsRepository;
|
use MailPoet\Segments\SegmentsRepository;
|
||||||
use MailPoet\Segments\SegmentSubscribersRepository;
|
use MailPoet\Segments\SegmentSubscribersRepository;
|
||||||
|
use MailPoet\Tags\TagRepository;
|
||||||
|
|
||||||
class SubscribersCountsController {
|
class SubscribersCountsController {
|
||||||
/** @var SegmentsRepository */
|
/** @var SegmentsRepository */
|
||||||
@@ -15,18 +16,23 @@ class SubscribersCountsController {
|
|||||||
/** @var SegmentSubscribersRepository */
|
/** @var SegmentSubscribersRepository */
|
||||||
private $segmentSubscribersRepository;
|
private $segmentSubscribersRepository;
|
||||||
|
|
||||||
|
/** @var TagRepository */
|
||||||
|
private $tagRepository;
|
||||||
|
|
||||||
/** @var TransientCache */
|
/** @var TransientCache */
|
||||||
private $transientCache;
|
private $transientCache;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
SegmentsRepository $segmentsRepository,
|
SegmentsRepository $segmentsRepository,
|
||||||
SegmentSubscribersRepository $segmentSubscribersRepository,
|
SegmentSubscribersRepository $segmentSubscribersRepository,
|
||||||
|
TagRepository $subscriberTagRepository,
|
||||||
TransientCache $transientCache
|
TransientCache $transientCache
|
||||||
) {
|
) {
|
||||||
|
|
||||||
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
|
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
|
||||||
$this->transientCache = $transientCache;
|
$this->transientCache = $transientCache;
|
||||||
$this->segmentsRepository = $segmentsRepository;
|
$this->segmentsRepository = $segmentsRepository;
|
||||||
|
$this->tagRepository = $subscriberTagRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getSubscribersWithoutSegmentStatisticsCount(): array {
|
public function getSubscribersWithoutSegmentStatisticsCount(): array {
|
||||||
@@ -107,4 +113,11 @@ class SubscribersCountsController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<int, array{id: int, name: string, subscribersCount: int}>
|
||||||
|
*/
|
||||||
|
public function getTagsStatisticsCount(?string $status, bool $isDeleted): array {
|
||||||
|
return $this->tagRepository->getSubscriberStatisticsCount($status, $isDeleted);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user