IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Symfony 3: allow_delete ve formuláři neodebírá entity

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:11.12.2016 12:08

V Symfony 3.2.0 s Doctrine 2 mám spojení 1:m:1. Jde o objednávky (Order) a jejich produkty (Product) se spojovací entitou (OrderProduct), která udržuje množství. Mám z toho vytvořený formulář, který obsahuje Collection těch OrderProduct. Je to všechno víceméně dle dokumentace.

Ve formuláři je tlačítko pro přidání produktu/podfor­muláře (dle dokumentace, přidá do DOM) a odebrání produktu/podfor­muláře (dle dokumentace, odebere z DOM). V samotném formuláři/stránce to funguje - přidává a odebírá z DOM.

Přidávání položek funguje bez problému - jak u nové objednávky, tak editace existující. Ovšem odebírání nefunguje. Podformulář je odebrán z DOM, ovšem v $editForm->getData(); jsou stále i odebrané položky.

Netuší někdo? Nesetkali jste se s tím?

OrderProductType

<?php
// src/AppBundle/Form/OrderProductType.php

namespace AppBundle\Form;

use AppBundle\Entity\ProductType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class OrderProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('amount')
            ->add('product')
        ;
    }

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

    public function getName()
    {
        return 'app_bundle_order_product_type';
    }
}

OrderType

<?php
// src/AppBundle/Form/OrderType.php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class OrderType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('customer')
            ->add('date', null, array('widget' => 'single_text'))
            ->add('payment', null, array('widget' => 'single_text'))
            ->add('processed', null, array('widget' => 'single_text'))
            ->add(
                'orderProducts',
                CollectionType::class,
                array(
                    'entry_type'    => OrderProductType::class,
                    'allow_add'     => true,
                    'allow_delete'  => true,
                    'by_reference'  => false,
                    'prototype'     => true,
                    'delete_empty'  => true,
                    'entry_options' => array('data_class' => 'AppBundle\Entity\OrderProduct'),
                )
            );

    }

    public function configureOptions(OptionsResolver $resolver)
    {
    }

    public function getName()
    {
        return 'app_bundle_order_type';
    }

}
Editováno 11.12.2016 12:10
Odpovědět
11.12.2016 12:08
Kuba je ajťák. Buď jako Kuba.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.