Spaces:
No application file
No application file
| namespace MauticPlugin\MauticFocusBundle\Controller; | |
| use Doctrine\Persistence\ManagerRegistry; | |
| use Mautic\CacheBundle\Cache\CacheProvider; | |
| use Mautic\CoreBundle\Controller\AbstractStandardFormController; | |
| use Mautic\CoreBundle\Factory\MauticFactory; | |
| use Mautic\CoreBundle\Factory\ModelFactory; | |
| use Mautic\CoreBundle\Form\Type\DateRangeType; | |
| 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\PageBundle\Model\TrackableModel; | |
| use MauticPlugin\MauticFocusBundle\Entity\Focus; | |
| use MauticPlugin\MauticFocusBundle\Model\FocusModel; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\Form\FormFactoryInterface; | |
| use Symfony\Component\HttpFoundation\JsonResponse; | |
| use Symfony\Component\HttpFoundation\RedirectResponse; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| use Symfony\Component\HttpFoundation\Response; | |
| class FocusController extends AbstractStandardFormController | |
| { | |
| /** | |
| * @phpstan-ignore-next-line | |
| */ | |
| public function __construct( | |
| private CacheProvider $cacheProvider, | |
| FormFactoryInterface $formFactory, | |
| FormFieldHelper $fieldHelper, | |
| ManagerRegistry $doctrine, | |
| MauticFactory $factory, | |
| ModelFactory $modelFactory, | |
| UserHelper $userHelper, | |
| CoreParametersHelper $coreParametersHelper, | |
| EventDispatcherInterface $dispatcher, | |
| Translator $translator, | |
| FlashBag $flashBag, | |
| RequestStack $requestStack, | |
| CorePermissions $security | |
| ) { | |
| parent::__construct($formFactory, $fieldHelper, $doctrine, $factory, $modelFactory, $userHelper, $coreParametersHelper, $dispatcher, $translator, $flashBag, $requestStack, $security); | |
| } | |
| protected function getTemplateBase(): string | |
| { | |
| return '@MauticFocus/Focus'; | |
| } | |
| protected function getModelName(): string | |
| { | |
| return 'focus'; | |
| } | |
| /** | |
| * @param int $page | |
| */ | |
| public function indexAction(Request $request, $page = 1): Response | |
| { | |
| return parent::indexStandard($request, $page); | |
| } | |
| /** | |
| * Generates new form and processes post data. | |
| * | |
| * @return JsonResponse|Response | |
| */ | |
| public function newAction(Request $request) | |
| { | |
| return parent::newStandard($request); | |
| } | |
| /** | |
| * Generates edit form and processes post data. | |
| * | |
| * @param int $objectId | |
| * @param bool $ignorePost | |
| * | |
| * @return JsonResponse|Response | |
| */ | |
| public function editAction(Request $request, $objectId, $ignorePost = false) | |
| { | |
| return parent::editStandard($request, $objectId, $ignorePost); | |
| } | |
| /** | |
| * Displays details on a Focus. | |
| * | |
| * @return array|JsonResponse|RedirectResponse|Response | |
| */ | |
| public function viewAction(Request $request, $objectId) | |
| { | |
| return parent::viewStandard($request, $objectId, 'focus', 'plugin.focus'); | |
| } | |
| /** | |
| * Clone an entity. | |
| * | |
| * @param int $objectId | |
| * | |
| * @return JsonResponse|RedirectResponse|Response | |
| */ | |
| public function cloneAction(Request $request, $objectId) | |
| { | |
| return parent::cloneStandard($request, $objectId); | |
| } | |
| /** | |
| * Deletes the entity. | |
| * | |
| * @param int $objectId | |
| * | |
| * @return JsonResponse|RedirectResponse | |
| */ | |
| public function deleteAction(Request $request, $objectId) | |
| { | |
| return parent::deleteStandard($request, $objectId); | |
| } | |
| /** | |
| * Deletes a group of entities. | |
| * | |
| * @return JsonResponse|RedirectResponse | |
| */ | |
| public function batchDeleteAction(Request $request) | |
| { | |
| return parent::batchDeleteStandard($request); | |
| } | |
| /** | |
| * @throws \Exception | |
| */ | |
| public function getViewArguments(array $args, $action): array | |
| { | |
| $cacheTimeout = (int) $this->coreParametersHelper->get('cached_data_timeout'); | |
| if ('view' == $action) { | |
| /** @var Focus $item */ | |
| $item = $args['viewParameters']['item']; | |
| // For line graphs in the view | |
| $dateRangeValues = $this->getCurrentRequest()->get('daterange', []); | |
| $dateRangeForm = $this->formFactory->create( | |
| DateRangeType::class, | |
| $dateRangeValues, | |
| [ | |
| 'action' => $this->generateUrl( | |
| 'mautic_focus_action', | |
| [ | |
| 'objectAction' => 'view', | |
| 'objectId' => $item->getId(), | |
| ] | |
| ), | |
| ] | |
| ); | |
| $statsDateFrom = new \DateTime($dateRangeForm->get('date_from')->getData()); | |
| $statsDateTo = new \DateTime($dateRangeForm->get('date_to')->getData()); | |
| $cacheKey = "focus.viewArguments.{$item->getId()}.{$statsDateFrom->getTimestamp()}.{$statsDateTo->getTimestamp()}"; | |
| $cacheItem = $this->cacheProvider->getItem($cacheKey); | |
| if ($cacheItem->isHit()) { | |
| [$stats, $trackables] = $cacheItem->get(); | |
| } else { | |
| // invalidate cache for entire focus item to keep AJAX loaded data consistent | |
| $this->cacheProvider->invalidateTags(["focus.{$item->getId()}"]); | |
| /** @var FocusModel $model */ | |
| $model = $this->getModel('focus'); | |
| $stats = $model->getStats( | |
| $item, | |
| null, | |
| $statsDateFrom, | |
| $statsDateTo | |
| ); | |
| if ('link' === $item->getType()) { | |
| $trackableModel = $this->getModel('page.trackable'); | |
| \assert($trackableModel instanceof TrackableModel); | |
| $trackables = $trackableModel->getTrackableList('focus', $item->getId()); | |
| $cacheItem->set([$stats, $trackables]); | |
| $cacheItem->expiresAfter($cacheTimeout * 60); | |
| $cacheItem->tag("focus.{$item->getId()}"); | |
| $this->cacheProvider->save($cacheItem); | |
| } | |
| } | |
| $args['viewParameters']['stats'] = $stats; | |
| $args['viewParameters']['dateRangeForm'] = $dateRangeForm->createView(); | |
| $args['viewParameters']['showConversionRate'] = true; | |
| if (isset($trackables)) { | |
| $args['viewParameters']['trackables'] = $trackables; | |
| } | |
| } | |
| return $args; | |
| } | |
| /** | |
| * @return mixed[] | |
| */ | |
| protected function getPostActionRedirectArguments(array $args, $action): array | |
| { | |
| $focus = $this->getCurrentRequest()->request->get('focus') ?? []; | |
| $updateSelect = 'POST' === $this->getCurrentRequest()->getMethod() | |
| ? ($focus['updateSelect'] ?? false) | |
| : $this->getCurrentRequest()->get('updateSelect', false); | |
| if ($updateSelect) { | |
| switch ($action) { | |
| case 'new': | |
| case 'edit': | |
| $passthrough = $args['passthroughVars']; | |
| $passthrough = array_merge( | |
| $passthrough, | |
| [ | |
| 'updateSelect' => $updateSelect, | |
| 'id' => $args['entity']->getId(), | |
| 'name' => $args['entity']->getName(), | |
| ] | |
| ); | |
| $args['passthroughVars'] = $passthrough; | |
| break; | |
| } | |
| } | |
| return $args; | |
| } | |
| /** | |
| * @return array | |
| */ | |
| protected function getEntityFormOptions() | |
| { | |
| $focus = $this->getCurrentRequest()->request->get('focus') ?? []; | |
| $updateSelect = 'POST' === $this->getCurrentRequest()->getMethod() | |
| ? ($focus['updateSelect'] ?? false) | |
| : $this->getCurrentRequest()->get('updateSelect', false); | |
| if ($updateSelect) { | |
| return ['update_select' => $updateSelect]; | |
| } | |
| } | |
| /** | |
| * Return array of options update select response. | |
| * | |
| * @param string $updateSelect HTML id of the select | |
| * @param object $entity | |
| * @param string $nameMethod name of the entity method holding the name | |
| * @param string $groupMethod name of the entity method holding the select group | |
| */ | |
| protected function getUpdateSelectParams($updateSelect, $entity, $nameMethod = 'getName', $groupMethod = 'getLanguage'): array | |
| { | |
| return [ | |
| 'updateSelect' => $updateSelect, | |
| 'id' => $entity->getId(), | |
| 'name' => $entity->$nameMethod(), | |
| ]; | |
| } | |
| } | |