加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

表单 – Symfony2表单生成器选择跨元素的连接表

发布时间:2020-12-14 16:46:02 所属栏目:资源 来源:网络整理
导读:我有3个实体: [Member] ----OneToMany---- [MemberCategory] ---ManyToOne--- [Category] 这对于从数据库中获取结果很有效,但是我无法让Form Builder构建正确的表单控件. 我想要一个包含复选框的所有类别的列表,这些复选框会针对成员使用的类别进行检查.最
我有3个实体:
[Member] ----OneToMany----> [MemberCategory] ---ManyToOne---> [Category]

这对于从数据库中获取结果很有效,但是我无法让Form Builder构建正确的表单控件.

我想要一个包含复选框的所有类别的列表,这些复选框会针对成员使用的类别进行检查.最终我想添加优先级字段.

会员

class Member
{
    protected $id;

    @ORMOneToMany(targetEntity="MemberCategory",mappedBy="member")
    protected $categories;
}

类别

class Category
{
    protected $id;

    @ORMColumn(name="category_name",type="string",length=50,nullable=false,unique=true)
    private $categoryName;
}

MemberCategory

class MemberCategory
{
    @ORMId
    @ORMManyToOne(targetEntity="Member")
    @ORMJoinColumns({
    @ORMJoinColumn(name="member_id",referencedColumnName="id",onDelete="CASCADE")
    private $member;

    @ORMId
    @ORMManyToOne(targetEntity="Category")
    @ORMJoinColumns({
    @ORMJoinColumn(name="category_id",onDelete="CASCADE")
    private $category;

    @ORMColumn(name="priority",type="integer",nullable=true)
    protected $priority;
}

使用表单生成器的明显尝试不起作用.

如果我使用:

$builder->add('categories','entity',array(
    'class'        => 'SMWMemberBundle:Category','property'     => 'categoryName','multiple'     => true,'expanded'     => true,'required'     => false
));

我得到一个包含所有类别的选择,但没有在MemberCategory中为此成员选择的类别.

如果我使用:

$builder->add('categories',array(
    'class'        => 'SMWMemberBundle:MemberCategory','property'     => 'category.categoryName','required'     => false
));

我为所有用户选择了所有选定的类别.

有谁知道如何使它工作,这是关系数据中一个明显的常见模式,使用SQL和PHP很容易.

在Symfony 2.3和Doctrine中有直接的解决方案吗?

解决方法

这就是我过去解决这个问题的方法(适用于你的例子),但这是我想出来的,所以它可能不是100%适合你的情况.

首先创建一个符合您需求的MemberCategory表单类型:

<?php    
namespace CompanyYourBundleFormType;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;

class MemberCategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ->add('priority')
            ->add('category',array('property' => 'name','class' => 'CompanyYourBundle:Category'))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'CompanyYourBundleEntityMemberCategory'
        ));
    }

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

然后在您的会员类型表单中添加此表单类型:

<?php

namespace CompanyYourBundleFormType;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;

class MemberType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ->add('name')
            ->add('members','collection',array(
                'type' => new MemberCategoryType(),'allow_add' => true,'allow_delete' => true,'by_reference' => false,));
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'CompanyYourBundleEntityMember'
        ));
    }

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

然后,您可以按照the documentation为您的成员添加任意数量的类别,并每次分配优先级.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读