/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function getWebsiteSnapshotAction(Request $request) { $data = ['success' => 0]; if ($this->get('mautic.security')->isGranted('plugin:focus:items:create')) { $website = InputHelper::url($request->request->get('website')); if ($website) { // Let's try to extract colors from image $id = InputHelper::int($request->request->get('id')); if (!empty($id)) { // Tell the JS to not populate with default colors $data['ignoreDefaultColors'] = true; } $snapshotUrl = $this->get('mautic.helper.core_parameters')->getParameter('website_snapshot_url'); $snapshotKey = $this->get('mautic.helper.core_parameters')->getParameter('website_snapshot_key'); $http = $this->get('mautic.http.connector'); $response = $http->get($snapshotUrl . '?url=' . urlencode($website) . '&key=' . $snapshotKey, [], 30); if ($response->code === 200) { $package = json_decode($response->body, true); if (isset($package['images'])) { $data['image']['desktop'] = $package['images']['desktop']; $data['image']['mobile'] = $package['images']['mobile']; $palette = $package['palette']; $data['colors'] = ['primaryColor' => $palette[0], 'textColor' => FocusModel::isLightColor($palette[0]) ? '#000000' : '#ffffff', 'buttonColor' => $palette[1], 'buttonTextColor' => FocusModel::isLightColor($palette[1]) ? '#000000' : '#ffffff']; $data['success'] = 1; } } } } return $this->sendJsonResponse($data); }
protected function sendHookTestAction(Request $request) { $url = InputHelper::url($request->request->get('url')); // validate the URL if ($url == '' || !$url) { // default to an error message $dataArray = array('success' => 1, 'html' => '<div class="has-error"><span class="help-block">' . $this->factory->getTranslator()->trans('mautic.webhook.label.no.url') . '</span></div>'); return $this->sendJsonResponse($dataArray); } // get the selected types $selectedTypes = InputHelper::cleanArray($request->request->get('types')); $payloadPaths = $this->getPayloadPaths($selectedTypes); $payloads = $this->loadPayloads($payloadPaths); $now = new \DateTime(); $payloads['timestamp'] = $now->format('c'); // Set up custom headers $headers = ['Content-Type' => 'application/json']; // instantiate new http class $http = new Http(); // set the response $response = $http->post($url, json_encode($payloads), $headers); // default to an error message $dataArray = array('success' => 1, 'html' => '<div class="has-error"><span class="help-block">' . $this->factory->getTranslator()->trans('mautic.webhook.label.warning') . '</span></div>'); // if we get a 200 response convert to success message if ($response->code == 200) { $dataArray['html'] = '<div class="has-success"><span class="help-block">' . $this->factory->getTranslator()->trans('mautic.webhook.label.success') . '</span></div>'; } return $this->sendJsonResponse($dataArray); }
/** * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function submitAction() { if ($this->request->getMethod() !== 'POST') { return $this->accessDenied(); } $post = $this->request->request->get('mauticform'); $messengerMode = !empty($post['messenger']); $server = $this->request->server->all(); $return = isset($post['return']) ? $post['return'] : false; if (empty($return)) { //try to get it from the HTTP_REFERER $return = isset($server['HTTP_REFERER']) ? $server['HTTP_REFERER'] : false; } if (!empty($return)) { //remove mauticError and mauticMessage from the referer so it doesn't get sent back $return = InputHelper::url($return, null, null, null, array('mauticError', 'mauticMessage'), true); $query = strpos($return, '?') === false ? '?' : '&'; } $translator = $this->get('translator'); if (!isset($post['formId']) && isset($post['formid'])) { $post['formId'] = $post['formid']; } elseif (isset($post['formId']) && !isset($post['formid'])) { $post['formid'] = $post['formId']; } //check to ensure there is a formId if (!isset($post['formId'])) { $error = $translator->trans('mautic.form.submit.error.unavailable', array(), 'flashes'); } else { $formModel = $this->factory->getModel('form.form'); $form = $formModel->getEntity($post['formId']); //check to see that the form was found if ($form === null) { $error = $translator->trans('mautic.form.submit.error.unavailable', array(), 'flashes'); } else { //get what to do immediately after successful post $postAction = $form->getPostAction(); $postActionProperty = $form->getPostActionProperty(); //check to ensure the form is published $status = $form->getPublishStatus(); $dateTemplateHelper = $this->get('mautic.helper.template.date'); if ($status == 'pending') { $error = $translator->trans('mautic.form.submit.error.pending', array('%date%' => $dateTemplateHelper->toFull($form->getPublishUp())), 'flashes'); } elseif ($status == 'expired') { $error = $translator->trans('mautic.form.submit.error.expired', array('%date%' => $dateTemplateHelper->toFull($form->getPublishDown())), 'flashes'); } elseif ($status != 'published') { $error = $translator->trans('mautic.form.submit.error.unavailable', array(), 'flashes'); } else { $result = $this->factory->getModel('form.submission')->saveSubmission($post, $server, $form); if (!empty($result['errors'])) { if ($messengerMode) { $error = $result['errors']; } else { $error = $result['errors'] ? $this->get('translator')->trans('mautic.form.submission.errors') . '<br /><ol><li>' . implode("</li><li>", $result['errors']) . '</li></ol>' : false; } } elseif (!empty($result['callback'])) { $callback = $result['callback']['callback']; if (is_callable($callback)) { if (is_array($callback)) { $reflection = new \ReflectionMethod($callback[0], $callback[1]); } elseif (strpos($callback, '::') !== false) { $parts = explode('::', $callback); $reflection = new \ReflectionMethod($parts[0], $parts[1]); } else { $reflection = new \ReflectionMethod(null, $callback); } //add the factory to the arguments $result['callback']['factory'] = $this->factory; $pass = array(); $result['callback']['messengerMode'] = $messengerMode; foreach ($reflection->getParameters() as $param) { if (isset($result['callback'][$param->getName()])) { $pass[] = $result['callback'][$param->getName()]; } else { $pass[] = null; } } $callbackResponse = $reflection->invokeArgs($this, $pass); if (!$messengerMode) { return $callbackResponse; } } } } } } if ($messengerMode) { // Return the call via postMessage API $data = array('success' => 1); if (!empty($error)) { if (is_array($error)) { $data['validationErrors'] = $error; } else { $data['errorMessage'] = $error; } $data['success'] = 0; } else { if ($postAction == 'redirect') { $data['redirect'] = $postActionProperty; } elseif (!empty($postActionProperty)) { $data['successMessage'] = $postActionProperty; } if (!empty($callbackResponse)) { if ($callbackResponse instanceof RedirectResponse) { $data['redirect'] = $callbackResponse->getTargetUrl(); } elseif ($callbackResponse instanceof Response) { $data['successMessage'] = $callbackResponse->getContent(); } elseif (is_array($callbackResponse)) { $data = array_merge($data, $callbackResponse); } else { $data['successMessage'] = $callbackResponse->getContent(); } } } if (isset($post['formName'])) { $data['formName'] = $post['formName']; } $response = json_encode($data); return $this->render('MauticFormBundle::messenger.html.php', array('response' => $response)); } else { if (!empty($error)) { if ($return) { $hash = $form !== null ? '#' . strtolower($form->getAlias()) : ''; return $this->redirect($return . $query . 'mauticError=' . rawurlencode($error) . $hash); } else { $msg = $error; $msgType = 'error'; } } elseif ($postAction == 'redirect') { return $this->redirect($postActionProperty); } elseif ($postAction == 'return') { if (!empty($return)) { if (!empty($postActionProperty)) { $return .= $query . 'mauticMessage=' . rawurlencode($postActionProperty); } return $this->redirect($return); } else { $msg = $this->get('translator')->trans('mautic.form.submission.thankyou'); } } else { $msg = $postActionProperty; } $session = $this->factory->getSession(); $session->set('mautic.emailbundle.message', array('message' => $msg, 'type' => empty($msgType) ? 'notice' : $msgType)); return $this->redirect($this->generateUrl('mautic_form_postmessage')); } }
/** * @param $post * @param $server * @param Form $form * * @return boolean|string false if no error was encountered; otherwise the error message */ public function saveSubmission($post, $server, Form $form) { $fieldHelper = new FormFieldHelper($this->translator); //everything matches up so let's save the results $submission = new Submission(); $submission->setDateSubmitted(new \DateTime()); $submission->setForm($form); $ipAddress = $this->factory->getIpAddress(); $submission->setIpAddress($ipAddress); if (!empty($post['return'])) { $referer = $post['return']; } elseif (!empty($server['HTTP_REFERER'])) { $referer = $server['HTTP_REFERER']; } else { $referer = ''; } //clean the referer by removing mauticError and mauticMessage $referer = InputHelper::url($referer, null, null, array('mauticError', 'mauticMessage')); $submission->setReferer($referer); $fields = $form->getFields(); $fieldArray = array(); $results = array(); $tokens = array(); $leadFieldMatches = array(); $validationErrors = array(); foreach ($fields as $f) { $id = $f->getId(); $type = $f->getType(); $alias = $f->getAlias(); $value = isset($post[$alias]) ? $post[$alias] : ''; $fieldArray[$id] = array('id' => $id, 'type' => $type, 'alias' => $alias); if (in_array($type, array('button', 'freetext'))) { //don't save items that don't have a value associated with it continue; } elseif ($type == 'captcha') { $captcha = $fieldHelper->validateFieldValue($type, $value, $f); if (!empty($captcha)) { $props = $f->getProperties(); //check for a custom message $validationErrors[$alias] = !empty($props['errorMessage']) ? $props['errorMessage'] : implode('<br />', $captcha); } continue; } if ($f->isRequired() && empty($value)) { //somehow the user got passed the JS validation $msg = $f->getValidationMessage(); if (empty($msg)) { $msg = $this->translator->trans('mautic.form.field.generic.validationfailed', array('%label%' => $f->getLabel()), 'validators'); } $validationErrors[$alias] = $msg; continue; } //clean and validate the input if ($f->isCustom()) { $params = $f->getCustomParameters(); if (!empty($value)) { if (isset($params['valueFilter'])) { if (is_string($params['inputFilter'] && method_exists('\\Mautic\\CoreBundle\\Helper\\InputHelper', $params['valueFilter']))) { $value = InputHelper::_($value, $params['valueFilter']); } elseif (is_callable($params['valueFilter'])) { $value = call_user_func_array($params['valueFilter'], array($f, $value)); } else { $value = InputHelper::_($value, 'clean'); } } else { $value = InputHelper::_($value, 'clean'); } } if (isset($params['valueConstraints']) && is_callable($params['valueConstraints'])) { $customErrors = call_user_func_array($params['valueConstraints'], array($f, $value)); if (!empty($customErrors)) { $validationErrors[$alias] = is_array($customErrors) ? implode('<br />', $customErrors) : $customErrors; } } } elseif (!empty($value)) { $filter = $fieldHelper->getFieldFilter($type); $value = InputHelper::_($value, $filter); $validation = $fieldHelper->validateFieldValue($type, $value); if (!empty($validation)) { $validationErrors[$alias] = is_array($validation) ? implode('<br />', $validation) : $validation; } } //convert array from checkbox groups and multiple selects if (is_array($value)) { $value = implode(", ", $value); } $tokens["{formfield={$alias}}"] = $value; //save the result if ($f->getSaveResult() !== false) { $results[$alias] = $value; } $leadField = $f->getLeadField(); if (!empty($leadField)) { $leadFieldMatches[$leadField] = $value; } } $submission->setResults($results); //execute submit actions $actions = $form->getActions(); //get post submit actions to make sure it still exists $components = $this->factory->getModel('form')->getCustomComponents(); $availableActions = $components['actions']; $args = array('post' => $post, 'server' => $server, 'factory' => $this->factory, 'submission' => $submission, 'fields' => $fieldArray, 'form' => $form, 'tokens' => $tokens); foreach ($actions as $action) { $key = $action->getType(); if (!isset($availableActions[$key])) { continue; } $settings = $availableActions[$key]; $args['action'] = $action; $args['config'] = $action->getProperties(); if (array_key_exists('validator', $settings)) { $callback = $settings['validator']; if (is_callable($callback)) { if (is_array($callback)) { $reflection = new \ReflectionMethod($callback[0], $callback[1]); } elseif (strpos($callback, '::') !== false) { $parts = explode('::', $callback); $reflection = new \ReflectionMethod($parts[0], $parts[1]); } else { $reflection = new \ReflectionMethod(null, $callback); } $pass = array(); foreach ($reflection->getParameters() as $param) { if (isset($args[$param->getName()])) { $pass[] = $args[$param->getName()]; } else { $pass[] = null; } } list($validated, $validatedMessage) = $reflection->invokeArgs($this, $pass); if (!$validated) { $validationErrors[$alias] = $validatedMessage; } } } } //return errors if (!empty($validationErrors)) { return array('errors' => $validationErrors); } //set the landing page the form was submitted from if applicable if (!empty($post['mauticpage'])) { $page = $this->factory->getModel('page.page')->getEntity((int) $post['mauticpage']); if ($page != null) { $submission->setPage($page); } } // Add a feedback parameter $args['feedback'] = array(); /** @var \Mautic\LeadBundle\Model\LeadModel $leadModel */ $leadModel = $this->factory->getModel('lead'); // Create/update lead if (!empty($leadFieldMatches)) { $this->createLeadFromSubmit($form, $leadFieldMatches); } if ($form->isStandalone()) { // Now handle post submission actions foreach ($actions as $action) { $key = $action->getType(); if (!isset($availableActions[$key])) { continue; } $settings = $availableActions[$key]; $args['action'] = $action; $args['config'] = $action->getProperties(); // Set the lead each time in case an action updates it $args['lead'] = $leadModel->getCurrentLead(); $callback = $settings['callback']; if (is_callable($callback)) { if (is_array($callback)) { $reflection = new \ReflectionMethod($callback[0], $callback[1]); } elseif (strpos($callback, '::') !== false) { $parts = explode('::', $callback); $reflection = new \ReflectionMethod($parts[0], $parts[1]); } else { $reflection = new \ReflectionMethod(null, $callback); } $pass = array(); foreach ($reflection->getParameters() as $param) { if (isset($args[$param->getName()])) { $pass[] = $args[$param->getName()]; } else { $pass[] = null; } } $returned = $reflection->invokeArgs($this, $pass); $args['feedback'][$key] = $returned; } } } // Get updated lead with tracking ID if ($form->isInKioskMode()) { $lead = $leadModel->getCurrentLead(); } else { list($lead, $trackingId, $generated) = $leadModel->getCurrentLead(true); //set tracking ID for stats purposes to determine unique hits $submission->setTrackingId($trackingId); } $submission->setLead($lead); if (!$form->isStandalone()) { // Find and add the lead to the associated campaigns /** @var \Mautic\CampaignBundle\Model\CampaignModel $campaignModel */ $campaignModel = $this->factory->getModel('campaign'); $campaigns = $campaignModel->getCampaignsByForm($form); if (!empty($campaigns)) { foreach ($campaigns as $campaign) { $campaignModel->addLead($campaign, $lead); } } } //save entity after the form submission events are fired in case a new lead is created $this->saveEntity($submission); if ($this->dispatcher->hasListeners(FormEvents::FORM_ON_SUBMIT)) { $event = new SubmissionEvent($submission, $post, $server); $this->dispatcher->dispatch(FormEvents::FORM_ON_SUBMIT, $event); } //last round of callback commands from the submit actions; first come first serve foreach ($args['feedback'] as $k => $data) { if (!empty($data['callback'])) { return array('callback' => $data); } } //made it to the end so return false that there was not an error return false; }
/** * @param $post * @param $server * @param Form $form * * @return bool|array */ public function saveSubmission($post, $server, Form $form, Request $request = null, $returnEvent = false) { $leadFields = $this->leadFieldModel->getFieldListWithProperties(false); //everything matches up so let's save the results $submission = new Submission(); $submission->setDateSubmitted(new \DateTime()); $submission->setForm($form); //set the landing page the form was submitted from if applicable if (!empty($post['mauticpage'])) { $page = $this->pageModel->getEntity((int) $post['mauticpage']); if ($page != null) { $submission->setPage($page); } } $ipAddress = $this->ipLookupHelper->getIpAddress(); $submission->setIpAddress($ipAddress); if (!empty($post['return'])) { $referer = $post['return']; } elseif (!empty($server['HTTP_REFERER'])) { $referer = $server['HTTP_REFERER']; } else { $referer = ''; } //clean the referer by removing mauticError and mauticMessage $referer = InputHelper::url($referer, null, null, ['mauticError', 'mauticMessage']); $submission->setReferer($referer); // Create an event to be dispatched through the processes $submissionEvent = new SubmissionEvent($submission, $post, $server, $request); // Get a list of components to build custom fields from $components = $this->formModel->getCustomComponents(); $fields = $form->getFields(); $fieldArray = []; $results = []; $tokens = []; $leadFieldMatches = []; $validationErrors = []; /** @var Field $f */ foreach ($fields as $f) { $id = $f->getId(); $type = $f->getType(); $alias = $f->getAlias(); $value = isset($post[$alias]) ? $post[$alias] : ''; $fieldArray[$id] = ['id' => $id, 'type' => $type, 'alias' => $alias]; if ($type == 'captcha') { $captcha = $this->fieldHelper->validateFieldValue($type, $value, $f); if (!empty($captcha)) { $props = $f->getProperties(); //check for a custom message $validationErrors[$alias] = !empty($props['errorMessage']) ? $props['errorMessage'] : implode('<br />', $captcha); } continue; } if ($f->isRequired() && empty($value)) { //field is required, but hidden from form because of 'ShowWhenValueExists' if ($f->getShowWhenValueExists() === false && !isset($post[$alias])) { continue; } //somehow the user got passed the JS validation $msg = $f->getValidationMessage(); if (empty($msg)) { $msg = $this->translator->trans('mautic.form.field.generic.validationfailed', ['%label%' => $f->getLabel()], 'validators'); } $validationErrors[$alias] = $msg; continue; } if (in_array($type, $components['viewOnlyFields'])) { //don't save items that don't have a value associated with it continue; } //clean and validate the input if ($f->isCustom()) { if (!isset($components['fields'][$f->getType()])) { continue; } $params = $components['fields'][$f->getType()]; if (!empty($value)) { if (isset($params['valueFilter'])) { if (is_string($params['valueFilter']) && is_callable(['\\Mautic\\CoreBundle\\Helper\\InputHelper', $params['valueFilter']])) { $value = InputHelper::_($value, $params['valueFilter']); } elseif (is_callable($params['valueFilter'])) { $value = call_user_func_array($params['valueFilter'], [$f, $value]); } else { $value = InputHelper::_($value, 'clean'); } } else { $value = InputHelper::_($value, 'clean'); } } // @deprecated - BC support; to be removed in 3.0 - be sure to remove support in FormBuilderEvent as well if (isset($params['valueConstraints']) && is_callable($params['valueConstraints'])) { $customErrors = call_user_func_array($params['valueConstraints'], [$f, $value]); if (!empty($customErrors)) { $validationErrors[$alias] = is_array($customErrors) ? implode('<br />', $customErrors) : $customErrors; } } } elseif (!empty($value)) { $filter = $this->fieldHelper->getFieldFilter($type); $value = InputHelper::_($value, $filter); $isValid = $this->validateFieldValue($f, $value); if (true !== $isValid) { $validationErrors[$alias] = is_array($isValid) ? implode('<br />', $isValid) : $isValid; } } // Check for custom validators $isValid = $this->validateFieldValue($f, $value); if (true !== $isValid) { $validationErrors[$alias] = $isValid; } $leadField = $f->getLeadField(); if (!empty($leadField)) { $leadValue = $value; if (is_array($leadValue)) { // Multiselect lead fields store the values with bars $delimeter = 'multiselect' === $leadFields[$leadField]['type'] ? '|' : ', '; $leadValue = implode($delimeter, $leadValue); } $leadFieldMatches[$leadField] = $leadValue; } //convert array from checkbox groups and multiple selects if (is_array($value)) { $value = implode(', ', $value); } $tokens["{formfield={$alias}}"] = $value; //save the result if ($f->getSaveResult() !== false) { $results[$alias] = $value; } } // Set the results $submission->setResults($results); // Update the event $submissionEvent->setFields($fieldArray)->setTokens($tokens)->setResults($results)->setContactFieldMatches($leadFieldMatches); // @deprecated - BC support; to be removed in 3.0 - be sure to remove the validator option from addSubmitAction as well $this->validateActionCallbacks($submissionEvent, $validationErrors, $alias); //return errors if there any - this should be moved to right after foreach($fields) once validateActionCallbacks support is dropped if (!empty($validationErrors)) { return ['errors' => $validationErrors]; } // Create/update lead if (!empty($leadFieldMatches)) { $lead = $this->createLeadFromSubmit($form, $leadFieldMatches, $leadFields); $submission->setLead($lead); } // Get updated lead if applicable with tracking ID if ($form->isInKioskMode()) { $lead = $this->leadModel->getCurrentLead(); } else { list($lead, $trackingId, $generated) = $this->leadModel->getCurrentLead(true); //set tracking ID for stats purposes to determine unique hits $submission->setTrackingId($trackingId); } $submission->setLead($lead); // Save the submission $this->saveEntity($submission); // Now handle post submission actions try { $this->executeFormActions($submissionEvent); } catch (ValidationException $exception) { // The action invalidated the form for whatever reason $this->deleteEntity($submission); if ($validationErrors = $exception->getViolations()) { return ['errors' => $validationErrors]; } return ['errors' => [$exception->getMessage()]]; } if (!$form->isStandalone()) { // Find and add the lead to the associated campaigns $campaigns = $this->campaignModel->getCampaignsByForm($form); if (!empty($campaigns)) { foreach ($campaigns as $campaign) { $this->campaignModel->addLead($campaign, $lead); } } } if ($this->dispatcher->hasListeners(FormEvents::FORM_ON_SUBMIT)) { // Reset action config from executeFormActions() $submissionEvent->setActionConfig(null, []); // Dispatch to on submit listeners $this->dispatcher->dispatch(FormEvents::FORM_ON_SUBMIT, $submissionEvent); } //get callback commands from the submit action if ($submissionEvent->hasPostSubmitCallbacks()) { return ['callback' => $submissionEvent]; } // made it to the end so return the submission event to give the calling method access to tokens, results, etc // otherwise return false that no errors were encountered (to keep BC really) return $returnEvent ? ['submission' => $submissionEvent] : false; }
/** * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function submitAction() { if ($this->request->getMethod() !== 'POST') { return $this->accessDenied(); } $isAjax = $this->request->query->get('ajax', false); $form = null; $post = $this->request->request->get('mauticform'); $messengerMode = !empty($post['messenger']); $server = $this->request->server->all(); $return = isset($post['return']) ? $post['return'] : false; if (empty($return)) { //try to get it from the HTTP_REFERER $return = isset($server['HTTP_REFERER']) ? $server['HTTP_REFERER'] : false; } if (!empty($return)) { //remove mauticError and mauticMessage from the referer so it doesn't get sent back $return = InputHelper::url($return, null, null, null, ['mauticError', 'mauticMessage'], true); $query = strpos($return, '?') === false ? '?' : '&'; } $translator = $this->get('translator'); if (!isset($post['formId']) && isset($post['formid'])) { $post['formId'] = $post['formid']; } elseif (isset($post['formId']) && !isset($post['formid'])) { $post['formid'] = $post['formId']; } //check to ensure there is a formId if (!isset($post['formId'])) { $error = $translator->trans('mautic.form.submit.error.unavailable', [], 'flashes'); } else { $formModel = $this->getModel('form.form'); $form = $formModel->getEntity($post['formId']); //check to see that the form was found if ($form === null) { $error = $translator->trans('mautic.form.submit.error.unavailable', [], 'flashes'); } else { //get what to do immediately after successful post $postAction = $form->getPostAction(); $postActionProperty = $form->getPostActionProperty(); //check to ensure the form is published $status = $form->getPublishStatus(); $dateTemplateHelper = $this->get('mautic.helper.template.date'); if ($status == 'pending') { $error = $translator->trans('mautic.form.submit.error.pending', ['%date%' => $dateTemplateHelper->toFull($form->getPublishUp())], 'flashes'); } elseif ($status == 'expired') { $error = $translator->trans('mautic.form.submit.error.expired', ['%date%' => $dateTemplateHelper->toFull($form->getPublishDown())], 'flashes'); } elseif ($status != 'published') { $error = $translator->trans('mautic.form.submit.error.unavailable', [], 'flashes'); } else { $result = $this->getModel('form.submission')->saveSubmission($post, $server, $form, $this->request, true); if (!empty($result['errors'])) { if ($messengerMode || $isAjax) { $error = $result['errors']; } else { $error = $result['errors'] ? $this->get('translator')->trans('mautic.form.submission.errors') . '<br /><ol><li>' . implode('</li><li>', $result['errors']) . '</li></ol>' : false; } } elseif (!empty($result['callback'])) { /** @var SubmissionEvent $submissionEvent */ $submissionEvent = $result['callback']; // Return the first Response object if one is defined $firstResponseObject = false; if ($callbackResponses = $submissionEvent->getPostSubmitCallbackResponse()) { // Some submit actions already injected it's responses foreach ($callbackResponses as $key => $response) { if ($response instanceof Response) { $firstResponseObject = $key; break; } } } // These submit actions have requested a callback after all is said and done $callbacksRequested = $submissionEvent->getPostSubmitCallback(); foreach ($callbacksRequested as $key => $callbackRequested) { $callbackRequested['messengerMode'] = $messengerMode; $callbackRequested['ajaxMode'] = $isAjax; if (isset($callbackRequested['eventName'])) { $submissionEvent->setPostSubmitCallback($key, $callbackRequested); $this->get('event_dispatcher')->dispatch($callbackRequested['eventName'], $submissionEvent); } elseif (isset($callbackRequested['callback'])) { // @deprecated - to be removed in 3.0; use eventName instead - be sure to remove callback key support from SubmissionEvent::setPostSubmitCallback $callback = $callbackRequested['callback']; if (is_callable($callback)) { if (is_array($callback)) { $reflection = new \ReflectionMethod($callback[0], $callback[1]); } elseif (strpos($callback, '::') !== false) { $parts = explode('::', $callback); $reflection = new \ReflectionMethod($parts[0], $parts[1]); } else { $reflection = new \ReflectionMethod(null, $callback); } //add the factory to the arguments $callbackRequested['factory'] = $this->factory; $pass = []; foreach ($reflection->getParameters() as $param) { if (isset($callbackRequested[$param->getName()])) { $pass[] = $callbackRequested[$param->getName()]; } else { $pass[] = null; } } $callbackResponses[$key] = $reflection->invokeArgs($this, $pass); } } if (!$firstResponseObject && $callbackResponses[$key] instanceof Response) { $firstResponseObject = $key; } } if ($firstResponseObject && !$messengerMode && !$isAjax) { // Return the response given by the sbumit action return $callbackResponses[$firstResponseObject]; } } elseif (isset($result['submission'])) { /** @var SubmissionEvent $submissionEvent */ $submissionEvent = $result['submission']; } } } } if (isset($submissionEvent) && !empty($postActionProperty)) { // Replace post action property with tokens to support custom redirects, etc $postActionProperty = $this->replacePostSubmitTokens($postActionProperty, $submissionEvent); } if ($messengerMode || $isAjax) { // Return the call via postMessage API $data = ['success' => 1]; if (!empty($error)) { if (is_array($error)) { $data['validationErrors'] = $error; } else { $data['errorMessage'] = $error; } $data['success'] = 0; } else { // Include results in ajax response for JS callback use if (isset($submissionEvent)) { $data['results'] = $submissionEvent->getResults(); } if ($postAction == 'redirect') { $data['redirect'] = $postActionProperty; } elseif (!empty($postActionProperty)) { $data['successMessage'] = [$postActionProperty]; } if (!empty($callbackResponses)) { foreach ($callbackResponses as $key => $response) { // Convert the responses to something useful for a JS response if ($response instanceof RedirectResponse && !isset($data['redirect'])) { $data['redirect'] = $response->getTargetUrl(); } elseif ($response instanceof Response) { if (!isset($data['successMessage'])) { $data['successMessage'] = []; } $data['successMessage'][] = $response->getContent(); } elseif (is_array($response)) { $data = array_merge($data, $response); } elseif (is_string($response)) { if (!isset($data['successMessage'])) { $data['successMessage'] = []; } $data['successMessage'][] = $response; } // ignore anything else } } // Combine all messages into one if (isset($data['successMessage'])) { $data['successMessage'] = implode('<br /><br />', $data['successMessage']); } } if (isset($post['formName'])) { $data['formName'] = $post['formName']; } if ($isAjax) { // Post via ajax so return a json response return new JsonResponse($data); } else { $response = json_encode($data); return $this->render('MauticFormBundle::messenger.html.php', ['response' => $response]); } } else { if (!empty($error)) { if ($return) { $hash = $form !== null ? '#' . strtolower($form->getAlias()) : ''; return $this->redirect($return . $query . 'mauticError=' . rawurlencode($error) . $hash); } else { $msg = $error; $msgType = 'error'; } } elseif ($postAction == 'redirect') { return $this->redirect($postActionProperty); } elseif ($postAction == 'return') { if (!empty($return)) { if (!empty($postActionProperty)) { $return .= $query . 'mauticMessage=' . rawurlencode($postActionProperty); } return $this->redirect($return); } else { $msg = $this->get('translator')->trans('mautic.form.submission.thankyou'); } } else { $msg = $postActionProperty; } $session = $this->get('session'); $session->set('mautic.emailbundle.message', ['message' => $msg, 'type' => empty($msgType) ? 'notice' : $msgType]); return $this->redirect($this->generateUrl('mautic_form_postmessage')); } }