diff --git a/src/extensions/UserDefinedFormControllerExtension.php b/src/extensions/UserDefinedFormControllerExtension.php index ec4045b..11e54f5 100644 --- a/src/extensions/UserDefinedFormControllerExtension.php +++ b/src/extensions/UserDefinedFormControllerExtension.php @@ -2,6 +2,7 @@ namespace Firesphere\PartialUserforms\Extensions; +use Firesphere\PartialUserforms\Controllers\PartialSubmissionController; use Firesphere\PartialUserforms\Models\PartialFormSubmission; use SilverStripe\Core\Extension; use SilverStripe\UserForms\Control\UserDefinedFormController; @@ -24,6 +25,28 @@ class UserDefinedFormControllerExtension extends Extension */ public function onBeforeInit() { + /** @var UserDefinedFormController $owner */ + $owner = $this->owner; + $url = $owner->getRequest()->getURL(); + // Start a clean session if the user visits the original form + // This should never run on the 'partial' or 'ping' URL + if (strpos($url, 'partial') !== 0 && !strpos($url, 'ping')) { + $startNew = true; + $session = $owner->getRequest()->getSession(); + $id = $session->get(PartialSubmissionController::SESSION_KEY); + // Check if there is an existing partial submission + $existing = PartialFormSubmission::get()->byID((int)$id); + if ($existing) { + // Check if it has started yet, we need to start a new one, if it has started + $startNew = $existing->isStarted(); + } + + if ($startNew) { + $partialForm = PartialFormSubmission::create()->write(); + $session->set(PartialSubmissionController::SESSION_KEY, $partialForm); + } + } + Requirements::javascript('firesphere/partialuserforms:client/dist/main.js'); } } diff --git a/src/models/PartialFormSubmission.php b/src/models/PartialFormSubmission.php index a7503d5..e0b6a62 100644 --- a/src/models/PartialFormSubmission.php +++ b/src/models/PartialFormSubmission.php @@ -114,6 +114,20 @@ public function getCMSFields() return $fields; } + /** + * Check if this partial form already has entries + * Used to check if a new form needs to start + * @return bool + */ + public function isStarted() + { + return ($this->PartialFields()->count() > 0 || $this->PartialUploads()->count() > 0); + } + + /** + * Return this related Form (Elemental or UserDefinedForm + * @return DataObject + */ public function getParent() { return $this->UserDefinedForm();