1

我正在尝试将选定的属性添加到我的<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。

4

2 回答 2

0

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

一个主意:

  • 获取实体字段类型中使用的所有数据并将其传递给表单对象(通过构造函数或选项数组)
  • 按照您当前的操作添加字段
  • 之后立即调用 setData 以设置字段数据(使用在步骤 #1 中获取的数据)

顺便说一句,我不是很setData喜欢,但这样的情况只是需要它:)

希望这会有所帮助...

于 2013-04-29T10:09:34.010 回答
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选项手动设置默认值。请注意,默认值必须是数组/集合,因为multipleis true
  4. 您正在手动传递choices,这是一种不好的做法。如果您只是删除此选项,实体字段本身可以从数据库中查询选择并优化所需的语句以获得更好的性能。
  5. 格式化您的代码。真的。:P
于 2013-05-04T11:51:21.097 回答