Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2一种形式的同一类多个实体_Php_Forms_Symfony_Doctrine Orm - Fatal编程技术网

Php Symfony2一种形式的同一类多个实体

Php Symfony2一种形式的同一类多个实体,php,forms,symfony,doctrine-orm,Php,Forms,Symfony,Doctrine Orm,我想呈现一个具有相同类的多个实体的窗体。 我将显示两个字段,Price(type=text)和Enabled(type=checkbox) 我不知道我将拥有多少这些实体,所以表单必须动态地获取它们 我试着做了以下几点 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('price', 'text', array(

我想呈现一个具有相同类的多个实体的窗体。 我将显示两个字段,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 %}
{%用于价格的形式_pricing%}
价格
{{form_widget(price)}
{%endfor%}
然而,它只有h2价格和class=row的空div。我觉得我已经走了一半,但我不知道如何继续前进。
如果有人也知道如何在提交时获取字段,我将非常感激。

我认为您在您的小树枝文件中遗漏了一个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>
{#将原型存储在数据原型属性#}
    {form.emails%}
  • {{form_errors(emailField)} {{form_widget(emailField)}
  • {%endfor%}
看到这个循环,我想你需要添加到你的细枝文件中

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

检查此链接:


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

我找到了解决方案

我在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->createFormBuilder(array('prices'=>$prices))
”中构建的,
$prices
数组必须作为数组传递,数组键名与“
->add('prices','collection',array(…)
中使用的键名相同,这是
'prices'
,因此Symfony将知道在哪里绑定什么。
$prices
是定价对象的数组
数组(0=>newpricing())

在我的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';
    }
}
在这里,我需要控制标签属性。我找不到它的方法(如果有人知道,请发布方法)。我覆盖我的小枝模板,如下所示:

{% for price in form_pricing.prices %}
                    <div class="price-row">{{ form_row(price) }}</div>
                {% endfor %}
在顶部,我们需要下一行代码:

    {% form_theme form_pricing _self %}
然后按如下所示覆盖行和小部件(调试是一场噩梦):

然后在主体中,按如下方式渲染表单元素:

{% for price in form_pricing.prices %}
                    <div class="price-row">{{ form_row(price) }}</div>
                {% endfor %}
{price%表格中的价格为_pricing.prices%}
{{表列(价格)}
{%endfor%}

我真的希望这会对你有所帮助,guyz。调试twig文件真是一场噩梦,多亏了我聪明的同事,我才这么做。

这是一个很好的例子,但我不会让用户选择在表单中添加更多字段。然后不要添加JavaScript代码,只要表单和twig代码就足够了。我创建了一个定价数组并将其传递给FormBuil当我在twig中循环我的表单时({form_pricing.prices%}{{form_widget(price)}})它不会返回任何内容。有什么想法吗?来自Symfony2示例页面:在这两种情况下,除非您的电子邮件数据数组已经包含一些电子邮件,否则不会呈现任何输入字段。在这个链接中给出:您得到了您要找的解决方案吗?是的,我将其作为下面问题的答案发布。您好,这正是我试图做的,但我无法克隆你的解决方案。你如何定义你的控制器?如果你还在上面,请向我解释一下。