Craft\FormBuilder2_EntryController::actionSubmitEntry PHP Method

actionSubmitEntry() public method

Submit Entry
public actionSubmitEntry ( )
    public function actionSubmitEntry()
    {
        $this->requirePostRequest();
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // VARIABLES
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        $files = '';
        $ajax = false;
        $passedValidation = true;
        $validationErrors = [];
        $submissionErrorMessage = [];
        $customSuccessMessage = '';
        $customErrorMessage = '';
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FORM
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        $form = craft()->formBuilder2_entry->getFormByHandle(craft()->request->getPost('formHandle'));
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FORM SUBMISSION
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        $formFields = $form->fieldLayout->getFieldLayout()->getFields();
        // Get all form fields
        $submission = craft()->request->getPost();
        // Get all values from the submitted form
        $submissionData = $this->filterSubmissionKeys($submission);
        // Fillter out unused submission data
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FORM ATTRIBUTES
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        $attributes = $form->getAttributes();
        $formSettings = $attributes['formSettings'];
        $spamProtectionSettings = $attributes['spamProtectionSettings'];
        $messageSettings = $attributes['messageSettings'];
        $notificationSettings = $attributes['notificationSettings'];
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FORM SETTINGS ||| (1) Custom Redirect, (2) File Uploads, (3) Ajax Submissions
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // (1) Custom Redirect
        if ($formSettings['formRedirect']['customRedirect'] != '') {
            $redirectUrl = $formSettings['formRedirect']['customRedirectUrl'];
        }
        // (2) File Uploads
        if ($formSettings['hasFileUploads'] == '1') {
            foreach ($formFields as $key => $value) {
                $field = $value->getField();
                switch ($field->type) {
                    case 'Assets':
                        $uploadedFiles = UploadedFile::getInstancesByName($field->handle);
                        $allowedKinds = [];
                        if ($field->settings['restrictFiles']) {
                            $allowedKinds = $field->settings['allowedKinds'];
                        }
                        foreach ($uploadedFiles as $file) {
                            $fileKind = IOHelper::getFileKind(IOHelper::getExtension($file->getName()));
                            if (in_array($fileKind, $allowedKinds)) {
                                $files[] = array('folderId' => $field->settings['singleUploadLocationSource'][0], 'sourceId' => $field->settings['singleUploadLocationSource'][0], 'filename' => $file->getName(), 'location' => $file->getTempName(), 'type' => $file->getType(), 'kind' => $fileKind);
                            } else {
                                $submissionErrorMessage[] = Craft::t('File type is not allowed!');
                            }
                        }
                        break;
                }
            }
        }
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FORM CUSTOM MESSAGES ||| (1) Success Message (2) Error Message
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // (1) Success Message
        $customSuccessMessage = $messageSettings['successMessage'] ? $messageSettings['successMessage'] : Craft::t('Submission was successful.');
        // (2) Error Message
        $customErrorMessage = $messageSettings['errorMessage'] ? $messageSettings['errorMessage'] : Craft::t('There was a problem with your submission.');
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // (3) Ajax Submissions
        if ($formSettings['ajaxSubmit'] == '1') {
            $this->requireAjaxRequest();
            $ajax = true;
        }
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FORM SPAM PROTECTION ||| (1) Timed Method (2) Honeypot Method
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // (1) Timed Method
        if ($spamProtectionSettings['spamTimeMethod'] == '1') {
            $formSubmissionTime = (int) craft()->request->getPost('spamTimeMethod');
            $submissionDuration = time() - $formSubmissionTime;
            $allowedTime = (int) $spamProtectionSettings['spamTimeMethodTime'];
            if ($submissionDuration < $allowedTime) {
                if ($ajax) {
                    $this->returnJson(['validationErrors' => [Craft::t('You submitted too fast, you are robot!')], 'customErrorMessage' => $customErrorMessage]);
                } else {
                    $spamTimedMethod = false;
                    $submissionErrorMessage[] = Craft::t('You submitted too fast, you are robot!');
                }
            } else {
                $spamTimedMethod = true;
            }
        } else {
            $spamTimedMethod = true;
        }
        // (2) Honeypot Method
        if ($spamProtectionSettings['spamHoneypotMethod'] == '1') {
            $honeypotField = craft()->request->getPost('email-address-new');
            if ($honeypotField != '') {
                if ($ajax) {
                    $this->returnJson(['validationErrors' => [Craft::t('You tried the honey, you are robot bear!')], 'customErrorMessage' => $customErrorMessage]);
                } else {
                    $spamHoneypotMethod = false;
                    $submissionErrorMessage[] = Craft::t('You tried the honey, you are robot bear!');
                }
            } else {
                $spamHoneypotMethod = true;
            }
        } else {
            $spamHoneypotMethod = true;
        }
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // NEW FORM MODEL
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        $submissionEntry = new FormBuilder2_EntryModel();
        $submissionEntry->formId = $form->id;
        $submissionEntry->title = $form->name;
        $submissionEntry->submission = $submissionData;
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // FAILED SUBMISSION REDIRECT W/MESSAGES (Spam Protection)
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        if ($submissionErrorMessage) {
            craft()->userSession->setFlash('error', $customErrorMessage);
            craft()->urlManager->setRouteVariables(array('errors' => $submissionErrorMessage));
        }
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // VALIDATE SUBMISSION DATA
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        $validation = craft()->formBuilder2_entry->validateEntry($form, $submissionData, $files);
        // if ($validation != '') {
        if (!empty($validation)) {
            if ($ajax) {
                $this->returnJson(['passedValidation' => false, 'validationErrors' => $validation, 'customErrorMessage' => $customErrorMessage]);
            } else {
                craft()->userSession->setFlash('error', $customErrorMessage);
                $passedValidation = false;
                return craft()->urlManager->setRouteVariables(['value' => $submissionData, 'errors' => $validation]);
            }
        }
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // PROCESS SUBMISSION ENTRY
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        if (!$submissionErrorMessage && $passedValidation && $spamTimedMethod && $spamHoneypotMethod) {
            // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // FILE UPLOADS
            // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            $fileIds = [];
            $fileCollection = [];
            $tempPath = [];
            if ($files) {
                foreach ($files as $key => $file) {
                    $tempPath = AssetsHelper::getTempFilePath($file['filename']);
                    move_uploaded_file($file['location'], $tempPath);
                    $response = craft()->assets->insertFileByLocalPath($tempPath, $file['filename'], $file['folderId'], AssetConflictResolution::KeepBoth);
                    $fileIds[] = $response->getDataItem('fileId');
                    $fileCollection[] = ['tempPath' => $tempPath, 'filename' => $file['filename'], 'type' => $file['type']];
                }
                $submissionEntry->files = $fileIds;
            }
            $submissionResponseId = craft()->formBuilder2_entry->processSubmissionEntry($submissionEntry);
            if ($submissionResponseId) {
                // Notify Admin of Submission
                if (isset($notificationSettings['notifySubmission'])) {
                    if ($notificationSettings['notifySubmission'] == '1') {
                        $this->notifyAdminOfSubmission($submissionResponseId, $fileCollection, $form);
                    }
                }
                // Notify Submitter of Submission
                if (isset($notificationSettings['notifySubmitter'])) {
                    if ($notificationSettings['notifySubmitter'] == '1') {
                        $this->notifySubmitterOfSubmission($submissionResponseId, $form);
                    }
                }
                foreach ($fileCollection as $file) {
                    IOHelper::deleteFile($file['tempPath'], true);
                }
                // Successful Submission Messages
                if ($ajax) {
                    $this->returnJson(['success' => true, 'customSuccessMessage' => $customSuccessMessage]);
                } else {
                    craft()->userSession->setFlash('success', $customSuccessMessage);
                    $cookie = new HttpCookie('formBuilder2SubmissionId', $submissionEntry->attributes['id']);
                    craft()->request->getCookies()->add($cookie->name, $cookie);
                    $this->redirectToPostedUrl();
                }
            } else {
                // Submission Error Messages
                if ($ajax) {
                    $this->returnJson(['error' => true, 'customErrorMessage' => $customErrorMessage]);
                } else {
                    craft()->userSession->setFlash('error', $customErrorMessage);
                    return craft()->urlManager->setRouteVariables(['value' => $submissionData, 'errors' => $validation]);
                }
            }
        }
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    }