嵌入表单与关系Symfony2


Embed forms with relations Symfony2

我的问题是我试图嵌入表单,我不能这样做,我读symfony书,其他页面,没有办法让我工作。

这是我的数据类型:

    <?php
namespace Proyecto'LavocBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
class DatosType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder->add('empresa');
        $builder->add('cuit');
        $builder->add('localidad');
        $builder->add('calle');
        $builder->add('altura');
        $builder->add('areaTel');
        $builder->add('telefono');
        $builder->add('areaCel');
        $builder->add('celular');
        $builder->add('email');
    }
    public function getName()
    {
    return 'datos_form';
    }
}

这是我的UserType:

    <?php
namespace Proyecto'LavocBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
class UserType extends AbstractType 
{
    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder->add('usuario');
        $builder->add('pass');
    }
    public function getName() 
    {
        return 'user_form';
    }
}

这是我的RegistroUsuarioType:

<?php
namespace Proyecto'LavocBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;

class RegistroUsuarioType extends AbstractType 
{
    public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);
        $builder->add('usuario');
        $builder->add('pass');
        $builder->add('datos', new DatosType(), array('by_reference' => true));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Proyecto'LavocBundle'Entity'User'
        ));
    }
    public function getName() {
        return 'RegistroUsuario_form';
    }
}

My Entity Datos:

 <?php
namespace Proyecto'LavocBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * Datos
 *
 * @ORM'Table()
 * @ORM'Entity(repositoryClass="Proyecto'LavocBundle'Entity'DatosRepository")
 */
class Datos
{
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM'Column(name="empresa", type="string", length=50)
     */
    private $empresa;
    /**
     * @var integer
     *
     * @ORM'Column(name="cuit", type="integer")
     */
    private $cuit;
    /**
     * @var string
     *
     * @ORM'Column(name="localidad", type="string", length=50)
     */
    private $localidad;
    /**
     * @var string
     *
     * @ORM'Column(name="calle", type="string", length=40)
     */
    private $calle;
    /**
     * @var integer
     *
     * @ORM'Column(name="altura", type="integer")
     */
    private $altura;
    /**
     * @var integer
     *
     * @ORM'Column(name="areaTel", type="integer")
     */
    private $areaTel;
    /**
     * @var integer
     *
     * @ORM'Column(name="telefono", type="integer")
     */
    private $telefono;
    /**
     * @var integer
     *
     * @ORM'Column(name="areaCel", type="integer")
     */
    private $areaCel;
    /**
     * @var integer
     *
     * @ORM'Column(name="celular", type="integer")
     */
    private $celular;
    /**
     * @var string
     *
     * @ORM'Column(name="email", type="string")
     */
    private $email;
    /**
    * @ORM'OneToOne(targetEntity="User", inversedBy="datos")
    * @ORM'JoinColumn(name="user_id", referencedColumnName="id")
    */
    private $personales;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set empresa
     *
     * @param string $empresa
     * @return Datos
     */
    public function setEmpresa($empresa)
    {
        $this->empresa = $empresa;
        return $this;
    }
    /**
     * Get empresa
     *
     * @return string 
     */
    public function getEmpresa()
    {
        return $this->empresa;
    }
    /**
     * Set cuit
     *
     * @param integer $cuit
     * @return Datos
     */
    public function setCuit($cuit)
    {
        $this->cuit = $cuit;
        return $this;
    }
    /**
     * Get cuit
     *
     * @return integer 
     */
    public function getCuit()
    {
        return $this->cuit;
    }
    /**
     * Set localidad
     *
     * @param string $localidad
     * @return Datos
     */
    public function setLocalidad($localidad)
    {
        $this->localidad = $localidad;
        return $this;
    }
    /**
     * Get localidad
     *
     * @return string 
     */
    public function getLocalidad()
    {
        return $this->localidad;
    }
    /**
     * Set calle
     *
     * @param string $calle
     * @return Datos
     */
    public function setCalle($calle)
    {
        $this->calle = $calle;
        return $this;
    }
    /**
     * Get calle
     *
     * @return string 
     */
    public function getCalle()
    {
        return $this->calle;
    }
    /**
     * Set altura
     *
     * @param integer $altura
     * @return Datos
     */
    public function setAltura($altura)
    {
        $this->altura = $altura;
        return $this;
    }
    /**
     * Get altura
     *
     * @return integer 
     */
    public function getAltura()
    {
        return $this->altura;
    }
    /**
     * Set telefono
     *
     * @param integer $telefono
     * @return Datos
     */
    public function setTelefono($telefono)
    {
        $this->telefono = $telefono;
        return $this;
    }
    /**
     * Get telefono
     *
     * @return integer 
     */
    public function getTelefono()
    {
        return $this->telefono;
    }
    /**
     * Set area
     *
     * @param integer $area
     * @return Datos
     */
    public function setAreaTel($areaTel)
    {
        $this->areaTel = $areaTel;
        return $this;
    }
    /**
     * Get area
     *
     * @return integer 
     */
    public function getAreaTel()
    {
        return $this->areaTel;
    }
    /**
     * Set celular
     *
     * @param integer $celular
     * @return Datos
     */
    public function setCelular($celular)
    {
        $this->celular = $celular;
        return $this;
    }
    /**
     * Get celular
     *
     * @return integer 
     */
    public function getCelular()
    {
        return $this->celular;
    }
    /**
     * Set areaCel
     *
     * @param integer $areaCel
     * @return Datos
     */
    public function setAreaCel($areaCel)
    {
        $this->areaCel = $areaCel;
        return $this;
    }
    /**
     * Get areaCel
     *
     * @return integer 
     */
    public function getAreaCel()
    {
        return $this->areaCel;
    }
    /**
     * Set email
     *
     * @param integer $email
     * @return Datos
     */
    public function setEmail($email)
    {
        $this->email = $email;
        return $this;
    }
    /**
     * Get email
     *
     * @return integer 
     */
    public function getEmail()
    {
        return $this->email;
    }
    /**
     * Set personales
     *
     * @param string $personales
     * @return Datos
     */
    public function setPersonales($personales)
    {
        $this->personales = $personales;
        return $this;
    }
    /**
     * Get personales
     *
     * @return string
     */
    public function getPersonales()
    {
        return $this->personales;
    }

}

