Spaces:
No application file
No application file
| namespace Mautic\FormBundle\Controller; | |
| use Mautic\CoreBundle\Controller\FormController as CommonFormController; | |
| use Mautic\FormBundle\Entity\Action; | |
| use Mautic\FormBundle\Form\Type\ActionType; | |
| use Mautic\FormBundle\Model\FormModel; | |
| use Symfony\Component\HttpFoundation\JsonResponse; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\Response; | |
| class ActionController 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) { | |
| $formAction = $request->request->all()['formaction'] ?? []; | |
| $actionType = $formAction['type']; | |
| $formId = $formAction['formId']; | |
| } else { | |
| $actionType = $request->query->get('type'); | |
| $formId = $request->query->get('formId'); | |
| $formAction = [ | |
| 'type' => $actionType, | |
| 'formId' => $formId, | |
| ]; | |
| } | |
| // ajax only for form fields | |
| if (!$actionType | |
| || !$request->isXmlHttpRequest() | |
| || !$this->security->isGranted(['form:forms:editown', 'form:forms:editother', 'form:forms:create'], 'MATCH_ONE') | |
| ) { | |
| return $this->modalAccessDenied(); | |
| } | |
| // fire the form builder event | |
| $formModel = $this->getModel('form.form'); | |
| \assert($formModel instanceof FormModel); | |
| $customComponents = $formModel->getCustomComponents(); | |
| $form = $this->formFactory->create(ActionType::class, $formAction, [ | |
| 'action' => $this->generateUrl('mautic_formaction_action', ['objectAction' => 'new']), | |
| 'settings' => $customComponents['actions'][$actionType], | |
| 'formId' => $formId, | |
| ]); | |
| $form->get('formId')->setData($formId); | |
| $formAction['settings'] = $customComponents['actions'][$actionType]; | |
| // 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.form.'.$formId.'.actions.modified', []); | |
| $formData = $form->getData(); | |
| $formAction = array_merge($formAction, $formData); | |
| $formAction['id'] = $keyId; | |
| if (empty($formAction['name'])) { | |
| // set it to the event default | |
| $formAction['name'] = $this->translator->trans($formAction['settings']['label']); | |
| } | |
| $actions[$keyId] = $formAction; | |
| $session->set('mautic.form.'.$formId.'.actions.modified', $actions); | |
| } else { | |
| $success = 0; | |
| } | |
| } | |
| } | |
| $viewParams = ['type' => $actionType]; | |
| if ($cancelled || $valid) { | |
| $closeModal = true; | |
| } else { | |
| $closeModal = false; | |
| $viewParams['tmpl'] = 'action'; | |
| $viewParams['form'] = $form->createView(); | |
| $header = $formAction['settings']['label']; | |
| $viewParams['actionHeader'] = $this->translator->trans($header); | |
| if (isset($formAction['settings']['formTheme'])) { | |
| $viewParams['formTheme'] = $formAction['settings']['formTheme']; | |
| } | |
| } | |
| $passthroughVars = [ | |
| 'mauticContent' => 'formAction', | |
| 'success' => $success, | |
| 'route' => false, | |
| ]; | |
| if (!empty($keyId)) { | |
| // prevent undefined errors | |
| $entity = new Action(); | |
| $blank = $entity->convertToArray(); | |
| $formAction = array_merge($blank, $formAction); | |
| $template = (!empty($formAction['settings']['template'])) ? $formAction['settings']['template'] : | |
| '@MauticForm/Action/_generic.html.twig'; | |
| $passthroughVars['actionId'] = $keyId; | |
| $passthroughVars['actionHtml'] = $this->renderView($template, [ | |
| 'inForm' => true, | |
| 'action' => $formAction, | |
| 'id' => $keyId, | |
| 'formId' => $formId, | |
| ]); | |
| } | |
| if ($closeModal) { | |
| // just close the modal | |
| $passthroughVars['closeModal'] = 1; | |
| return new JsonResponse($passthroughVars); | |
| } | |
| return $this->ajaxAction($request, [ | |
| 'contentTemplate' => '@MauticForm/Builder/'.$viewParams['tmpl'].'.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(); | |
| $formaction = $request->request->get('formaction') ?? []; | |
| $formId = 'POST' === $method ? ($formaction['formId'] ?? '') : $request->query->get('formId'); | |
| $actions = $session->get('mautic.form.'.$formId.'.actions.modified', []); | |
| $success = 0; | |
| $valid = $cancelled = false; | |
| $formAction = array_key_exists($objectId, $actions) ? $actions[$objectId] : null; | |
| if (null !== $formAction) { | |
| $formModel = $this->getModel('form.form'); | |
| \assert($formModel instanceof FormModel); | |
| $actionType = $formAction['type']; | |
| $customComponents = $formModel->getCustomComponents(); | |
| $formAction['settings'] = $customComponents['actions'][$actionType]; | |
| // ajax only for form fields | |
| if (!$actionType | |
| || !$request->isXmlHttpRequest() | |
| || !$this->security->isGranted(['form:forms:editown', 'form:forms:editother', 'form:forms:create'], 'MATCH_ONE') | |
| ) { | |
| return $this->modalAccessDenied(); | |
| } | |
| $form = $this->formFactory->create(ActionType::class, $formAction, [ | |
| 'action' => $this->generateUrl('mautic_formaction_action', ['objectAction' => 'edit', 'objectId' => $objectId]), | |
| 'settings' => $formAction['settings'], | |
| 'formId' => $formId, | |
| ]); | |
| $form->get('formId')->setData($formId); | |
| // 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(); | |
| $actions = $session->get('mautic.form.'.$formId.'.actions.modified'); | |
| $formData = $form->getData(); | |
| // overwrite with updated data | |
| $formAction = array_merge($actions[$objectId], $formData); | |
| if (empty($formAction['name'])) { | |
| // set it to the event default | |
| $formAction['name'] = $this->translator->trans($formAction['settings']['label']); | |
| } | |
| $actions[$objectId] = $formAction; | |
| $session->set('mautic.form.'.$formId.'.actions.modified', $actions); | |
| // generate HTML for the field | |
| $keyId = $objectId; | |
| // take note if this is a submit button or not | |
| if ('button' == $actionType) { | |
| $submits = $session->get('mautic.formactions.submits', []); | |
| if ('submit' == $formAction['properties']['type'] && !in_array($keyId, $submits)) { | |
| // button type updated to submit | |
| $submits[] = $keyId; | |
| $session->set('mautic.formactions.submits', $submits); | |
| } elseif ('submit' != $formAction['properties']['type'] && in_array($keyId, $submits)) { | |
| // button type updated to something other than submit | |
| $key = array_search($keyId, $submits); | |
| unset($submits[$key]); | |
| $session->set('mautic.formactions.submits', $submits); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| $viewParams = ['type' => $actionType]; | |
| if ($cancelled || $valid) { | |
| $closeModal = true; | |
| } else { | |
| $closeModal = false; | |
| $viewParams['tmpl'] = 'action'; | |
| $viewParams['form'] = $form->createView(); | |
| $viewParams['actionHeader'] = $this->translator->trans($formAction['settings']['label']); | |
| if (isset($formAction['settings']['formTheme'])) { | |
| $viewParams['formTheme'] = $formAction['settings']['formTheme']; | |
| } | |
| } | |
| $passthroughVars = [ | |
| 'mauticContent' => 'formAction', | |
| 'success' => $success, | |
| 'route' => false, | |
| ]; | |
| if (!empty($keyId)) { | |
| $passthroughVars['actionId'] = $keyId; | |
| // prevent undefined errors | |
| $entity = new Action(); | |
| $blank = $entity->convertToArray(); | |
| $formAction = array_merge($blank, $formAction); | |
| $template = (!empty($formAction['settings']['template'])) ? $formAction['settings']['template'] : | |
| '@MauticForm/Action/_generic.html.twig'; | |
| $passthroughVars['actionHtml'] = $this->renderView($template, [ | |
| 'inForm' => true, | |
| 'action' => $formAction, | |
| 'id' => $keyId, | |
| 'formId' => $formId, | |
| ]); | |
| } | |
| if ($closeModal) { | |
| // just close the modal | |
| $passthroughVars['closeModal'] = 1; | |
| return new JsonResponse($passthroughVars); | |
| } | |
| return $this->ajaxAction($request, [ | |
| 'contentTemplate' => '@MauticForm/Builder/'.$viewParams['tmpl'].'.html.twig', | |
| 'viewParameters' => $viewParams, | |
| 'passthroughVars' => $passthroughVars, | |
| ]); | |
| } | |
| return new JsonResponse(['success' => 0]); | |
| } | |
| /** | |
| * Deletes the entity. | |
| * | |
| * @return JsonResponse | |
| */ | |
| public function deleteAction(Request $request, $objectId) | |
| { | |
| $session = $request->getSession(); | |
| $formId = $request->query->get('formId'); | |
| $actions = $session->get('mautic.form.'.$formId.'.actions.modified', []); | |
| $delete = $session->get('mautic.form.'.$formId.'.actions.deleted', []); | |
| // ajax only for form fields | |
| if (!$request->isXmlHttpRequest() | |
| || !$this->security->isGranted(['form:forms:editown', 'form:forms:editother', 'form:forms:create'], 'MATCH_ONE') | |
| ) { | |
| return $this->accessDenied(); | |
| } | |
| $formAction = (array_key_exists($objectId, $actions)) ? $actions[$objectId] : null; | |
| if ('POST' == $request->getMethod() && null !== $formAction) { | |
| // add the field to the delete list | |
| if (!in_array($objectId, $delete)) { | |
| $delete[] = $objectId; | |
| $session->set('mautic.form.'.$formId.'.actions.deleted', $delete); | |
| } | |
| // take note if this is a submit button or not | |
| if ('button' == $formAction['type']) { | |
| $submits = $session->get('mautic.formactions.submits', []); | |
| $properties = $formAction['properties']; | |
| if ('submit' == $properties['type'] && in_array($objectId, $submits)) { | |
| $key = array_search($objectId, $submits); | |
| unset($submits[$key]); | |
| $session->set('mautic.formactions.submits', $submits); | |
| } | |
| } | |
| $dataArray = [ | |
| 'mauticContent' => 'formAction', | |
| 'success' => 1, | |
| 'route' => false, | |
| ]; | |
| } else { | |
| $dataArray = ['success' => 0]; | |
| } | |
| return new JsonResponse($dataArray); | |
| } | |
| } | |