Symfony: Как гидрировать форму с данными другой, не будучи сохраненной в базе данных - PullRequest
0 голосов
/ 31 января 2020

Я разрабатываю с 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", передаваемый в поле выбора, должен управляться. Может быть, вы забыли сохранить его в менеджере сущностей?

Я пытался найти способ решить эту проблему, но мне не удалось

...