我的实体用户:

 <?php
namespace Proyecto'LavocBundle'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
/**
 * User
 *
 * @ORM'Table()
 * @ORM'Entity(repositoryClass="Proyecto'LavocBundle'Entity'UserRepository")
 */
class User {
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM'Column(name="usuario", type="string", length=30)
     */
    private $usuario;
    /**
     * @var string
     *
     * @ORM'Column(name="pass", type="string", length=20)
     */
    private $pass;
    /**
     * @ORM'OneToMany(targetEntity="Pedido", mappedBy="user")
     */
    private $pedidos;
    /**
     *  @ORM'OneToOne(targetEntity="Datos", mappedBy="personales")
     */
    private $datos;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }
    /**
     * Set usuario
     *
     * @param string $usuario
     * @return User
     */
    public function setUsuario($usuario) {
        $this->usuario = $usuario;
        return $this;
    }
    /**
     * Get usuario
     *
     * @return string 
     */
    public function getUsuario() {
        return $this->usuario;
    }
    /**
     * Set pass
     *
     * @param string $pass
     * @return User
     */
    public function setPass($pass) {
        $this->pass = $pass;
        return $this;
    }
    /**
     * Get pass
     *
     * @return string 
     */
    public function getPass() {
        return $this->pass;
    }
    public function __construct() {
        $this->pedidos = new ArrayCollection();
    }
    /**
     * Set pedidos
     *
     * @param string $pedidos
     * @return User
     */
    public function setPedido($pedidos) {
        $this->pedidos = $pedidos;
        return $this;
    }
    /**
     * Get pedidos
     *
     * @return string
     */
    public function getPedidos() {
        return $this->pedidos;
    }
    /**
     * Add pedidos
     *
     * @param 'UTN'GuardaBundle'Entity'Pedido $pedidos
     * @return User
     */
    public function addPedido('Proyecto'LavocBundle'Entity'Pedido $pedidos) {
        $this->pedidos[] = $pedidos;
        return $this;
    }
    /**
     * Remove pedidos
     *
     * @param 'UTN'GuardaBundle'Entity'Pedido $pedidos
     */
    public function removePedido('Proyecto'LavocBundle'Entity'Pedido $pedidos) {
        $this->pedidos->removeElement($pedidos);
    }
    /**
     * Get datos
     *
     * @return string
     */
    public function getDatos()
    {
        return $this->datos;
    }
    /**
     * Set datos
     *
     * @param string $datos
     * @return User
     */
    public function setDatos($datos)
    {
        $this->datos = $datos;
        return $this;
    }


}

最后,我的crearUsuarioDatosAction:

  public function crearUsuarioDatosAction()
    {
        $usuario = new User();
        $datos = new Datos();
        $usuario->setDatos($datos);
        $request = $this->getRequest();
        $form = $this->createForm(new RegistroUsuarioType(), $usuario);
        return $this->render('AtajoBundle:IngresarValores:crearUsuarioDatos.html.twig', array('form' => $form->createView()));
    }

我有几个问题要问:1)我得到的错误如下:传递到选择字段的实体必须被管理。也许在实体管理器中持久化它们?这是什么问题?2)用户通过邮件发送后,我如何获取数据?例如,用户和密码我必须保存在表中用户和个人数据如地址,电话号码,手机号码等,我必须保存在表中data

谢谢大家!!

add()函数的第二个参数必须给出表单字段类型,如果想使用默认值,则为空。

$builder->add('datos', null, array('by_reference' => true));