Bestätigungstext für eigenes Formular

Hallo,
ich habe ein spezielles Kontaktformular als cms-Element angelegt:

{% block sw_cms_form_sfv %}
    <form action="{{ path('frontend.form.send') }}"
        	method="post"
            data-form-csrf-handler="true"
            data-form-validation="true">
    
    ... einige Felder und submit-button ...
    
    </form>
{% endblock %}

Es wird (wie beim SW6-Kontaktformular) nach betätigen des Submit-Buttons die Controllermethode handleSubmit aufgerufen:


<?php declare(strict_types=1);

namespace ZepanForm\Storefront\Controller;

use Shopware\Storefront\Controller\StorefrontController;
...
use ZepanForm\Service\EmailService;



/**
 * @Route(defaults={"_routeScope"={"storefront"}})
 */
class SfvFormController extends StorefrontController
{
    
    
    private EntityRepositoryInterface $cmsSlotRepository;
    
    /**
     * @internal
     */
    public function __construct(
        EntityRepositoryInterface $cmsSlotRepository,
        EmailService $emailService
        ) {
            $this->cmsSlotRepository = $cmsSlotRepository;
            $this->emailService = $emailService;
    }
    
    /**
     * @Since("6.1.0.0")
     * @Route("/form", name="frontend.form.send", methods={"POST"}, defaults={"XmlHttpRequest"=true, "_captcha"=true})
     */
    public function  handleSubmit(Request $request, SalesChannelContext $context): JsonResponse
    {
        ... 
        Versand der Formulardaten als Email
        ...
        
        $message = $this->trans('contact.success');
         $response[] = [
             'type' => 'success',
             'alert' => $message,
         ];
         return new JsonResponse($response);
    }
}

Hier gibt handleSubmit (wie sendContactForm im SW6 FormController) ein JsonResponse zurück.
Nur wird nach dem Abschicken beim SW6-Formular der $message-String an Stelle des Formulars im Frontend angezeigt und meine Methode gibt eine Browser-Ausgabe wie:

[{„type“:„success“,„alert“:„We have received your contact request and will process it as soon as possible.“}]

Woran liegt das und wie kann ich den $message-String an der Stelle des Formulars anzeigen lassen?

Grüße
Marc

Hallo Marc,

das return geht an den Browser zurück, deswegen gibt’s hier JSON weil es ist eine JsonResponse.

Du könntest stattdessen z.B. einen Flash-Text anzeigen und auf die Formularseite zurück verweisen.

$this->addFlash(self::SUCCESS, $this->trans('contact.success'));
return $this->redirectToRoute('frontend.form'); // Route anpassen auf deine Formular-Seite?

Oder gleich auf eine extra Seite (Landing-Page?) verweisen. Direkt auf URL geht z.B. so:

$url = $this->generateUrl('frontend.home.page', [], UrlGeneratorInterface::ABSOLUTE_URL) . 'meine-seite';
return $this->redirect($url);

Vielen Dank, Das funktioniert schonmal schön.

Noch eine Frage für die erste Möglichkeit:

Da mein Formular ein CMS-Element ist und an verschiedenen Stellen im Frontend eingesetzt werden kann, würde ich die Route gerne im Controller automatisch auf die entsprechende Formularseite setzten. Ein {{ dump() }} auf der Formularseite gibt mir je nach Seite im Frontend natürlich einen anderen Wert für activeRoute. Wie komme ich nun an die entsprechende Route in der Controllermethode?

Viele Grüße
Marc

Wie komme ich nun an die entsprechende Route in der Controllermethode?

Das müsste z.B. so gehen:

return $this->redirectToRoute($request->attributes->get('_route'));

Da baut Shopware auf Symfony auf:
Controller (Symfony Docs)
Routing (Symfony Docs)

Leider hat

return $this->redirectToRoute($request->attributes->get(‚_route‘));

nur eine MethodNotAllowedHttpException ausgelöst.
Lösen lies sich das Problem dann mit

$data = $request->request->all();
return $this->redirectToRoute('frontend.navigation.page', ['navigationId' => $data['navigationId']]);

Trotzdem Vielen Dank nochmal!
Viele Grüße
Marc

1 „Gefällt mir“