Обработка форм одного типа - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно создать и обработать несколько форм одной и той же сущности на одной странице.Кроме того, мне нужно иметь отдельные кнопки Submit для каждой из них.

На данный момент в цикле я создал массив форм для каждой сущности, но когда я пытаюсь его обработать - онломается.

Основная проблема в том, что когда я отправляю форму, все выглядит нормально - но продукт ВСЕГДА первый сгенерированный.

Дамп формы дали результат, что онисвязаны с правильным объектом продукта, но после обработки он выходит из строя.

Мой фрагмент кода:

Контроллер:

foreach ($products as $product) {
    $counter = 0;
    $date = $comparativeDate;

    $tempCart = new Cart();
    $tempCart->setProduct($product['product']);
    $tempCart->setUserId($user);
    $tempCart->setQuantity(0);
    $tempCartForm = $this->createForm('AppBundle\Form\CartType',$tempCart, array('kind' => 'myProducts'));
    $tempCartForm->handleRequest($request);

    if($tempCartForm->isSubmitted() && $tempCartForm->isValid())
    {
        $data = $tempCartForm->getData();       
        $query = $em->createQueryBuilder()
          ->select('c','p')
          ->from('AppBundle:Cart','c')
          ->join('c.product','p')
          ->where("p = :product")
          ->andWhere("c.userId = :user")
          ->setParameter('product',$product['product'])
          ->setParameter('user',$user->getId())
          ->getQuery();

        $foundCart = $query->getResult();

        if(is_null($foundCart) || empty($foundCart))
        {
            $em->persist($data);
        }else{

          $foundCart = $foundCart[0];
          $foundCart->setQuantity($foundCart->getQuantity()+$data->getQuantity());
          $em->persist($foundCart);
        }

        $em->flush();

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

    foreach ($products as $secondProduct) {

        if($product['product'] === $secondProduct['product'])
        {
            $counter++;

            if($date<$secondProduct['date'])
            {
                $date = $secondProduct['date'];
            }

            unset($secondProduct);
        }

        $productId = $product['product']->getId();

        //szykujemy tablice z danymi gotowymi do wyswietlenia
        $groupedProducts[$productId]['count']=$counter;
        $groupedProducts[$productId]['product']=$product['product'];
        $groupedProducts[$productId]['last_date']=$date;
        $groupedProducts[$productId]['form_view']=$tempCartForm->createView();
    }
}

Тип корзины:

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

use Symfony\Component\OptionsResolver\OptionsResolver;

class CartType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder->add('quantity', IntegerType::class, [
           'label' => false
         ]);

         if($options['kind']=='myProducts'){
            $builder->add('save', SubmitType::class, [
           'label' => 'SLIJ'
         ])
                     ->add('product', EntityType::class, [
                        'class' => 'AppBundle:Product',
         ]);
         }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Cart',
            'kind'      => null
        ));
    }

}

?>

Поля корзины:

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="carts")
     */
    private $userId;

    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="carts")
     */
    protected $product;

    /**
     * @ORM\Column(type="integer")
     */
    private $quantity;

И форма генерируется в шаблоне в строке для каждой строки groupedProducts.

1 Ответ

0 голосов
/ 31 мая 2018

Основная проблема в том, что когда я отправляю форму, все выглядит нормально - но продукт ВСЕГДА первый сгенерированный.

Если вы отправляете форму,код ниже должен быть выполнен

if($tempCartForm->isSubmitted() && $tempCartForm->isValid())
{
    // code ...
    return $this->redirectToRoute('my_products');
}

Тогда он не достигнет кода, обрабатывающего второй продукт, не так ли?

...