параметр ввода symfony4 в форме - PullRequest
0 голосов
/ 03 января 2019

У меня есть Business Entity и BusinessObject Entity, и я хотел бы связать BusinessObject с текущим Business, когда я создаю новый BusinessObject. Например, если мой маршрут business/{id}/object/new, я бы хотел, чтобы объект был связан с бизнесом (благодаря идентификатору).

В моем контроллере BusinessObject мне удалось использовать @ParamConverter для получения бизнес-идентификатора. В моей форме BusinessObject я добавил HiddenType в свою бизнес-запись, потому что я не хочу, чтобы она появлялась, и установил data для business_ID. Я борюсь в configureOptions, чтобы получить бизнес-идентификатор, я не могу понять, как получить бизнес-идентификатор отсюда.

Контроллер BusinessObject (новый маршрут) :

/**
 * @Route("/{post_id}/new", name="business_object_new", methods="GET|POST")
 * @ParamConverter("business", options={"id" = "post_id"})
 */
public function new(Request $request,Business $business): Response
{
    $businessObject = new BusinessObject();

    $businessID = $business->getId();

    $form = $this->createForm(BusinessObjectType::class, $businessObject,array(
        'business_ID'=>$businessID,
    ));
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($businessObject);
        $em->flush();

        return $this->redirectToRoute('business_object_index');
    }

    return $this->render('business_object/new.html.twig', [
        'business_object' => $businessObject,
        'business'=>$business,
        'form' => $form->createView(),
    ]);
}

BusinessObjectType

class BusinessObjectType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
        ->add('object',TextType::class)
        ->add('complement')
        ->add('status')
        ->add('durationExpected')
        ->add('durationAchieved')
        ->add('client')
        ->add('projectManager')
        ->add('business',HiddenType::class,array(
            'data' => $options['business_ID']

        ))
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => BusinessObject::class,
        'business_ID'=>Business::class
    ]);
}
}

С помощью этого кода я получаю сообщение об ошибке Expected argument of type "App\Entity\Business or null", "string" given. Я думаю, что это как-то связано с функцией configureOptions () в моей форме

1 Ответ

0 голосов
/ 03 января 2019

Подход может быть:

public function new(Request $request,Business $business): Response
{
    $businessObject = new BusinessObject();

    $form = $this->createForm(BusinessObjectType::class, $businessObject);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        // I suppose your setter is `setBusiness`, otherwise use more suitable one
        $businessObject->setBusiness($business);
        $em = $this->getDoctrine()->getManager();
        $em->persist($businessObject);
        $em->flush();

Форма конструктора:

builder
    ->add('object',TextType::class)
    ->add('complement')
    ->add('status')
    ->add('durationExpected')
    ->add('durationAchieved')
    ->add('client')
    ->add('projectManager');   // No business field

Другим вариантом является вставка BusinessType формы в BusinessObjectType, вы можете узнать больше о вложении формы здесь .

...