Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.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 Symfony 2动态嵌入表单,错误(实体)类型_Php_Forms_Symfony_Doctrine Orm - Fatal编程技术网

Php Symfony 2动态嵌入表单,错误(实体)类型

Php Symfony 2动态嵌入表单,错误(实体)类型,php,forms,symfony,doctrine-orm,Php,Forms,Symfony,Doctrine Orm,我有两个实体,它们之间存在着一对多的关系 一个“条目”有n个“标签”。现在我想插入一个带有标记的新条目。表单由一组“标记”表单组成,这些表单可以通过javascript动态添加。默认情况下,在控制器代码中添加一个字段 当表单被提交,并且我迭代了条目的标记时,只有第一个(已添加到控制器中,而不是通过javascript)具有正确的实体类型。其他的只是数组: object(Entity\Type)[88] private 'id' => null private 'field' =

我有两个实体,它们之间存在着一对多的关系

一个“条目”有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);
    }
}
“条目”类型: $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',
    ));
}
“标记”类型:

我用于添加字段的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”选项添加到我的“collection”字段时,它就起作用了

$builder->add('parameters', 'collection', array(
        'type' => $this->parameterType,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
        'options' => array(
            'data_class' => 'Entity/Tag',
        )
    ));
但是在我的“Tag”类型中将其设置为默认选项应该足够了。但是为什么不用呢?

我拿到了


我在2.0中使用了symfony2.1语法。将setDefault选项更改为getDefaultOptions后,它现在可以工作。

看起来您的标记上的数据类可能有误。这是我最初的想法,但我仔细检查了它。我复制了名称空间+类名以确保安全。请尝试将数据类设置为实体的完整路径:“data\u class”=>“Acme\DemoBundle\entity\Tag”-我怀疑可能发生的情况是,在控制器中设置表单时未使用data\u类-只有在开始嵌入表单时,它才需要“提示”关于如何使对象脱离数据,我已经使用了完整的名称空间。我在这里缩短了示例代码。如何使用javascript添加标记表单?太好了。我怀疑这很简单!
$builder->add('parameters', 'collection', array(
        'type' => $this->parameterType,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
        'options' => array(
            'data_class' => 'Entity/Tag',
        )
    ));