How to retrieve specific values in my form ? Symfony 6.0.2

Viewed 86

I try to define values in my search form, so that when user comes back to the form, he retrieves previous values he entered. I tried this, but it seems it's not the solution because I don't the results as expected.

How can I retrieve values previously entered in my search form ?

Thank you for your help.

search.html.twig

{% extends 'base.html.twig' %}

{% block title %}Liste des sorties et des activités !{% endblock %}

{% block main %}

{{ form_start(form) }}
    <p>Où souhaites-tu faire une sortie ou une activité ?</p>
    {{ form_widget(form.bigcity, {'attr' : {'class' : 'mb-3'}, 'value' : app.session.get('bigcity.name')} ) }}
    <p>Quel type de sortie ou d’activité t’intéresse ?</p>
    {{ form_widget(form.category, {'attr' : {'class' : 'mb-3'}, 'value' : app.session.get('category.title')} ) }}
    {{ form_widget(form.save, {'label': 'Je valide', 'attr' : {'class' : 'btn'}} ) }}
{{ form_end(form) }}

{% endblock %}

SearchType.php

<?php

namespace App\Form;

use App\Entity\BigCity;
use App\Entity\Categories;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class SearchType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('bigcity', EntityType::class, [
                'class' => BigCity::class,
                'choice_label' => 'name',
                'placeholder' => 'Sélectionne une grande ville',
            ])
            ->add('category', EntityType::class, [
                'class' => Categories::class,
                'choice_label' => 'image',
                'expanded' => true,
                'multiple' => false,
            ])
            ->add('save', SubmitType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => null
        ]);
    }
}

EventsController.php

<?php

namespace App\Controller;

use App\Form\SearchType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class EventsController extends AbstractController
{   
    #[Route('/search', name: 'search')]
    public function search(Request $request, SessionInterface $sessionInterface)
    {   
        $data = $request->query->all();
        $sessionFormData  = $sessionInterface->get('data');

        $form = $this->createForm(SearchType::class, $data);
        $form->handleRequest($request);
        
        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            $sessionInterface->set('data', $data);
            return $this->render('front/events.html.twig', $data);
        }

        return $this->renderForm('front/search.html.twig', [
            'form' => $form
        ]);
    }

enter image description here

2 Answers

can you show the controller code? Otherwise try to use the form in GET and then use the Request object to get the last value entered. Exp:

{{ app.request.query.get('bigcity.name') }}

EDIT By default, a form will be submitted via an HTTP POST request to the same URL under which the form was rendered. Change the method of your form in SearchType.php

//SearchType.php
...
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => null,
            'method' => 'GET'
        ]);
    }

Or in Controller

//EventsController.php
$form = $this->createForm(SearchType::class, $data, ['method' => 'GET']);

Or in your template

//search.html.twig
{{ form_start(form, {'method': 'GET'}) }}

EDIT 2 After changing the submission method, change this

//In template(search.html.twig)
...
app.session.get('bigcity.name')
...

to this

...
app.session.get('data').bigcity.id
...

Need some help?:

You should pass Request object in form entity

public function search(Request $request, SessionInterface $sessionInterface)
{   
    //$data = $request->query->all();
    $sessionFormData  = $sessionInterface->get('data');

    $form = $this->createForm(SearchType::class, $request);
    $form->handleRequest($request);
    
    if ($form->isSubmitted() && $form->isValid()) {
        $data = $form->getData();
        $sessionInterface->set('data', $data);
        return $this->render('front/events.html.twig', $data);
    }

    return $this->renderForm('front/search.html.twig', [
        'form' => $form
    ]);
}

And in twig file just mention fields

{{ form_start(form) }}
    <p>Où souhaites-tu faire une sortie ou une activité ?</p>
    {{ form_widget(form.bigcity, {'attr' : {'class' : 'mb-3'}} ) }}
    <p>Quel type de sortie ou d’activité t’intéresse ?</p>
    {{ form_widget(form.category, {'attr' : {'class' : 'mb-3'}} ) }}
    {{ form_widget(form.save, {'label': 'Je valide', 'attr' : {'class' : 'btn'}} ) }}
{{ form_end(form) }}
Related