craue / CraueFormFlowBundle

Multi-step forms for your Symfony project.
MIT License
736 stars 118 forks source link

Step rendering with Hotwired/Turbo #405

Open akincer opened 2 years ago

akincer commented 2 years ago

I've already solved this but wanted to point out to anyone using Hotwired/Turbo that step rendering is broken unless you send a 422 status. You can do something like this:

`if ($this->flow->getStepCount() === $this->flow->getCurrentStepNumber() && $form->isSubmitted() && $form->isValid()) { $statusCode = 200; // The last step has been executed so redirect or whatever you want here } else { $statusCode = 422; }

return $this->renderForm('your template', [ 'form' => $form, 'flow' => $this->flow, ], new Response(null, $statusCode));`

mpiot commented 1 year ago

If needed, here is a custom AbstractController to add a renderFlow() method:

/**
 * @method User getUser()
 */
abstract class AbstractController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
{
    /**
     * Renders a view and sets the appropriate status code when a flow is listed in parameters.
     */
    protected function renderFlow(string $view, array $parameters = [], Response $response = null): Response
    {
        $response = $this->renderForm($view, $parameters, $response);

        foreach ($parameters as $v) {
            if (!$v instanceof FormFlowInterface) {
                continue;
            }

            if (200 === $response->getStatusCode() && $v->getStepsDoneCount() >= 1) {
                $response->setStatusCode(422);
            }
        }

        return $response;
    }
}
lukepass commented 1 year ago

Thanks @mpiot that solved the problem perfectly!