Forms Symfony 2表格,字段集合不';t显示

Forms Symfony 2表格,字段集合不';t显示,forms,collections,symfony,Forms,Collections,Symfony,我想创建一个可以添加多个etape的表单。我创建的表单如下所示: //形式 namespace RBO\TryBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; use RBO\TryBundle\Entity\Try; class TryType extends AbstractType { public function bu

我想创建一个可以添加多个etape的表单。我创建的表单如下所示:

//形式

 namespace RBO\TryBundle\Form\Type;

 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilder;

 use RBO\TryBundle\Entity\Try;

 class TryType extends AbstractType {
   public function buildForm(FormBuilder $builder, array $options)
   {
     $builder->add('etapes', 'collection', array(
        'type' => new EtapeType(), 
        'allow_add' => true,
        'allow_delete' => true,
        'prototype' => true,
        'label' => 'Etapes'
    ));
  }
  public function getName()
{
    return 'try';
}

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'RBO\TryBundle\Entity\Try',
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
        // a unique key to help generate the secret token
        'intention'       => 'try_item',
    );
}
 }
//埃塔佩型

<?php

namespace RBO\TryBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

use RBO\TryBundle\Entity\Etape;

class EtapeType extends AbstractType {

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('name', 'text');
}

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'RBO\TryBundle\Entity\Etape',
    );
}

public function getName()
{
    return 'etape';
}
实体Try的属性etapes是ArrayCollection(在构造函数中定义)

此代码不呈现任何内容,只呈现标签。我错过什么了吗


提前谢谢你

我一直使用form\u小部件来呈现嵌入的表单,但我认为form\u row也可以很好地工作。您应该注意的重要一点是,嵌入式表单容器是否具有“数据原型”属性。 然后,必须向显示表单的页面添加脚本。在我的例子中,我使用Mootools,但我认为您可以轻松地将此脚本转换为jQuery或任何其他javascript框架:

以下是我的js文件的内容(您应该用“XXX”替换元素的id,其中“数据原型”属性为:

window.addEvent( 'domready', function() {
var add = function() {
    var collectionHolder = $('XXX');
    var prototype = collectionHolder.getAttribute('data-prototype');
    form = prototype.replace(/\$\$name\$\$/g, collectionHolder.getChildren().length);
    var cont = Elements.from(form);
    collectionHolder.adopt( cont );
}
var remove = function() {
    var collectionHolder = $('XXX');
    var child = collectionHolder.getLast();
    child.dispose();
}
$$('a.add-link').addEvent('click', function(e){
    e.stop();
    add();
});
$$('a.remove-link').addEvent('click', function(e){
    e.stop();
    remove();
});
}))

这个脚本非常简单,只需添加新元素或删除集合中的最后一个元素。此外,您应该向视图中添加一些html,以便添加/删除链接:

<ul class="actions">
<li>
    <a href="#" class="add-link">
        Add
    </a>
</li>
<li>
    <a href="#" class="remove-link">
        Remove last
    </a>
    </li>
</ul>

我希望这会有帮助,我对Symfony还不熟悉,我还在学习,但它对我很有用:)

我会这样做:

{% for etape in form.etapes %}
  {{ form_widget(etape.name) }}
{% endfor %}

我可能错了,因为我不使用细枝模板。但是这个想法在php模板中对我有效。

php
模板中

    `<?php foreach ($form['etapes'] as $etapesField) : ?>
<?php echo $view['form']->errors($etapesField) ?>
<?php echo $view['form']->widget($etapesField) ?>
<?php endforeach; ?>`
`
`
好的,有两件事:

1-在细枝模板中显示表单的常规方式:

    {{ form_row(form) }}
模板系统能够级联(对不起,这里是近似英语),这意味着表单中的所有子字段都将被呈现,以及它的封装表单。因此,无需通过调用form.etapes直接呈现子对象

2-我相信你的问题真的在于实例。如果以这种方式创建表单:

    $form = $this->createForm(new TryType()));
    $model = new Try();
    $model->setEtapes(array());

    $form = $this->createForm(new TryType(), $model));
甚至是这样:

    $form = $this->createForm(new TryType()));
    $model = new Try();
    $model->setEtapes(array());

    $form = $this->createForm(new TryType(), $model));
然后,表单不呈现任何内容是正常的,因为它显示的Etape字段的数量直接取决于向模型提供的Etape实例的数量。如果为其提供空数组,则不会呈现任何Etape字段。在显示单个字段时,要使其为空,应执行以下操作:

    $model = new Try();
    $model->setEtapes(array(new Etape())); // Empty Etape

    $form = $this->createForm(new TryType(), $model));
因此,您可以在集合类型中添加任意数量的字段:

    $model = new Try();
    $model->setEtapes(array(
        new Etape('Étape 1'),
        new Etape('Étape 2'),
        ...
    ));

    $form = $this->createForm(new TryType(), $model));

由于您使用的是子表单,请执行此操作

$builder
    ->add(
        'etapes',
        'collection',
        array(
            'type'          => new EtapeType(),
            'allow_add'     => true,
            'allow_delete'  => true,
        )
    )
    ->getForm()
;
你们在细枝上的表现并不重要。这取决于你想要什么。
表单行、表单小部件都应该正常工作。

事实上,文本字段名或etapes不会显示。我只有标签,别的什么都没有!我读到我需要添加javascript函数来处理添加和删除按钮,但我会在之后再做!