Forms symfony控制器以嵌入形式发送重复值

Forms symfony控制器以嵌入形式发送重复值,forms,symfony,controller,duplicates,Forms,Symfony,Controller,Duplicates,我正在使用Symfony 2.8的嵌入式表单,但我的控制器有问题,它在有效值之间发送空白值。有什么想法吗?。谢谢 这就是twig所接受的: 结果是: 在我的控制器中: public function editarDetalleAction(Request $request) { $em = $this->getDoctrine()->getManager(); $session = $request->getSession(); $i

我正在使用Symfony 2.8的嵌入式表单,但我的控制器有问题,它在有效值之间发送空白值。有什么想法吗?。谢谢

这就是twig所接受的:

结果是:

在我的控制器中:

        public function editarDetalleAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $session = $request->getSession();
    $id = $session->get('id');

    $detalles = $em->getRepository('ComponentesBundle:Receta_detalle')->findRecetaPorId($id);
    $recetaDetalles = new Receta_detalle();

    foreach ($detalles as $detalle){
        $ingrediente = $detalle->getIngrediente();
        $recetaDetalles->getDetalles()->add($detalle->setIngrediente($ingrediente));

        $gramaje = $detalle->getGramaje();
        $recetaDetalles->getDetalles()->add($detalle->setGramaje($gramaje));
    }

    $form = $this->createForm(new Receta_detalleCollectionType(), $recetaDetalles);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
 //             $this->getDoctrine()->getManager()->flush();
    }

    return $this->render('ComponentesBundle:Backend:receta/edit_detalle.html.twig', array(
            'form' => $form->createView(),
    ));

}
 }
我的家长表格:

namespace ComponentesBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class Receta_detalleType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('ingrediente')
    ->add('gramaje')
//         ->add('receta')        
        ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'ComponentesBundle\Entity\Receta_detalle'
    ));
}

public function getBlockPrefix()
{
    return 'componentesbundle_receta_detalle';
}
}
我的嵌入式表单:

namespace ComponentesBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use ComponentesBundle\Entity\Receta_detalle;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;

class Receta_detalleCollectionType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
   ->add('detalles', CollectionType::class, array(
        'entry_type'=> Receta_detalleType::class,
        'allow_add' => true,
        'allow_delete' => true,

        'prototype' => true,
        'prototype_name' => 'detalles__name__',

   ))
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'ComponentesBundle\Entity\Receta_detalle'
    ));
}

public function getBlockPrefix()
{
    return 'componentesbundle_receta_detalleCollection';
}
}
我的看法是:

<h3>Detalle</h3>

{{ form_start(form) }}
{% for detail in form.detalles %}
    {{ form_row(detail.ingrediente) }}
    {{ form_row(detail.gramaje) }}  
{% endfor %}

    <input type="submit" value="Editar" />
{{ form_end(form) }}
Detalle
{{form_start(form)}}
{%用于form.detalles%中的详细信息}
{{form_row(detail.ingrediente)}
{{form_row(detail.gramaje)}
{%endfor%}
{{form_end(form)}}

到底什么是
$x=$detalle->getX();[…]->add($detalle->setX($x))
应该怎么做?获取属性并将其设置在同一对象上-为什么?(此处x是Ingediente和Gramaje的占位符)。我怀疑您的setter会返回对象本身(例如,
在其末尾返回$this;
)。然后,您的foreach代码可以归结为:
foreach($detalles as$detalle){$recetadetales->getDetalles()->add($detalle);$recetadetales->getDetalles()->add($detalle);}
(例如,将同一个对象添加两次)@ccKep-Kep是正确的,您的$detale变量中已经有一个配方对象数组,您试图在foreach循环中重建相同的结构,只需使用$detalles构建表单,请参见。如果这不起作用,将detalles和recettaDetalles发送到twig并进行twig转储,这样我们就可以看到数据的样子。另外:查看屏幕截图,我想您的
Recata\u detalle::setIngediente
方法返回
null
(因为每第二个条目都是null,从第一个条目开始)因此,在每个循环中将
null
添加到数组中。长话短说:发布您的
Recata_detalle
映射和
setIngediente
+
setGramaje
方法。非常感谢ccKep和Marko Zivkovic。你是对的,我已经改变了foreach循环,正如ccKep所指示的那样,它可以工作