Php 将属性添加到表单小部件不起作用

Php 将属性添加到表单小部件不起作用,php,symfony,twig,Php,Symfony,Twig,我正在尝试将所选属性添加到标记中 然而,这不起作用。即使是与symfony2文档完全相同的复制和粘贴,也不起作用: 我在FormTypeála中添加form元素: public function buildForm(FormBuilderInterface $builder, array $options) { parent::buildForm($builder, $options); $builder ->add('products',

我正在尝试将所选属性添加到标记中

然而,这不起作用。即使是与symfony2文档完全相同的复制和粘贴,也不起作用:

我在FormTypeála中添加form元素:

public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);
        $builder
        ->add('products', 'entity', array('attr' => array('class' => 'choseable input-xlarge'), 
              'property_path' => false, 'label' => 'form.products.title', 'class' => 'Test\Bundle\Entity\Product', 'choices' => $products, 'multiple' => true, 'empty_value' => 'form.products.placeholder'));
}
在上面的示例中,所有变量$products都是ok

有什么问题吗


我正在使用Symfony 2.1.9-dev.

您能用表单创建代码更新问题吗?我非常确定,Symfony只有在您的模型中存在的情况下才能选择该项目。但由于您的字段被标记为property_path=>false,我认为您不能重写此行为

一个想法:

获取实体字段类型中使用的所有数据,并通过构造函数或选项数组将其传递给form对象 按当前操作添加字段 随后调用setData,使用步骤1中获取的数据设置字段数据 顺便说一句,我不是setData的忠实粉丝,但像这样的情况需要它:


希望这有助于…

您的代码存在一些问题。为了更清晰,我重新格式化了下面的代码

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

    $builder->add('products', 'entity', array(
        'attr' => array('class' => 'choseable input-xlarge'), 
        'property_path' => false,
        'label' => 'form.products.title',
        'class' => 'Test\Bundle\Entity\Product',
        'choices' => $products,
        'multiple' => true,
        'empty_value' => 'form.products.placeholder'
    ));
}
除了扩展AbstractType之外,不要对表单类型使用类继承。改为使用getParent扩展其他类型。 不能手动设置标记的属性。您必须手动渲染标记。 要将选项标记为选中,需要将默认数据传递给字段。通常会在此处调用getProducts以获取默认值,但您通过将属性_path设置为false禁用了该功能。因此,您应该使用数据选项手动设置默认值。请注意,默认值必须是数组/a集合,因为multiple为true。 您正在手动传递选项,这是一种糟糕的做法。如果删除此选项,实体字段本身可以查询数据库中的选项,并优化所需的语句以获得更好的性能。 格式化你的代码。真的吗P
我想,这是因为产品是一个子ROM,而不是一个小部件。请检查我的编辑。没关系。。之后我会用表单creatiom代码更新这个问题。我知道了,我是移动电话。您是否尝试过设置除“选定”之外的任何其他属性?这样我们就可以确定这个问题是否是属性特定的…很抱歉,您是对的,属性路径是假还是真很重要。。。而“attr”并不重要。它可能是类,也可能是选定的,或者其他什么。总之,我通过传递一个包含选定实体的数组来尝试您的答案。并在$builder->add.之后立即执行。。$builder->setDataarray'selected'=>$selectedProducts;但我得到一个警告,数据的形式不同。实际上表单还有另一个data_类,$products只是表单的一部分。我怎样才能避免呢?今晚晚些时候我会试着写一些测试,并将其发布在这里。目前,我有点困惑,到底出了什么问题;你能用setData给我解释一下第三点吗。如果我尝试这样做:$builder->get'products->setData$selectedProducts;我得到一个例外,$selectedProducts是数组而不是集合类型。。。如何手动设置数据?谢谢你的回答,但是你的回答对我没有多大帮助。。
public function buildForm(FormBuilderInterface $builder, array $options) {
    parent::buildForm($builder, $options);

    $builder->add('products', 'entity', array(
        'attr' => array('class' => 'choseable input-xlarge'), 
        'property_path' => false,
        'label' => 'form.products.title',
        'class' => 'Test\Bundle\Entity\Product',
        'choices' => $products,
        'multiple' => true,
        'empty_value' => 'form.products.placeholder'
    ));
}