What are the Slack Archives?

It’s a history of our time together in the Slack Community! There’s a ton of knowledge in here, so feel free to search through the archives for a possible answer to your question.

Because this space is not active, you won’t be able to create a new post or comment here. If you have a question or want to start a discussion about something, head over to our categories and pick one to post in! You can always refer back to a post from Slack Archives if needed; just copy the link to use it as a reference..

One question about having a form inside a widget: How would you make the form keep its state after s

U01LKKBK97T
U01LKKBK97T Posts: 287 🧑🏻‍🚀 - Cadet

One question about having a form inside a widget: How would you make the form keep its state after submission? I can't see that this has been solved properly yet.
In vendor/spryker-shop/availability-notification-widget/src/SprykerShop/Yves/AvailabilityNotificationWidget/Controller/AvailabilityNotificationSubscriptionController.php e. g. I can see that it will take the errors out of the form and add them as flash messages.

if ($subscriptionForm->isSubmitted() === false || $subscriptionForm->isValid() === false) {
    $errors = $subscriptionForm->getErrors(true);

    foreach ($errors as $error) {
        $this->addErrorMessage($error->getMessage());
    }
}

Is there anything better than that? I'd rather keep inline form messages to display them along with the corresponding form field.

Comments

  • U01LKKBK97T
    U01LKKBK97T Posts: 287 🧑🏻‍🚀 - Cadet
    edited May 2021

    Just in case that somebody else might stumble upon this...

    I solved it by passing the request to the widget:

    {% widget 'FooWidget' args [app.request] %}{% endwidget %}
    

    Then, inside the widget I can call handleRequest on the form again which will make inline errors reappear.

    /**
     * @param Request $request
     */
    public function __construct(Request $request)
    {
        $this->addParameter('fooForm', $this->getFooForm($request)->createView());
    }
    
    /**
     * @param Request $request
     * @return FormInterface
     */
    protected function getFooForm(Request $request): FormInterface
    {
        return $this->getFactory()
            ->getFooForm()
            ->handleRequest($request);
    }
    
  • U01LKKBK97T
    U01LKKBK97T Posts: 287 🧑🏻‍🚀 - Cadet

    One more addition:
    In your controller you might need to redirect with HTTP status 307.