添加属性以使窗体小部件无效

时间:2013-04-29 09:43:09

标签: php symfony twig

我正在尝试将所选属性添加到我的<option>代码

{% for product in form.products %}
   {# of course this should only done inside a if, 
      but for testing purpose, it's okay #}

   {{ form_widget(product, { 'attr': {'selected': 'selected'} }) }}

{% endfor %}

然而,这不起作用。即使是symfony2文档中完全相同的副本和粘贴也不起作用:http://symfony.com/doc/current/book/forms.html#rendering-each-field-by-hand

我在FormTypeàla:

中添加了表单元素
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)都可以。

有问题吗?

我正在使用Symfony 2.1.9-dev。

2 个答案:

答案 0 :(得分:0)

您可以使用表单创建代码更新问题吗?我很确定Symfony只有在中选择了项才能在模型中出现。但是,由于您的字段标有property_path => false,我认为您不能覆盖此行为......

一个想法:

  • 获取实体字段类型中使用的所有数据,并将其传递给表单对象(通过构造函数或选项数组)
  • 正在进行添加字段
  • 之后立即调用setData以设置字段数据(使用在步骤#1中获取的数据)
不过,我不是setData的忠实粉丝,但是这样的情况只是要求它:)

希望这有助于......

答案 1 :(得分:0)

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

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'
    ));
}
  1. 不要对表单类型使用类继承(当然除了扩展AbstractType)。请使用getParent()来扩展其他类型。
  2. 您无法手动设置<option>标记的属性。你必须手工渲染标签。
  3. 要将选项标记为已选择,您需要将默认数据传递到该字段。通常会在此处调用getProducts()来获取默认值,但您通过将property_path设置为false来禁用此功能。因此,您应该使用data选项手动设置默认值。请注意,默认值必须是数组/集合,因为multipletrue
  4. 您手动传递choices,这是一种不好的做法。如果您只是删除此选项,实体字段本身可以查询数据库中的选项并优化所需的语句以获得更好的性能。
  5. 格式化代码。真。 :P