Spaces:
No application file
No application file
namespace Mautic\PointBundle\Controller; | |
use Mautic\CoreBundle\Controller\FormController as CommonFormController; | |
use Mautic\PointBundle\Entity\TriggerEvent; | |
use Mautic\PointBundle\Form\Type\TriggerEventType; | |
use Mautic\PointBundle\Model\TriggerModel; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class TriggerEventController extends CommonFormController | |
{ | |
/** | |
* Generates new form and processes post data. | |
* | |
* @return Response | |
*/ | |
public function newAction(Request $request) | |
{ | |
$success = 0; | |
$valid = $cancelled = false; | |
$method = $request->getMethod(); | |
$session = $request->getSession(); | |
if ('POST' == $method) { | |
$triggerEvent = $request->request->all()['pointtriggerevent'] ?? []; | |
$eventType = $triggerEvent['type']; | |
$triggerId = $triggerEvent['triggerId']; | |
} else { | |
$eventType = $request->query->get('type'); | |
$triggerId = $request->query->get('triggerId'); | |
$triggerEvent = [ | |
'type' => $eventType, | |
'triggerId' => $triggerId, | |
]; | |
} | |
// ajax only for form fields | |
if (!$eventType | |
|| !$request->isXmlHttpRequest() | |
|| !$this->security->isGranted([ | |
'point:triggers:edit', | |
'point:triggers:create', | |
], 'MATCH_ONE') | |
) { | |
return $this->modalAccessDenied(); | |
} | |
// fire the builder event | |
/** @var TriggerModel $pointTriggerModel */ | |
$pointTriggerModel = $this->getModel('point.trigger'); | |
\assert($pointTriggerModel instanceof TriggerModel); | |
$events = $pointTriggerModel->getEvents(); | |
$form = $this->formFactory->create(TriggerEventType::class, $triggerEvent, [ | |
'action' => $this->generateUrl('mautic_pointtriggerevent_action', ['objectAction' => 'new']), | |
'settings' => $events[$eventType], | |
]); | |
$form->get('triggerId')->setData($triggerId); | |
$triggerEvent['settings'] = $events[$eventType]; | |
// Check for a submitted form and process it | |
if ('POST' == $method) { | |
if (!$cancelled = $this->isFormCancelled($form)) { | |
if ($valid = $this->isFormValid($form)) { | |
$success = 1; | |
// form is valid so process the data | |
$keyId = 'new'.hash('sha1', uniqid(mt_rand())); | |
// save the properties to session | |
$actions = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified'); | |
$formData = $form->getData(); | |
$triggerEvent = array_merge($triggerEvent, $formData); | |
$triggerEvent['id'] = $keyId; | |
if (empty($triggerEvent['name'])) { | |
// set it to the event default | |
$triggerEvent['name'] = $this->translator->trans($triggerEvent['settings']['label']); | |
} | |
$actions[$keyId] = $triggerEvent; | |
$session->set('mautic.point.'.$triggerId.'.triggerevents.modified', $actions); | |
} | |
} | |
} | |
$viewParams = ['type' => $eventType]; | |
if ($cancelled || $valid) { | |
$closeModal = true; | |
} else { | |
if (isset($triggerEvent['settings']['formTheme'])) { | |
$viewParams['formTheme'] = $triggerEvent['settings']['formTheme']; | |
} | |
$closeModal = false; | |
$viewParams['form'] = $form->createView(); | |
$header = $triggerEvent['settings']['label']; | |
$viewParams['eventHeader'] = $this->translator->trans($header); | |
} | |
$passthroughVars = [ | |
'mauticContent' => 'pointTriggerEvent', | |
'success' => $success, | |
'route' => false, | |
]; | |
if (!empty($keyId)) { | |
// prevent undefined errors | |
$entity = new TriggerEvent(); | |
$blank = $entity->convertToArray(); | |
$triggerEvent = array_merge($blank, $triggerEvent); | |
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig' | |
: $triggerEvent['settings']['template']; | |
$passthroughVars['eventId'] = $keyId; | |
$passthroughVars['eventHtml'] = $this->renderView($template, [ | |
'event' => $triggerEvent, | |
'id' => $keyId, | |
'sessionId' => $triggerId, | |
]); | |
} | |
if ($closeModal) { | |
// just close the modal | |
$passthroughVars['closeModal'] = 1; | |
return new JsonResponse($passthroughVars); | |
} | |
return $this->ajaxAction($request, [ | |
'contentTemplate' => '@MauticPoint/Event/form.html.twig', | |
'viewParameters' => $viewParams, | |
'passthroughVars' => $passthroughVars, | |
]); | |
} | |
/** | |
* Generates edit form and processes post data. | |
* | |
* @param int $objectId | |
* | |
* @return Response | |
*/ | |
public function editAction(Request $request, $objectId) | |
{ | |
$session = $request->getSession(); | |
$method = $request->getMethod(); | |
$triggerEvent = $request->request->get('pointtriggerevent') ?? []; | |
$triggerId = 'POST' === $method ? ($triggerEvent['triggerId'] ?? '') : $request->query->get('triggerId'); | |
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified', []); | |
$success = 0; | |
$valid = $cancelled = false; | |
$triggerEvent = array_key_exists($objectId, $events) ? $events[$objectId] : null; | |
if (null !== $triggerEvent) { | |
$eventType = $triggerEvent['type']; | |
$pointTriggerModel = $this->getModel('point.trigger'); | |
\assert($pointTriggerModel instanceof TriggerModel); | |
$events = $pointTriggerModel->getEvents(); | |
$triggerEvent['settings'] = $events[$eventType]; | |
// ajax only for form fields | |
if (!$eventType | |
|| !$request->isXmlHttpRequest() | |
|| !$this->security->isGranted([ | |
'point:triggers:edit', | |
'point:triggers:create', | |
], 'MATCH_ONE') | |
) { | |
return $this->modalAccessDenied(); | |
} | |
$form = $this->formFactory->create(TriggerEventType::class, $triggerEvent, [ | |
'action' => $this->generateUrl('mautic_pointtriggerevent_action', ['objectAction' => 'edit', 'objectId' => $objectId]), | |
'settings' => $triggerEvent['settings'], | |
]); | |
$form->get('triggerId')->setData($triggerId); | |
// Check for a submitted form and process it | |
if ('POST' == $method) { | |
if (!$cancelled = $this->isFormCancelled($form)) { | |
if ($valid = $this->isFormValid($form)) { | |
$success = 1; | |
// form is valid so process the data | |
// save the properties to session | |
$session = $request->getSession(); | |
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified'); | |
/** @var array<mixed> $formData */ | |
$formData = $form->getData(); | |
// overwrite with updated data | |
$triggerEvent = array_merge($events[$objectId], $formData); | |
if (empty($triggerEvent['name'])) { | |
// set it to the event default | |
$triggerEvent['name'] = $this->translator->trans($triggerEvent['settings']['label']); | |
} | |
$events[$objectId] = $triggerEvent; | |
$session->set('mautic.point.'.$triggerId.'.triggerevents.modified', $events); | |
// generate HTML for the field | |
$keyId = $objectId; | |
} | |
} | |
} | |
$viewParams = ['type' => $eventType]; | |
if ($cancelled || $valid) { | |
$closeModal = true; | |
} else { | |
if (isset($triggerEvent['settings']['formTheme'])) { | |
$viewParams['formTheme'] = $triggerEvent['settings']['formTheme']; | |
} | |
$closeModal = false; | |
$viewParams['form'] = $form->createView(); | |
$viewParams['eventHeader'] = $this->translator->trans($triggerEvent['settings']['label']); | |
} | |
$passthroughVars = [ | |
'mauticContent' => 'pointTriggerEvent', | |
'success' => $success, | |
'route' => false, | |
]; | |
if (!empty($keyId)) { | |
$passthroughVars['eventId'] = $keyId; | |
// prevent undefined errors | |
$entity = new TriggerEvent(); | |
$blank = $entity->convertToArray(); | |
$triggerEvent = array_merge($blank, $triggerEvent); | |
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig' | |
: $triggerEvent['settings']['template']; | |
$passthroughVars['eventId'] = $keyId; | |
$passthroughVars['eventHtml'] = $this->renderView($template, [ | |
'event' => $triggerEvent, | |
'id' => $keyId, | |
'sessionId' => $triggerId, | |
]); | |
} | |
if ($closeModal) { | |
// just close the modal | |
$passthroughVars['closeModal'] = 1; | |
return new JsonResponse($passthroughVars); | |
} | |
return $this->ajaxAction($request, [ | |
'contentTemplate' => '@MauticPoint/Event/form.html.twig', | |
'viewParameters' => $viewParams, | |
'passthroughVars' => $passthroughVars, | |
]); | |
} | |
return new JsonResponse(['success' => 0]); | |
} | |
/** | |
* Deletes the entity. | |
* | |
* @param int $objectId | |
* | |
* @return JsonResponse | |
*/ | |
public function deleteAction(Request $request, $objectId) | |
{ | |
$session = $request->getSession(); | |
$triggerId = $request->get('triggerId'); | |
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified', []); | |
$delete = $session->get('mautic.point.'.$triggerId.'.triggerevents.deleted', []); | |
// ajax only for form fields | |
if (!$request->isXmlHttpRequest() | |
|| !$this->security->isGranted([ | |
'point:triggers:edit', | |
'point:triggers:create', | |
], 'MATCH_ONE') | |
) { | |
return $this->accessDenied(); | |
} | |
$triggerEvent = (array_key_exists($objectId, $events)) ? $events[$objectId] : null; | |
if ('POST' == $request->getMethod() && null !== $triggerEvent) { | |
// add the field to the delete list | |
if (!in_array($objectId, $delete)) { | |
$delete[] = $objectId; | |
$session->set('mautic.point.'.$triggerId.'.triggerevents.deleted', $delete); | |
} | |
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig' | |
: $triggerEvent['settings']['template']; | |
// prevent undefined errors | |
$entity = new TriggerEvent(); | |
$blank = $entity->convertToArray(); | |
$triggerEvent = array_merge($blank, $triggerEvent); | |
$dataArray = [ | |
'mauticContent' => 'pointTriggerEvent', | |
'success' => 1, | |
'target' => '#triggerEvent'.$objectId, | |
'route' => false, | |
'eventId' => $objectId, | |
'eventHtml' => $this->renderView($template, [ | |
'event' => $triggerEvent, | |
'id' => $objectId, | |
'deleted' => true, | |
'sessionId' => $triggerId, | |
]), | |
]; | |
} else { | |
$dataArray = ['success' => 0]; | |
} | |
return new JsonResponse($dataArray); | |
} | |
/** | |
* Undeletes the entity. | |
* | |
* @param int $objectId | |
* | |
* @return JsonResponse | |
*/ | |
public function undeleteAction(Request $request, $objectId) | |
{ | |
$session = $request->getSession(); | |
$triggerId = $request->get('triggerId'); | |
$events = $session->get('mautic.point.'.$triggerId.'.triggerevents.modified', []); | |
$delete = $session->get('mautic.point.'.$triggerId.'.triggerevents.deleted', []); | |
// ajax only for form fields | |
if (!$request->isXmlHttpRequest() | |
|| !$this->security->isGranted([ | |
'point:triggers:edit', | |
'point:triggers:create', | |
], 'MATCH_ONE') | |
) { | |
return $this->accessDenied(); | |
} | |
$triggerEvent = (array_key_exists($objectId, $events)) ? $events[$objectId] : null; | |
if ('POST' === $request->getMethod() && null !== $triggerEvent) { | |
// add the field to the delete list | |
if (in_array($objectId, $delete)) { | |
$key = array_search($objectId, $delete); | |
unset($delete[$key]); | |
$session->set('mautic.point.'.$triggerId.'.triggerevents.deleted', $delete); | |
} | |
$template = (empty($triggerEvent['settings']['template'])) ? '@MauticPoint/Event/generic.html.twig' | |
: $triggerEvent['settings']['template']; | |
// prevent undefined errors | |
$entity = new TriggerEvent(); | |
$blank = $entity->convertToArray(); | |
$triggerEvent = array_merge($blank, $triggerEvent); | |
$dataArray = [ | |
'mauticContent' => 'pointTriggerEvent', | |
'success' => 1, | |
'target' => '#triggerEvent'.$objectId, | |
'route' => false, | |
'eventId' => $objectId, | |
'eventHtml' => $this->renderView($template, [ | |
'event' => $triggerEvent, | |
'id' => $objectId, | |
'deleted' => false, | |
'triggerId' => $triggerId, | |
]), | |
]; | |
} else { | |
$dataArray = ['success' => 0]; | |
} | |
return new JsonResponse($dataArray); | |
} | |
} | |