我制作了一個搜索表單,其中存在多個物體。我想保留最后輸入的值,以便當用戶回傳表單時,他會檢索他的最后選擇。
通過嘗試這樣做,我發現自己出現以下錯誤:
Entity of type "App\Entity\BigCity" passed to the choice field must be managed. Maybe you forget to persist it in the entity manager?
當我看到這個錯誤時,我添加了以下行:$entityManagerInterface->persist($data); 但我用另一個錯誤找回自己:
EntityManager#persist() expects parameter 1 to be an entity object, array given.
我應該怎么做才能避免這些錯誤?
事件控制器.php
<?php
namespace App\Controller;
use App\Form\SearchType;
use App\Repository\EventsRepository;
use App\Repository\CategoriesRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class EventsController extends AbstractController
{
private $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
#[Route('/search', name: 'search')]
public function search(Request $request, EntityManagerInterface $entityManagerInterface,)
{
$data = $request->query->all();
$sessionFormData = $sessionInterface->get('data');
$form = $this->createForm(SearchType::class, $sessionFormData);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$session->set('data', $data);
return $this->render('front/events.html.twig', $data);
}
return $this->renderForm('front/search.html.twig', [
'form' => $form
]);
}
搜索型別.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
]);
}
}
uj5u.com熱心網友回復:
如果要在會話中保存值,可以使用 SessionInterface,然后在 createForm 方法的選項中傳遞會話值
use Symfony\Component\HttpFoundation\Session\SessionInterface;
public function someAction(Request $request, SessionInterface $session)
{
$data = $request->request->all();
$sessionSearchFormData = $session->get('searchFormData'); // null at the first time
$form = $this->createForm(SearchType::class, null, ['sessionSearchFormData'=> $sessionSearchFormData]);
$form->handleRequest($request);
if($form->isSubmitted())
{
// put values of form in session just after each time the form is submitted
$session->set('searchFormData', $data);
}
}
use Doctrine\ORM\EntityManagerInterface;
class SearchType extends AbstractType
{
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$bigcity = $options['sessionSearchFormData'] !== null ? $options['sessionSearchFormData']['bigcity'] : '';
$builder
->add('bigcity', EntityType::class, [
'class' => BigCity::class,
'choice_label' => 'name',
'placeholder' => 'Sélectionne une grande ville',
'data'=> $bigcity !== null ? $this->entityManager->getRepository(BigCity::class)->find($bigcity) : ''
])
->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,
'sessionSearchFormData' => null, // don't forget this
]);
}
編輯:
這是另一種解決方案,您無需在 formType 中執行任何操作,也無需將任何值作為選項傳遞,只需洗掉 $form->handleRequest 并添加 $form->submit()
在樹枝上
<form action="{{ path('events_index' }}" method="get">
控制器
public function search(Request $request, SessionInterface $session)
{
$sessionSearchFormData = $session->get('searchFormData');
// perhaps you should test if $sessionSearchFormData is null or not
$form = $this->createForm(SearchType::class);
$form->submit($sessionSearchFormData);
return $this->renderForm('front/search.html.twig', [
'form' => $form
]);
}
public function events(Request $request, SessionInterface $session)
{
$data = $request->query->all(); // if GET method
// if the user comes from search page, so we set the session searchFormData with submitted data
if(some logic to check if previous page is search form) {
$session->set('searchFormData', $data);
}
$events = your query to filter events using $data
return $this->renderForm('front/events.html.twig', [
'events' => $events
]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510397.html
標籤:形式交响乐会议会话变量
上一篇:上傳檔案并在表單中預填url
