2016-11-25 58 views
0

我有两种形式(插入控制器),它取决于2个关系1:n的实体。 第一个(Orders)发送一些数据(POST)到第二个(Orders_detail);我的意图是为一个提供商创建一个购买,所以在第一个形式中,我必须选择一个提供商,它将我带到第二个形式,以便我从他那里选择一个产品。 当我坚持数据库时,除id_provider之外的所有数据都保持不变,我不明白为什么,因为它是通过POST发送的。 我试图从$ form和其他方式访问它,但它启动一个错误,因为它要求是一个Proveedores(另一个实体取决于)的实例。你可以在这里看到的关系模式https://1drv.ms/f/s!Av9T-u6UurJJ5Gu1cLoLiIHGLbDm 感谢symfony主义不坚持一些数据

控制器

public function new2Action(Request $request) 
{ 
    $pedidos= new Pedidos(); 
    $form=$this->createFormBuilder($pedidos) 
     ->setAction($this->generateUrl('pedidosDetalle_new2')) 
     ->setMethod('POST') 
     ->add('idProveedor') 
     ->add('id', HiddenType::class) 
     ->getForm(); 


    return $this->render('ComprasBundle:pedidos:new2.html.twig', array(
      'form'=>$form->createView(), 
     ));  
} 




public function detallesNew2Action(Request $request, $id) 
{ 
    $pedidosDetalle= new Pedidos_detalle(); 
    $pedidos=new Pedidos(); 
    $form=$this->createFormBuilder($pedidosDetalle) 
    ->setAction($this->generateUrl('pedidosDetalle_new2')) 
    ->setMethod('POST') 

      ->add('seleccionarProducto','checkbox', array(
      'mapped'=>false)) 
      ->add('idProducto') 
      ->add('cantidadPedida') 
      ->add('observaciones') 
      ->add('idPedido', HiddenType::class) 

      ->getForm(); 

      $form->handleRequest($request); 
      $em=$this->getDoctrine()->getManager(); 
      if ($form->isValid()){ 

       // 
       $pedidos->setFechaPedido(new \DateTime('now')); 
       $pedidos->setFechaEntregaPrevista(new \DateTime('now')); 
       $pedidos->setResponsableCompra($this->getUser()); 
       $pedidos->setEntregado(false); 
       $pedidos->setIdProveedor($pedidos->getIdProveedor()); THIS DONT WORK (Catchable Fatal Error: Argument 1 passed to Cocina\ComprasBundle\Entity\Pedidos::setIdProveedor() must be an instance of Cocina\ComprasBundle\Entity\Proveedores, null given, called in C:\xampp\htdocs\Cocina\src\Cocina\ComprasBundle\Controller\PedidosController.php on line 225 and defined) 


       $em->persist($pedidos); 
       $em->persist($pedidosDetalle); 
       $em->flush(); 

       $flashBag = $this->get('session')->getFlashBag(); 
       $flashBag->add('success', 'Pedido guardado'); 

      } 

      $fechaEntrega=$request->get('fechaEntrega'); 
      $fechaPedido=$request->get('fechaPedido'); 

      return $this->render('ComprasBundle:pedidos:Detallesnew2.html.twig', array(
       'form'=>$form->createView(), 
       'fechaEntrega'=>$fechaEntrega, 
       'fechaPedido'=>$fechaPedido 

       )); 
} 

实体PEDIDOS

class Pedidos 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="Cocina\ComprasBundle\Entity\Proveedores") 
*/ 
private $idProveedor; 

... 

/** 
* Set idProveedor 
*/ 
public function setIdProveedor(\Cocina\ComprasBundle\Entity\Proveedores $idProveedor) 
{ 
    $this->idProveedor = $idProveedor; 

    return $this; 
} 

/** 
* Get idProveedor 
* 
* @return string 
*/ 
public function getIdProveedor() 
{ 
    return $this->idProveedor; 
} 

... 

    public function __toString(){ 
    return $this->id; 
} 

实体PEDIDOS_DETALLE

class Pedidos_detalle 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="Cocina\ComprasBundle\Entity\Pedidos") 
*/ 
private $idPedido; 

/** 
* @ORM\ManyToOne(targetEntity="Cocina\ComprasBundle\Entity\Productos") 
*/ 
....... 

/** 
* Set idPedido 
*/ 
public function setIdPedido(\Cocina\ComprasBundle\Entity\Pedidos $idPedido) 
{ 
    $this->idPedido = $idPedido; 

} 

/** 
* Get idPedido 
* 
* @return string 
*/ 
public function getIdPedido() 
{ 
    return $this->idPedido; 
} 

..... 
public function __toString(){ 
    return $this->id; 
} 

回答

0

我希望我理解正确你的问题。所以我认为在我看来,你必须只使用一种形式,并设置与另一种形式(集合)的关系,并将该形式作为子形式使用。

对于此解决方案,您可以使用第一种形式的CollectionType并引用另一种形式。

https://symfony.com/doc/current/form/form_collections.html

然后你可以用两种形式和实体的工作,但你必须坚持只主要形式。当你再渲染你的第一个表单时,第二个表单也被渲染。

使用Boostrap Bundle中的BootstrapCollection类型,您可以做更多的事情。

+0

感谢您的回应Stony;我认为最好的方法就像你说的那样,事实上我之前在另一次尝试中使用了表单集合,但是我有一些验证问题,并且我决定用另一种方式来检查。这种情况是,我直觉这个问题必须有一个简单的解决方案(我怎么能得到idPedido设置它坚持行动之前?),但我不知道如何。 – viejalospelos

+0

对不起,问题是我怎么能得到** idProveedor **在持续行动之前设置它? – viejalospelos