public function actionSaveSubmission()
{
$this->requirePostRequest();
// Get the form
$handle = craft()->request->getRequiredPost('handle');
$form = craft()->amForms_forms->getFormByHandle($handle);
if (!$form) {
throw new Exception(Craft::t('No form exists with the handle “{handle}”.', array('handle' => $handle)));
}
// Get namespace
$namespace = craft()->request->getPost('namespace');
// Get the submission? Are we editing one?
$submissionId = craft()->request->getPost('submissionId');
// Get the submission
if ($submissionId) {
$submission = craft()->amForms_submissions->getSubmissionById($submissionId);
if (!$submission) {
throw new Exception(Craft::t('No submission exists with the ID “{id}”.', array('id' => $submissionId)));
}
} else {
$submission = new AmForms_SubmissionModel();
}
// Front-end submission, trigger AntiSpam or reCAPTCHA?
if (!craft()->request->isCpRequest()) {
// Where was this submission submitted?
$submission->submittedFrom = urldecode(craft()->request->getUrlReferrer());
// Validate AntiSpam settings
$submission->spamFree = craft()->amForms_antispam->verify($form->handle);
// Redirect our spammers before reCAPTCHA can be triggered
if (!$submission->spamFree) {
$this->_doRedirect($submission, false);
} else {
craft()->amForms_antispam->setMarkedAsNoSpam($form->handle);
}
// Validate reCAPTCHA
if (craft()->amForms_settings->isSettingValueEnabled('googleRecaptchaEnabled', AmFormsModel::SettingRecaptcha)) {
$submission->spamFree = craft()->amForms_recaptcha->verify();
// Was it verified?
if (!$submission->spamFree) {
$submission->addError('spamFree', Craft::t('reCAPTCHA was not verified.'));
// Don't upload files now
if (count($_FILES)) {
foreach ($_FILES as $key => $file) {
unset($_FILES[$key]);
}
}
}
}
}
// Add the form to the submission
$submission->form = $form;
$submission->formId = $form->id;
// Set attributes
$fieldsLocation = craft()->request->getPost('fieldsLocation', 'fields');
$submission->ipAddress = craft()->request->getUserHostAddress();
$submission->userAgent = craft()->request->getUserAgent();
if ($namespace) {
$namespaceAttributes = craft()->request->getPost($namespace);
if (isset($namespaceAttributes[$fieldsLocation])) {
$submission->setContentPostLocation($namespace . '.' . $fieldsLocation);
$submission->setContentFromPost($namespaceAttributes[$fieldsLocation]);
}
} else {
$submission->setContentPostLocation($fieldsLocation);
$submission->setContentFromPost($fieldsLocation);
}
// Save submission
if (craft()->amForms_submissions->saveSubmission($submission)) {
// Remove spam free token
craft()->amForms_antispam->verify($form->handle);
// Notification for new submissions
if (!craft()->request->isCpRequest() && !$submissionId) {
craft()->amForms_submissions->emailSubmission($submission);
}
// Redirect
if (craft()->request->isAjaxRequest()) {
$afterSubmitText = $form->afterSubmitText ? $form->afterSubmitText : Craft::t('Thanks for your submission.');
$this->returnJson(array('success' => true, 'afterSubmitText' => $afterSubmitText));
} elseif (craft()->request->isCpRequest()) {
craft()->userSession->setNotice(Craft::t('Submission saved.'));
$this->redirectToPostedUrl($submission);
} else {
$this->_doRedirect($submission, true);
}
} else {
if (craft()->request->isAjaxRequest()) {
$return = array('success' => false, 'errors' => $submission->getErrors());
$this->returnJson($return);
} elseif (craft()->request->isCpRequest()) {
craft()->userSession->setError(Craft::t('Couldn’t save submission.'));
// Send the submission back to the template
craft()->urlManager->setRouteVariables(array('submission' => $submission));
} else {
// Remember active submissions
craft()->amForms_submissions->setActiveSubmission($submission);
// Return the submission by the form's handle, for custom HTML possibilities
craft()->urlManager->setRouteVariables(array($form->handle => $submission));
}
}
}