【问题标题】:Add attribute to form widget not work向表单小部件添加属性不起作用
【发布时间】:2013-04-29 09:43:09
【问题描述】:

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

【问题讨论】:

  • 我认为,这是因为 product 是 subfrom,而不是小部件。

标签: php symfony twig


【解决方案1】:

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

一个想法:

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

顺便说一句,我不是setData 的忠实粉丝,但这种情况需要它:)

希望这会有所帮助...

【讨论】:

  • 检查我的编辑。没关系.. 之后我将使用表单创建代码更新问题。 (我是移动自动取款机)
  • 啊,我明白了。您是否尝试过设置除selected 之外的任何其他属性?这样我们就可以确定这个问题是否是特定于属性的......
  • 对不起,你是对的,property_path 是 false 还是 true 很重要......(并且 'attr' 无关紧要。它可能是 class 或 selected 或其他)
  • 啊,我通过传递带有“选定”实体的数组来尝试您的答案。并且在 $builder->add(..) 之后做了 $builder->setData(array('selected'=>$selectedProducts));但我收到警告,数据与表单类型不同。实际上表单还有另一个 data_class,$products 只是表单的一部分。我怎样才能避免这种情况?
  • 今晚晚些时候我会尝试写一些“测试”并将其发布在这里。目前对我来说可能出了什么问题有点困惑;)
【解决方案2】:

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

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

【讨论】:

  • 你能解释一下 setData 的第三点吗?如果我尝试这样做: $builder->get('products')->setData($selectedProducts);我得到一个例外, $selectedProducts 是一个数组而不是一个集合类型......如何手动设置数据?谢谢你的休息,但你的回答对我没有多大帮助..
猜你喜欢
  • 2016-03-25
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2022-01-18
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多