如何使用Symfony为表单中的每个字段设置值



我制作了一个搜索表单,可以选择"bigcity"one_answers"category"。在SearchController.php中,我设置了一个会话,以便在返回搜索页面时检索所选的值。我试图在search.html.twig.中编写的{{ form(form) }}中设置这些值

它适用于"bigcity",但不适用于"category"。哪里会出错?

search.html.trick

{% extends 'base.html.twig' %}
{% 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('searchFormData').bigcity.id} ) }}
<p>Quel type de sortie ou d’activité t’intéresse ?</p>
{{ form_widget(form.category, {'attr' : {'class' : 'mb-3' }, 'value' : app.session.get('searchFormData').category.id} ) }}
{{ form_widget(form.save, {'label': 'Je valide'} ) }}
{{ form_end(form) }}
{% endblock %}

**SearchController.php**

<?php
namespace AppControllerFront;
use AppFormSearchType;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyComponentHttpFoundationSessionSessionInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
class SearchController extends AbstractController
{
#[Route('/search', name: 'search')]
public function search(
Request $request, 
SessionInterface $sessionInterface,
EventRepository $eventRepository,
){   
$searchFormData  = $sessionInterface->get('searchFormData');
$form = $this->createForm(SearchType::class, ['data' => $searchFormData]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$sessionInterface->set('searchFormData', $data);
$events = $eventRepository->findAll();

return $this->redirectToRoute("events", [
'bigcity'=> $form->get('bigcity')->getData()->getId(), 
'category'=> $form->get('category')->getData()->getId(), 
'events' => $events
]);
}
return $this->renderForm('front/search.html.twig', [ 
'form' => $form,
]);
}
}

SearchType.php

<?php
namespace AppForm;
use AppEntityBigCity;
use AppEntityCategory;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyBridgeDoctrineFormTypeEntityType;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentFormExtensionCoreTypeSubmitType;
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' => Category::class,
'choice_label' => 'image',
'expanded' => true,
'multiple' => false,
])
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null
]);
}
}

这是因为在SearchType类别中已"展开"=>没错,这就是为什么它适用于bigcity,但不适用于catgory。你能做的是这样的事情:

{{ form_label(form.category) }}
{% for key, categoryItem in form.category.children %}
{{ form_widget(categoryItem, {'attr' : {'class' : 'mb-3' },  'checked': categoryItem.vars.value ==  app.session.get('searchFormData').category.id ? 'checked' : ''  } ) }}
{% endfor %}

最新更新