Spaces:
No application file
No application file
namespace Mautic\FormBundle\Controller; | |
use Doctrine\Persistence\ManagerRegistry; | |
use Mautic\CoreBundle\Controller\AjaxController as CommonAjaxController; | |
use Mautic\CoreBundle\Factory\MauticFactory; | |
use Mautic\CoreBundle\Factory\ModelFactory; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\InputHelper; | |
use Mautic\CoreBundle\Helper\UserHelper; | |
use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
use Mautic\CoreBundle\Service\FlashBag; | |
use Mautic\CoreBundle\Translation\Translator; | |
use Mautic\FormBundle\Collector\AlreadyMappedFieldCollectorInterface; | |
use Mautic\FormBundle\Collector\FieldCollectorInterface; | |
use Mautic\FormBundle\Crate\FieldCrate; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
class AjaxController extends CommonAjaxController | |
{ | |
public function __construct( | |
private FieldCollectorInterface $fieldCollector, | |
private AlreadyMappedFieldCollectorInterface $mappedFieldCollector, | |
ManagerRegistry $doctrine, | |
MauticFactory $factory, | |
ModelFactory $modelFactory, | |
UserHelper $userHelper, | |
CoreParametersHelper $coreParametersHelper, | |
EventDispatcherInterface $dispatcher, | |
Translator $translator, | |
FlashBag $flashBag, | |
RequestStack $requestStack, | |
CorePermissions $security | |
) { | |
parent::__construct($doctrine, $factory, $modelFactory, $userHelper, $coreParametersHelper, $dispatcher, $translator, $flashBag, $requestStack, $security); | |
} | |
/** | |
* @param string $name | |
*/ | |
public function reorderFieldsAction(Request $request, $bundle, $name = 'fields'): JsonResponse | |
{ | |
if ('form' === $name) { | |
$name = 'fields'; | |
} | |
$dataArray = ['success' => 0]; | |
$sessionId = InputHelper::clean($request->request->get('formId')); | |
$sessionName = 'mautic.form.'.$sessionId.'.'.$name.'.modified'; | |
$session = $request->getSession(); | |
$orderName = ('fields' == $name) ? 'mauticform' : 'mauticform_action'; | |
$order = InputHelper::clean($request->request->get($orderName)); | |
$components = $session->get($sessionName); | |
if (!empty($order) && !empty($components)) { | |
$components = array_replace(array_flip($order), $components); | |
$session->set($sessionName, $components); | |
$dataArray['success'] = 1; | |
} | |
return $this->sendJsonResponse($dataArray); | |
} | |
public function getFieldsForObjectAction(Request $request): JsonResponse | |
{ | |
$formId = $request->get('formId'); | |
$mappedObject = $request->get('mappedObject'); | |
$mappedField = $request->get('mappedField'); | |
$mappedFields = $this->mappedFieldCollector->getFields($formId, $mappedObject); | |
$fields = $this->fieldCollector->getFields($mappedObject); | |
$fields = $fields->removeFieldsWithKeys($mappedFields, $mappedField); | |
return $this->sendJsonResponse( | |
[ | |
'fields' => array_map( | |
fn (FieldCrate $field): array => [ | |
'label' => $field->getName(), | |
'value' => $field->getKey(), | |
'isListType' => $field->isListType(), | |
], | |
$fields->getArrayCopy() | |
), | |
] | |
); | |
} | |
public function reorderActionsAction(Request $request): JsonResponse | |
{ | |
return $this->reorderFieldsAction($request, 'actions'); | |
} | |
public function updateFormFieldsAction(Request $request): JsonResponse | |
{ | |
$formId = (int) $request->request->get('formId'); | |
$dataArray = ['success' => 0]; | |
$model = $this->getModel('form'); | |
$entity = $model->getEntity($formId); | |
$formFields = empty($entity) ? [] : $entity->getFields(); | |
$fields = []; | |
foreach ($formFields as $field) { | |
if ('button' != $field->getType()) { | |
$properties = $field->getProperties(); | |
$options = []; | |
if (!empty($properties['list']['list'])) { | |
// If the field is a SELECT field then the data gets stored in [list][list] | |
$optionList = $properties['list']['list']; | |
} elseif (!empty($properties['optionlist']['list'])) { | |
// If the field is a radio or a checkbox then it will be stored in [optionlist][list] | |
$optionList = $properties['optionlist']['list']; | |
} | |
if (!empty($optionList)) { | |
foreach ($optionList as $listItem) { | |
if (is_array($listItem) && isset($listItem['value']) && isset($listItem['label'])) { | |
// The select box needs values to be [value] => label format so make sure we have that style then put it in | |
$options[$listItem['value']] = $listItem['label']; | |
} elseif (!is_array($listItem)) { | |
// Keeping for BC | |
$options[] = $listItem; | |
} | |
} | |
} | |
$fields[] = [ | |
'id' => $field->getId(), | |
'label' => $field->getLabel(), | |
'alias' => $field->getAlias(), | |
'type' => $field->getType(), | |
'options' => $options, | |
]; | |
// Be sure to not pollute the symbol table. | |
unset($optionList); | |
} | |
} | |
$dataArray['fields'] = $fields; | |
$dataArray['success'] = 1; | |
return $this->sendJsonResponse($dataArray); | |
} | |
/** | |
* Ajax submit for forms. | |
*/ | |
public function submitAction(Request $request): JsonResponse | |
{ | |
$response = $this->forwardWithPost('Mautic\FormBundle\Controller\PublicController::submitAction', $request->request->all(), [], ['ajax' => true]); | |
$responseData = json_decode($response->getContent(), true); | |
$success = (!in_array($response->getStatusCode(), [404, 500]) && empty($responseData['errorMessage']) | |
&& empty($responseData['validationErrors'])); | |
$message = ''; | |
$type = ''; | |
if (isset($responseData['successMessage'])) { | |
$message = $responseData['successMessage']; | |
$type = 'notice'; | |
} elseif (isset($responseData['errorMessage'])) { | |
$message = $responseData['errorMessage']; | |
$type = 'error'; | |
} | |
$data = array_merge($responseData, ['message' => $message, 'type' => $type, 'success' => $success]); | |
return $this->sendJsonResponse($data); | |
} | |
} | |