【问题标题】:Symfony2 multiple Entities of same class in one FormSymfony2 同一类的多个实体在一个表单中
【发布时间】:2015-03-31 14:52:16
【问题描述】:

我想呈现一个具有多个同类实体的表单。 我将显示 2 个字段,Price(type=text) 和 Enabled(type=checkbox)。

我不知道我会有多少这些实体,所以表单必须动态获取它们。

我尝试过以下操作

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

        $builder
            ->add('price', 'text', array(
                'label' => 'Price',
                'required' => true
            ))
            ->add('enabled','checkbox',array(
                'label'     => 'Use this currency',

            ))
        ;    
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class'        => 'Osiris\Entity\Pricing',
        'csrf_protection'   => false
    ));
}

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

在我的控制器中,我创建了这样的表单:

$pricingForm = $this->createFormBuilder($prices)
               ->add('items','collection',array(
                   'required' => false,
                   'prototype' => true,
                   'type'    => new PricingType(),
               ))
                ->getForm()
            ;

在我的树枝上我这样做:

{% for price in form_pricing %}
    <h2>Price</h2>
    <div class="row">{{ form_widget(price) }}</div>
{% endfor %}

但是它只带有 h2 价格和 class=row 的空 div。我觉得我已经成功了一半,但我不知道如何继续前进。 如果有人也知道如何在提交时获取字段,我将不胜感激。

【问题讨论】:

  • 您找到了您想要的解决方案?
  • 是的,我将其发布为下面我的问题的答案。

标签: php forms symfony doctrine-orm


【解决方案1】:

我找到了解决办法

我在 Controller 中创建表单的方式是错误的! 我必须执行以下操作:

$pricingForm = $this->createFormBuilder(array('prices'=>$prices))
                ->add('prices','collection',array(
                    'required'       => true,
                    'allow_add'      => true,
                    'type'           => new PricingType(),
               ))
                ->getForm()
            ;

"allow_add => true" 在使用集合时是必需的,否则它将将任何 PricingType 实体集合添加到表单中。

那么,由于表单是在控制器 "$this-&gt;createFormBuilder(array('prices'=&gt;$prices))" 中构建的,$prices 数组必须作为数组传递,其数组键名与 "-&gt;add('prices','collection',array(...)" 中使用的键名相同,即 'prices' 所以Symfony 会知道在哪里绑定什么。 $prices 是一个定价对象数组array(0 =&gt; new Pricing())

在我的 PricingType 中,我有:

class PricingType extends AbstractType {

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

        $builder
            ->add('price', 'text', array(
                'label' => false,
                'required' => true
            ))
            ->add('enabled','checkbox',array(
                'label'     => 'Use this currency',

            ))
        ;

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'        =>  'XXX\XXX\Entity\Pricing',
            'csrf_protection'   => false
        ));
    }

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

这里我需要控制标签属性。我找不到它的方式(如果有人知道,请发布如何)。我覆盖我的树枝模板如下:

在顶部我们需要下一行代码:

    {% form_theme form_pricing _self %}

然后按如下方式覆盖行和小部件(调试是一场噩梦):

{% block _form_prices_entry_row %}
    {% spaceless %}
        {{ form_widget(form) }}
    {% endspaceless %}
{% endblock %}

{% block _form_prices_entry_widget %}
    {% spaceless %}

        {{ form_row(form.price, { 'label' : form.vars.value.getCurrency().getTitle() } ) }}
        {{ form_row(form.enabled) }}

    {% endspaceless %}
{% endblock %}

然后在 body 中渲染表单元素如下:

{% for price in form_pricing.prices %}
                    <div class="price-row">{{ form_row(price) }}</div>
                {% endfor %}

我真的希望这对你有帮助。调试特别是 twig 文件真是一场噩梦,感谢我聪明的同事。

【讨论】:

  • 嗨,这正是我想要做的,但我无法克隆你的解决方案。你如何定义你的控制器?如果你还在做,也请给我解释一下。
【解决方案2】:

我认为您在 twig 文件中错过了 for 循环 检查这个例子:

    {# store the prototype on the data-prototype attribute #}
    <ul id="email-fields-list" data-prototype="{{ form_widget(form.emails.vars.prototype)|e }}">
    {% for emailField in form.emails %}
        <li>
            {{ form_errors(emailField) }}
            {{ form_widget(emailField) }}
        </li>
    {% endfor %}
    </ul>

查看循环,我认为您需要在 twig 文件中添加。

除了循环之外,您还需要添加 JavaScript

查看此链接:

http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items

检查完整的代码。它将帮助您使用集合字段类型从单个实体类生成多个实体表单。

【讨论】:

  • 这是一个很好的例子,但我没有让用户选择向该表单添加更多字段。
  • 那就不要添加JavaScript代码,只要form和twig代码就够了。
  • 我创建了一个定价数组并将其传递给 FormBuilder。当我在树枝中循环我的表单时( {% for price in form_pricing.prices %}
    {{ form_widget(price) }}
    )它不会返回任何东西。有什么想法吗?
  • 来自 Symfony2 示例页面:在这两种情况下,除非您的电子邮件数据数组已经包含一些电子邮件,否则不会呈现任何输入字段。在此链接中给出:symfony.com/doc/current/reference/forms/types/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多