Joao Victor Souza
Joao Victor Souza

Reputation: 293

Getting data from array with embed forms - Symfony 4

I have one entity named Order, and other named OrderItens.

In my Order form, I am embedding OrderItens form, and on OrderItens form I am using an EntityType to retrieve Product Objects (that have price, name and other fields).

Right now I am able to submit the form and persist both entities, saving the Order PK as OrderItens FK, as expected. Also I can insert multiple products (I followed the documentation from symfony on embed forms) in the OrderType, creating two or more rows on the same form submit.

But I am having trouble retrieving the price of the Products selected and setting it for each specific Product.

OrderType.php

public function buildForm(FormBuilderInterface $builder, array $options){

    $builder->add('date', TextType::class, ['label' => 'Date:'])
        ->add('orderItem', CollectionType::class, array(
                'entry_type' => OrdenItensType::class,
                'entry_options' => array('label' => false),
                'allow_add' => true,
                'prototype' => true,
                'label' => false
            ))

    ->add('submit', SubmitType::class, ['label' => 'Submit']);
}

OrderItensType.php

public function buildForm(FormBuilderInterface $builder, array $options){

    $builder->add('product', EntityType::class, [
            'class' => Product::class,
            'label' => 'Product:'
        ]);
}

ProductController.php

public function pedidos(Request $request){

    $order = new Order();

    $form = $this->formFactory->create(OrderType::class, $order);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()){

        foreach ($order->getOrderItem() as $itens){
            $product = $form->get('orderItem')->getData()->getProduct()->getPrice();
            $itens->setOrder($order);
            $itens->setPrice($product);
        }

        $this->entityManager->persist($order);
        $this->entityManager->flush();

        $this->flashBag->add('success', 'Order added!');

        return new RedirectResponse($this->router->generate('lancamento_pedidos_index'));
    }

    return new Response(
        $this->twig->render(
            'produto/pedido.html.twig',
            ['form' => $form->createView()]
    )
    );
}

My problem is inside the foreach. I am having trouble retrieving and setting the Price for each product, specifically with the line $product = $form->get('orderItem')->getData()->getProduct()->getPrice();, which returns the error "Attempted to call an undefined method named "getProduct" of class "Doctrine\Common\Collections\ArrayCollection"".

If I explicitly number the array key e.g. like this $product = $form->get('orderItem')->getData()['1']->getProduct()->getPrice() the form submits, but the prices for all the products in the OrderItens will obviously be written as the same price in which belongs to Product['1'].

Any help is appreciated.

Upvotes: 1

Views: 1229

Answers (1)

kallosz
kallosz

Reputation: 531

change

    foreach ($order->getOrderItem() as $itens){
        $product = $form->get('orderItem')->getData()->getProduct()->getPrice();
        $itens->setOrder($order);
        $itens->setPrice($product);
    }

to

foreach ($form->get('orderItem')->getData() as $items){
        $product = $items->getProduct()->getPrice();
        $itens->setOrder($order);
        $itens->setPrice($product);
    }

Upvotes: 1

Related Questions