Symfony2表单即时添加新实体

时间:2013-08-20 13:29:35

标签: php forms symfony symfony-forms symfony-2.3

我有3个实体。 CustomersProductsPurchases

应该可以通过单击“添加另一个购买”按钮添加新的购买表单。每次购买都是DB中的一个单独行。

我尝试过使用一个集合来为客户填写/添加必要数量的表单以供现有购买,但我不知道如何使用按钮添加其他购买表单。此外,在添加新客户时,不会显示任何购买表单。

我已经坚持了好几天!请帮助

创建如下表单的最佳方法是什么:

添加/编辑新客户

客户信息

名字
姓氏
电子邮件

购买[添加另一个购买按钮]

  1. 选择产品(按用户服务从产品实体检索到的下拉菜单) - 输入数量
  2. 选择产品(按用户服务从产品实体检索到的下拉菜单) - 输入数量
  3. 选择产品(按用户服务从Products实体检索的下拉列表) - 输入数量
  4. [添加另一个购买按钮]


    CustomersType类

    class CustomersType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('first_name')
                ->add('last_name')
                ->add('email')
                ->add('purchases', 'collection', array(
                    'type'   => new PurchasesType(),
                    'allow_add' => true,
                    ))
            ;
        }
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'My\Bundle\MyBundle\Entity\Customers',
            ));
        }
    
        public function getName()
        {
            return 'customers';
        }
    }
    


    PurchasesType类

    class PurchasesType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('products', 'entity', array(
                    'class'         => 'My\Bundle\MyBundle\Entity\Products',
                    'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); }
                ))
                ->add('quantity')
            ;
        }
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'My\Bundle\MyBundle\Entity\Purchases',
            ));
        }
    
        public function getName()
        {
            return 'purchases';
        }
    }
    


    客户类

    class Customers
    {
        /** 
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /** 
         * @ORM\Column(type="string")
         */
        private $first_name;
    
        /** 
         * @ORM\Column(type="string")
         */
        private $last_name;
    
        /** 
         * @ORM\Column(type="string")
         */
        private $email;
    
        /** 
         * @ORM\ManyToOne(targetEntity="Users", inversedBy="customers")
         * @ORM\JoinColumn(name="users", referencedColumnName="id")
         */
        private $users;
    
        /** 
         * @ORM\OneToMany(targetEntity="Purchases", mappedBy="customers")
         */
        private $purchases;
    }
    


    产品实体

    class Products
    {
        /** 
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /** 
         * @ORM\Column(type="string")
         */
        private $name;
    
        /**
         * @ORM\Column(type="decimal", precision=10, scale=2)
         */
        private $price = 0.0;
    
        /** 
         * @ORM\OneToMany(targetEntity="Purchases", mappedBy="products")
         */
        private $purchases;
    
        /** 
         * @ORM\ManyToOne(targetEntity="Users", inversedBy="products")
         * @ORM\JoinColumn(name="users", referencedColumnName="id")
         */
        private $users;
    }
    


    购买实体

    class Purchases
    {
        /** 
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @ORM\Column(type="decimal", precision=10, scale=2)
         */
        private $price;
    
        /**
         * @ORM\Column(type="integer")
         */
        private $quantity;
    
        /** 
         * @ORM\ManyToOne(targetEntity="Products", inversedBy="purchases")
         * @ORM\JoinColumn(name="products", referencedColumnName="id")
         */
        private $products;
    
        /**
         * @ORM\ManyToOne(targetEntity="Customers", inversedBy="purchases")
         * @ORM\JoinColumn(name="fans", referencedColumnName="id")
         */
        private $customers;
    }
    

1 个答案:

答案 0 :(得分:1)

您是否在官方文档中查看了该示例?

http://symfony.com/doc/master/cookbook/form/form_collections.html

它还有一个关于如何使用javascript添加新表单集合的示例。