Chris
Chris

Reputation: 262

Silverstripe - FormSchema with submissions and validation

I'm trying to make use of the new FormSchema class in Silverstripe 4 but I'm having a tough time with the workflow for submitting the form. I've been able to return the schema and state, but when submitting the form back to the controller is where I run in to issues. Here is some example code:

class TestController extends Controller {

    private static $allowed_actions = [
        'schema',
        'TestForm'    
    ];

    public function schema(HTTPRequest $request) {
        $schema = new FormSchema();
        return json_encode($schema->getMultipartSchema(['schema', 'state', 'errors'], "FormID", $this->TestForm()));
    }

    public function TestForm() {

        $fields = FieldList::create(
            TextField::create('Name', 'Name'),
            EmailField::create('Email', 'Email')
        );

        $actions = FieldList::create(
            FormAction::create('doTestSubmit', 'Submit')
        );

        $required = RequiredFields::create(['Name', 'Email']);

        return Form::create($this, 'TestForm', $fields, $actions, $required);

    }

    public function doTestSubmit($data, $form) {
        return json_encode(array('response' => 'The form validated and was submitted.'));
    }

}

So in this scenario hitting /schema returns TestForm schema in json then the front end renders the form. Submitting the form sends the data back to /TestForm where it is validated. If the submission is valid it'll continue to doTestSubmit and return the response. That's great! But, if the submission is not valid then TestForm attempts to return the form and not the schema with the validation messages.

I first though about using a condition in TestForm() like if($this->request->isPOST()) or if($form->validationResult()->isValid()) but it doesn't seem like the proper way to handle it.

Any input or a simple code sample would be great.

Upvotes: 1

Views: 168

Answers (1)

Andy Adiwidjaja
Andy Adiwidjaja

Reputation: 131

I think you cannot use the standard Form > Form Post > Form Action way, you have to create an own Form Handler that validates the form. Like this (untested code):

public function doTestSubmit($request) {
    $form = $this->TestForm()
    $form->loadDataFrom($request->postVars);
    if(!$form->validationResult()->isValid()) {
        $formSchema = new FormSchema();
        $state = $formSchema->getState($form);
        return json_encode($state);
    }
    //Valid, continue
}

Upvotes: 0

Related Questions