我有两个具有多对多关系的实体。
一个“条目”有 n 个“标签”。现在我想插入一个带有标签的新条目。该表单由一组“标签”表单组成,这些表单可以通过 javascript 动态添加。控制器代码中默认添加一个字段。
当表单被提交并且我遍历条目的标签时,只有第一个(已添加到控制器中,而不是通过 javascript)具有正确的实体类型。其他的只是数组:
object(Entity\Type)[88]
private 'id' => null
private 'field' => null
private 'type' => string 'S' (length=1)
array (size=3)
'field' => null
'type' => string 'S' (length=1)
“入口”控制器:
$entity = new Entry();
$entity->getParameters()->add(new EntryTag());
$form = $this->createForm($this->get('entryform'),$entity);
if($request->getMethod() == 'POST'){
$form->bindRequest($request);
$formData = $form->getData();
foreach ($formData->getParameters() as $par) {
var_dump($par);
}
}
“Entry”类型:$this->tagType 被注入到构造函数中。
public function buildForm(FormBuilder $builder, array $options){
$builder->add('parameters', 'collection', array(
'type' => $this->tagType,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Entity\Entry',
));
}
“标签”类型:
public function buildForm(FormBuilder $builder, array $options){
$builder->add('field', 'text', array('label' => 'Key'));
$builder->add('type', 'choice', array('label' => 'Type', 'required' => false, 'choices' => $this->getTypes()));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Entity/Tag',
));
}
我用来添加字段的javascript:
var $childs = $container.find('.form-child');
fieldIndindex++;
var template = $container
.addClass('form-child')
.attr('data-prototype')
.replace(/\$\$name\$\$/g, fieldIndindex);
if($childs.length == 0){
$container.prepend($template);
}else{
$childs.last().after($template);
}
那么,为什么没有检测到实体类型呢?
编辑:
当我将“data_class”选项添加到“集合”字段时,它可以工作。
$builder->add('parameters', 'collection', array(
'type' => $this->parameterType,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'options' => array(
'data_class' => 'Entity/Tag',
)
));
但是在我的“标签”类型中将其设置为默认选项就足够了。但是为什么不使用呢?