symfony2:如何在表单外设置字段的值

时间:2016-04-16 16:11:34

标签: forms symfony doctrine-orm

我有两张桌子:

enter image description here

对于表格中的每条新记录 Liquidaciones ,我需要在表格外设置字段值 comisiones_id (例如:2)

这是一种特殊情况,因为 comisiones_id 字段与表 Comisiones

相关

当我尝试设置值时,在 LiquidacionesController.php 中设置:

 $liquidacione = new Liquidaciones();
    $form = $this->createForm('BackendBundle\Form\LiquidacionesType', $liquidacione);
    $form->get('comisiones')->setData('2');


    $form->handleRequest($request);

我收到以下错误消息:

Catchable Fatal Error: Argument 1 passed to BackendBundle\Entity\Liquidaciones::setComisiones() must be an instance of BackendBundle\Entity\Comisiones, string given, called in C:\proyectos\cursospierobis\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 556 and defined 

我做错了什么?

这是我的档案:

LiquidacionesController.php

   public function newAction(Request $request)
{
    $liquidacione = new Liquidaciones();
    $form = $this->createForm('BackendBundle\Form\LiquidacionesType', $liquidacione);
        $form->get('comisiones')->setData('2');
    $form->handleRequest($request);



    if ($form->isSubmitted() && $form->isValid()) {

        $em = $this->getDoctrine()->getManager();
        $em->persist($liquidacione);
        $em->flush();

        return $this->redirectToRoute('liquida_show', array('id' => $liquidacione->getId()));
    }

    return $this->render('liquidaciones/new.html.twig', array(
        'liquidacione' => $liquidacione,
        'form' => $form->createView(),
    ));
}

LiquidacionesType.php

class LiquidacionesType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nroLiqui')
            ->add('fechaPago', null, array('widget' => 'single_text'))
            ->add('monto')
            ->add('observaciones')
            ->add('comisiones', 'hidden')
                ;

    }

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'BackendBundle\Entity\Liquidaciones'
    ));
}
}

实体 Liquidaciones.php

namespace BackendBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Liquidaciones
 *
 * @ORM\Table(name="liquidaciones", indexes={@ORM\Index(name="fk_Liquidaciones_Comisiones1_idx", columns={"comisiones_id"})})
 *  @ORM\Entity(repositoryClass="BackendBundle\Entity\LiquidacionesRepository")
 */

********************

  public function setComisiones(\BackendBundle\Entity\Comisiones $comisiones)
{
    $this->comisiones = $comisiones;

    return $this;
}

/**
 * Get comisiones
 *
 * @return \BackendBundle\Entity\Comisiones 
 */
public function getComisiones()
{
    return $this->comisiones;
}

修改

使用 Iaroslav Gashuk 提出的解决方案,代码如下:

LiquidacionesController.php

public function newAction(Request $request )
{
    $liquidacione = new Liquidaciones();


    $form = $this->createForm('BackendBundle\Form\LiquidacionesType', $liquidacione);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {   

        $comisiones = $this->getDoctrine()->getManager()->getRepository('BackendBundle:Comisiones')->findOneById(4);
        $liquidacione->setComisiones($comisiones);

        $em = $this->getDoctrine()->getManager();

        $em->persist($liquidacione);
        $em->flush();

        return $this->redirectToRoute('liquidaciones_show', array('id' => $liquidacione->getId()));
    }

    return $this->render('liquidaciones/new.html.twig', array(
        'liquidacione' => $liquidacione,
        'form' => $form->createView(),
    ));
}

1 个答案:

答案 0 :(得分:1)

您必须传递Comisiones实体的实例而不是其ID