Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\CampaignBundle\Controller; | |
| use Doctrine\DBAL\Exception; | |
| use Mautic\CampaignBundle\Entity\Campaign; | |
| use Mautic\CampaignBundle\Model\CampaignModel; | |
| use Mautic\CoreBundle\Helper\MapHelper; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |
| use Symfony\Component\HttpFoundation\Response; | |
| use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
| class CampaignMapStatsController extends AbstractController | |
| { | |
| public const MAP_OPTIONS = [ | |
| 'contacts' => [ | |
| 'label' => 'mautic.lead.leads', | |
| 'unit' => 'Contact', | |
| ], | |
| 'read_count' => [ | |
| 'label' => 'mautic.email.read', | |
| 'unit' => 'Read', | |
| ], | |
| 'clicked_through_count'=> [ | |
| 'label' => 'mautic.email.click', | |
| 'unit' => 'Click', | |
| ], | |
| ]; | |
| public const LEGEND_TEXT = 'Total: %total (%withCountry with country)'; | |
| public function __construct(private CampaignModel $model) | |
| { | |
| } | |
| /** | |
| * @return array<string, array<int, array<string, int|string>>> | |
| * | |
| * @throws Exception | |
| */ | |
| public function getData(Campaign $entity, \DateTimeImmutable $dateFromObject, \DateTimeImmutable $dateToObject): array | |
| { | |
| return $this->model->getCountryStats($entity, $dateFromObject, $dateToObject); | |
| } | |
| public function hasAccess(CorePermissions $security, Campaign $entity): bool | |
| { | |
| return $security->hasEntityAccess( | |
| 'email:emails:viewown', | |
| 'email:emails:viewother', | |
| $entity->getCreatedBy() | |
| ); | |
| } | |
| /** | |
| * @return array<string,array<string, string>> | |
| */ | |
| public function getMapOptions(Campaign $entity): array | |
| { | |
| if ($entity->isEmailCampaign()) { | |
| return self::MAP_OPTIONS; | |
| } | |
| $key = array_key_first(self::MAP_OPTIONS); | |
| return [$key => self::MAP_OPTIONS[$key]]; | |
| } | |
| public function getMapOptionsTitle(): string | |
| { | |
| return ''; | |
| } | |
| /** | |
| * @throws \Exception | |
| */ | |
| public function viewAction( | |
| CorePermissions $security, | |
| int $objectId, | |
| string $dateFrom = '', | |
| string $dateTo = '' | |
| ): Response { | |
| $entity = $this->model->getEntity($objectId); | |
| if (empty($entity) || !$this->hasAccess($security, $entity)) { | |
| throw new AccessDeniedHttpException(); | |
| } | |
| $statsCountries = $this->getData($entity, new \DateTimeImmutable($dateFrom), new \DateTimeImmutable($dateTo)); | |
| $mapData = MapHelper::buildMapData($statsCountries, $this->getMapOptions($entity), self::LEGEND_TEXT); | |
| return $this->render( | |
| '@MauticCore/Helper/map.html.twig', | |
| [ | |
| 'data' => $mapData[0]['data'], | |
| 'height' => 315, | |
| 'optionsEnabled' => true, | |
| 'optionsTitle' => $this->getMapOptionsTitle(), | |
| 'options' => $mapData, | |
| 'legendEnabled' => true, | |
| 'statUnit' => $mapData[0]['unit'], | |
| ] | |
| ); | |
| } | |
| } | |