Forms Symfony 2表格,字段集合不';t显示
我想创建一个可以添加多个etape的表单。我创建的表单如下所示: //形式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
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函数来处理添加和删除按钮,但我会在之后再做!