Spaces:
No application file
No application file
| namespace Mautic\ChannelBundle\Controller; | |
| use Doctrine\Persistence\ManagerRegistry; | |
| use Mautic\ChannelBundle\Entity\Channel; | |
| use Mautic\ChannelBundle\Model\MessageModel; | |
| use Mautic\CoreBundle\Controller\AbstractStandardFormController; | |
| use Mautic\CoreBundle\Factory\MauticFactory; | |
| use Mautic\CoreBundle\Factory\ModelFactory; | |
| use Mautic\CoreBundle\Factory\PageHelperFactoryInterface; | |
| use Mautic\CoreBundle\Helper\Chart\LineChart; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\UserHelper; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Mautic\CoreBundle\Service\FlashBag; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Mautic\FormBundle\Helper\FormFieldHelper; | |
| use Mautic\LeadBundle\Controller\EntityContactsTrait; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\Form\Form; | |
| use Symfony\Component\Form\FormFactoryInterface; | |
| use Symfony\Component\Form\FormInterface; | |
| use Symfony\Component\Form\FormView; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| use Symfony\Component\HttpFoundation\Response; | |
| class MessageController extends AbstractStandardFormController | |
| { | |
| use EntityContactsTrait; | |
| public function __construct( | |
| FormFactoryInterface $formFactory, | |
| FormFieldHelper $fieldHelper, | |
| ManagerRegistry $doctrine, | |
| MauticFactory $factory, | |
| ModelFactory $modelFactory, | |
| UserHelper $userHelper, | |
| CoreParametersHelper $coreParametersHelper, | |
| EventDispatcherInterface $dispatcher, | |
| Translator $translator, | |
| FlashBag $flashBag, | |
| private RequestStack $requestStack, | |
| CorePermissions $security | |
| ) { | |
| parent::__construct($formFactory, $fieldHelper, $doctrine, $factory, $modelFactory, $userHelper, $coreParametersHelper, $dispatcher, $translator, $flashBag, $requestStack, $security); | |
| } | |
| /** | |
| * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse | |
| */ | |
| public function batchDeleteAction(Request $request) | |
| { | |
| return $this->batchDeleteStandard($request); | |
| } | |
| /** | |
| * @return \Mautic\CoreBundle\Controller\Response|\Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse | |
| */ | |
| public function cloneAction(Request $request, $objectId) | |
| { | |
| return $this->cloneStandard($request, $objectId); | |
| } | |
| /** | |
| * @param bool $ignorePost | |
| * | |
| * @return \Mautic\CoreBundle\Controller\Response|\Symfony\Component\HttpFoundation\JsonResponse | |
| */ | |
| public function editAction(Request $request, $objectId, $ignorePost = false) | |
| { | |
| return $this->editStandard($request, $objectId, $ignorePost); | |
| } | |
| /** | |
| * @param int $page | |
| */ | |
| public function indexAction(Request $request, $page = 1): Response | |
| { | |
| return $this->indexStandard($request, $page); | |
| } | |
| public function newAction(Request $request): Response | |
| { | |
| return $this->newStandard($request); | |
| } | |
| /** | |
| * @return array|\Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response | |
| */ | |
| public function viewAction(Request $request, $objectId) | |
| { | |
| return $this->viewStandard($request, $objectId, 'message', 'channel'); | |
| } | |
| /** | |
| * @return mixed[] | |
| */ | |
| protected function getViewArguments(array $args, $action): array | |
| { | |
| /** @var MessageModel $model */ | |
| $model = $this->getModel($this->getModelName()); | |
| $viewParameters = []; | |
| switch ($action) { | |
| case 'index': | |
| $viewParameters = [ | |
| 'headerTitle' => $this->translator->trans('mautic.channel.messages'), | |
| 'listHeaders' => [ | |
| [ | |
| 'text' => 'mautic.core.channels', | |
| 'class' => 'visible-md visible-lg', | |
| ], | |
| ], | |
| 'listItemTemplate' => '@MauticChannel/Message/list_item.html.twig', | |
| 'enableCloneButton' => true, | |
| ]; | |
| break; | |
| case 'view': | |
| $message = $args['viewParameters']['item']; | |
| // Init the date range filter form | |
| $returnUrl = $this->generateUrl( | |
| 'mautic_message_action', | |
| [ | |
| 'objectAction' => 'view', | |
| 'objectId' => $message->getId(), | |
| ] | |
| ); | |
| [$dateFrom, $dateTo] = $this->getViewDateRange($this->requestStack->getCurrentRequest(), $message->getId(), $returnUrl, 'local', $dateRangeForm); | |
| $chart = new LineChart(null, $dateFrom, $dateTo); | |
| /** @var Channel[] $channels */ | |
| $channels = $model->getChannels(); | |
| $messageChannels = $message->getChannels(); | |
| $chart->setDataset( | |
| $this->translator->trans('mautic.core.all'), | |
| $model->getLeadStatsPost($message->getId(), $dateFrom, $dateTo) | |
| ); | |
| $messagedLeads = [ | |
| 'all' => $this->forward( | |
| 'Mautic\ChannelBundle\Controller\MessageController::contactsAction', | |
| [ | |
| 'objectId' => $message->getId(), | |
| 'page' => $this->requestStack->getCurrentRequest()->getSession()->get('mautic.'.$this->getSessionBase('all').'.contact.page', 1), | |
| 'ignoreAjax' => true, | |
| 'channel' => 'all', | |
| ] | |
| )->getContent(), | |
| ]; | |
| foreach ($messageChannels as $channel) { | |
| if ($channel->isEnabled() && isset($channels[$channel->getChannel()])) { | |
| $chart->setDataset( | |
| $channels[$channel->getChannel()]['label'], | |
| $model->getLeadStatsPost($message->getId(), $dateFrom, $dateTo, $channel->getChannel()) | |
| ); | |
| $messagedLeads[$channel->getChannel()] = $this->forward( | |
| 'Mautic\ChannelBundle\Controller\MessageController::contactsAction', | |
| [ | |
| 'objectId' => $message->getId(), | |
| 'page' => $this->requestStack->getCurrentRequest()->getSession()->get( | |
| 'mautic.'.$this->getSessionBase($channel->getChannel()).'.contact.page', | |
| 1 | |
| ), | |
| 'ignoreAjax' => true, | |
| 'channel' => $channel->getChannel(), | |
| ] | |
| )->getContent(); | |
| } | |
| } | |
| $viewParameters = [ | |
| 'channels' => $channels, | |
| 'channelContents' => $model->getMessageChannels($message->getId()), | |
| 'dateRangeForm' => $dateRangeForm->createView(), | |
| 'eventCounts' => $chart->render(), | |
| 'messagedLeads' => $messagedLeads, | |
| ]; | |
| break; | |
| case 'new': | |
| case 'edit': | |
| $viewParameters = [ | |
| 'channels' => $model->getChannels(), | |
| ]; | |
| break; | |
| } | |
| $args['viewParameters'] = array_merge($args['viewParameters'], $viewParameters); | |
| return $args; | |
| } | |
| /** | |
| * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse | |
| */ | |
| public function deleteAction(Request $request, $objectId) | |
| { | |
| return $this->deleteStandard($request, $objectId); | |
| } | |
| protected function getTemplateBase(): string | |
| { | |
| return '@MauticChannel/Message'; | |
| } | |
| protected function getFormView(FormInterface $form, $view): FormView | |
| { | |
| return $form->createView(); | |
| } | |
| protected function getJsLoadMethodPrefix(): string | |
| { | |
| return 'messages'; | |
| } | |
| protected function getModelName(): string | |
| { | |
| return 'channel.message'; | |
| } | |
| protected function getRouteBase(): string | |
| { | |
| return 'message'; | |
| } | |
| /*** | |
| * | |
| * @return string | |
| */ | |
| protected function getSessionBase($objectId = null): string | |
| { | |
| return 'message'.(($objectId) ? '.'.$objectId : ''); | |
| } | |
| protected function getTranslationBase(): string | |
| { | |
| return 'mautic.channel.message'; | |
| } | |
| /** | |
| * @param int $page | |
| * | |
| * @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response | |
| */ | |
| public function contactsAction( | |
| Request $request, | |
| PageHelperFactoryInterface $pageHelperFactory, | |
| $objectId, | |
| $channel, | |
| $page = 1 | |
| ) { | |
| $filter = []; | |
| if ('all' !== $channel) { | |
| $returnUrl = $this->generateUrl( | |
| 'mautic_message_action', | |
| [ | |
| 'objectAction' => 'view', | |
| 'objectId' => $objectId, | |
| ] | |
| ); | |
| [$dateFrom, $dateTo] = $this->getViewDateRange($request, $objectId, $returnUrl, 'UTC'); | |
| $filter = [ | |
| 'channel' => $channel, | |
| [ | |
| 'col' => 'entity.date_triggered', | |
| 'expr' => 'between', | |
| 'val' => [ | |
| $dateFrom->format('Y-m-d H:i:s'), | |
| $dateTo->format('Y-m-d H:i:s'), | |
| ], | |
| ], | |
| ]; | |
| } | |
| return $this->generateContactsGrid( | |
| $request, | |
| $pageHelperFactory, | |
| $objectId, | |
| $page, | |
| 'channel:messages:view', | |
| 'message.'.$channel, | |
| 'campaign_lead_event_log', | |
| $channel, | |
| null, | |
| $filter, | |
| [ | |
| [ | |
| 'type' => 'join', | |
| 'from_alias' => 'entity', | |
| 'table' => 'campaign_events', | |
| 'alias' => 'event', | |
| 'condition' => "entity.event_id = event.id and event.channel = 'channel.message' and event.channel_id = ".(int) $objectId, | |
| ], | |
| ], | |
| null, | |
| [ | |
| 'channel' => $channel ?: 'all', | |
| ], | |
| '.message-'.$channel | |
| ); | |
| } | |
| } | |