Я разрабатываю с Symfony 4
В настоящее время у меня есть форма поиска, которая возвращает на другую страницу, на которой мы находим такую же форму (чтобы иметь возможность изменять поиск), и я хотел бы гидрировать вторая форма с данными, заполненными в первой форме, зная, что данные не сохраняются в базе данных.
Моя поисковая форма:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('position', TextType::class, [
'label' => 'object.position',
'required' => false,
])
->add ('city', TextType::class, [
'label' => 'object.city',
'required' => false,
])
->add ('postalCode', TextType::class, [
'label' => 'object.postalCode',
'required' => false,
])
->add('sectors', EntityType::class, [
'placeholder' => 'Selectionnez les secteurs d\'activité',
'class' => Sector::class,
'choice_label' => function($sectors) {
return $sectors->getTitle();
},
'multiple' => true,
'label' => 'object.sector',
'required' => false,
])
->add('professions', EntityType::class, [
'placeholder' => 'Selectionnez les métiers',
'class' => Profession::class,
'choice_label' => function($professions) {
return $professions->getTitle();
},
'multiple' => true,
'label' => 'object.profession',
'required' => false,
])
->add('salary', ChoiceType::class, [
'placeholder' => 'Selectionnez une tranche de salaire minimum',
'choices' => [
'10K€ à 20K€ par an' => 1,
'21K€ à 30K€ par an' => 2,
'31K€ à 40K€ par an' => 3,
'41K€ à 50K€ par an' => 4,
'51K€ à 60K€ par an' => 5,
'> à 60K€ par an' => 6,
],
'label' => 'object.salary',
'required' => false,
])
->add('contracts', EntityType::class, [
'placeholder' => 'Selectionnez les types de contrat',
'class' => Contract::class,
'choice_label' => function($contracts) {
return $contracts->getTitle();
},
'multiple' => true,
'label' => 'object.contract',
'required' => false,
])
->add('experience', ChoiceType::class, [
'placeholder' => 'Selectionnez l\'expérience maximum requise',
'choices' => [
'Etudiant / En formation' => 1,
'Débutant' => 2,
'2 ans et plus' => 3,
'3 ans' => 4,
'4 ans' => 5,
'5 ans et plus' => 6,
],
'label' => 'object.experience',
'required' => false,
])
->add('training', ChoiceType::class, [
'placeholder' => 'Selectionnez le niveau de diplôme maximum requis',
'choices' => [
'Sans diplôme' => 1,
'CAP - BEP' => 2,
'Bac Pro' => 3,
'DUT - BTS - Bac +2' => 4,
'Bac +3' => 5,
'Bac +4 - Bac +5' => 6,
],
'label' => 'object.training',
'required' => false,
])
->add('handicapped', CheckboxType::class, [
'required' => false,
'label' => 'object.handicapped',
])
->add('homeOffice', CheckboxType::class, [
'required' => false,
'label' => 'object.handicapped',
])
->add('checked', CheckboxType::class, [
'required' => false,
'label' => 'object.checked',
])
->add('titleSearch', TextType::class, [
'required' => false,
'label' => 'object.title'
])
;
}
Первый контроллер
public function indexJob(Request $request, Candidate $candidate): Response
{
$jobSearch = new JobSearch();
$formSearch = $this->createForm(JobSearchFormType::class);
$formSearch->handleRequest($request);
if ($formSearch->isSubmitted() && $formSearch->isValid()) {
$data = $formSearch->getData();
$checked = $data->checked;
$_SESSION['data'] = $formSearch->getData();
return $this->redirectToRoute('candidate_job_search', [
'candidate_slug' => $candidate->getSlug()
]);
}
return $this->render('job/index.html.twig', [
'candidate' => $candidate,
'form' => $formSearch->createView(),
]);
}
Мой второй контроллер
public function searchJob(Request $request, Candidate $candidate, JobRepository $jobRepository, PaginatorInterface $paginator): Response
{
$sessionData = $_SESSION['data'];
$jobSearch = new JobSearch();
$formSearch = $this->createForm(JobSearchFormType::class, $sessionData);
$formSearch->handleRequest($request);
if ($formSearch->isSubmitted() && $formSearch->isValid()) {
$data = $formSearch->getData();
$checked = $data->checked;
$_SESSION['data'] = $formSearch->getData();
}
return $this->render('job/search.html.twig', [
'candidate' => $candidate,
'formSearch' => $formSearch->createView(),
'jobs' => $paginator->paginate(
$jobRepository->findBySearchField($sessionData),
$request->query->getInt('page', 1),
10),
]);
}
Мой репозиторий
public function findBySearchField($data): array
{
$queryBuilder = $this->createQueryBuilder('j');
$queryBuilder->innerJoin('j.company', 'c', 'WITH', 'c.isActive = true')
->addSelect('c')
->andWhere('j.isActive = true')
->orderBy('j.postedAt', 'DESC');
$searchTerms = $this->extractSearchTerms($data->position);
if (!empty($data->position)) {
foreach ($searchTerms as $key => $term) {
$queryBuilder
->andWhere('j.position LIKE :p_'.$key)
->setParameter('p_'.$key, '%'.$term.'%')
;
}
}
if (!empty($data->city)) {
$queryBuilder->andWhere('j.city = :cit')
->setParameter(':cit', $data->city);
}
if (!empty($data->postalCode)) {
$queryBuilder->andWhere('j.postalCode = :pos')
->setParameter(':pos', $data->postalCode);
}
if ($data->professions->count() > 0) {
$queryBuilder->innerJoin('j.profession', 'pro')
->addSelect('pro')
->andWhere('pro.id IN (:professionIds)')
->setParameter('professionIds', $data->professions);
}
if ($data->sectors->count() > 0) {
$queryBuilder->innerJoin('j.sector', 'sec')
->addSelect('sec')
->andWhere('sec.id IN (:sectorIds)')
->setParameter('sectorIds', $data->sectors);
}
if ($data->contracts->count() > 0) {
$queryBuilder->innerJoin('j.contract', 'con')
->addSelect('con')
->andWhere('con.id IN (:contractIds)')
->setParameter('contractIds', $data->contracts);
}
if (!empty($data->salary)) {
$queryBuilder->andWhere('j.salary >= :sal')
->setParameter('sal', $data->salary);
}
if (!empty($data->experience)) {
$queryBuilder->andWhere('j.experience = :exp')
->setParameter('exp', $data->experience);
}
if (!empty($data->training)) {
$queryBuilder->andWhere('j.training = :tra')
->setParameter('tra', $data->training);
}
if (!empty($data->homeOffice)) {
$queryBuilder->andWhere('j.homeOffice = :hom')
->setParameter('hom', $data->homeOffice);
}
if (!empty($data->handicapped)) {
$queryBuilder->andWhere('j.handicapped = :han')
->setParameter('han', $data->handicapped);
}
return $queryBuilder
->getQuery()
->getResult();
}
Моя проблема в том, что при запуске поиска появляется ошибка:
Entity of Тип "App \ Entity \ Sector", передаваемый в поле выбора, должен управляться. Может быть, вы забыли сохранить его в менеджере сущностей?
Я пытался найти способ решить эту проблему, но мне не удалось