User/Address jointure doctine simple formulaire
Bonjour à tous, je suis bloqué sur une jointure d'une entité User et une entité Address, j'utilise FOSUserBundle
voici mon Entité User :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| class User extends BaseUser implements TimestampableInterface
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="first_name", type="string", nullable=true)
* @Assert\NotBlank()
*/
protected $firstName;
/**
* @ORM\Column(name="last_name", type="string", nullable=true)
* @Assert\NotBlank()
*/
protected $lastName;
/**
* @ORM\Column(name="created_at", type="datetime", nullable=true)
*/
protected $createdAt;
/**
* @ORM\Column(name="update_at", type="datetime", nullable=true)
*/
protected $updatedAt;
/**
* @ORM\Column(type="date", name="birthday", nullable=true)
* @Assert\NotBlank()
*/
protected $birthday;
/**
* @var ArrayCollection $adresses
*
* @ORM\OneToMany(targetEntity="Fchanal\UserBundle\Entity\Address", mappedBy="user", cascade={"persist"})
*/
private $address;
public function addAddress(Address $address)
{
$address->setUser($this);
if (!$this->address->contains($address)) {
$this->address->add($address);
}
}
public function getAddress()
{
return $this->address;
}
public function __construct()
{
parent::__construct();
$this->setCreatedAt(new \DateTime());
$this->address = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
public function getLastName()
{
return $this->lastName;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
}
public function getBirthday()
{
return $this->birthday;
}
public function setBirthday($birthday)
{
$this->birthday = $birthday;
}
/**
* Get creation time.
*
* @return \DateTime
*/
public function getCreatedAt()
{
return $this->createdAt;
}
/**
* Set creation time.
*
* @param \DateTime $createdAt
* @return $this
*/
public function setCreatedAt(\DateTime $createdAt)
{
$this->createdAt = $createdAt;
return $this;
}
/**
* Get the time of last update.
*
* @return \DateTime
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* Set the time of last update.
*
* @param \DateTime $updatedAt
*/
public function setUpdatedAt(\DateTime $updatedAt)
{
$this->updatedAt = $updatedAt;
}
} |
mon entité Address
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| /**
* @ORM\Entity(repositoryClass="Fchanal\UserBundle\Entity\AddressRepository")
* @ORM\Table(name="addresse")
*/
class Address
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="address", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
protected $user;
/**
* @ORM\Column(name="first_name", type="string", nullable=true)
* @Assert\NotBlank()
*/
protected $firstName;
/**
* @ORM\Column(name="last_name", type="string", nullable=true)
*/
protected $lastName;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
public function getLastName()
{
return $this->lastName;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
}
public function setUser(User $user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user;
}
} |
mon ResitrationFormType (FOS)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class RegistrationFormType extends BaseType
{
protected $userManager;
public function __construct($class, UserManager $userManager)
{
parent::__construct($class);
$this->userManager = $userManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
// add your custom field
$builder
->remove('username') // Unuse in your ecommerce solution
->add('firstName', 'text')
->add('lastName', 'text')
->add('birthday', 'date', array(
'widget' => 'choice',
'years' => range(date('Y') - 10, date('Y') - 100),
'empty_value' => array('year' => 'year' , 'month' => 'month' , 'day' => 'day')
))
->add('address', 'collection', array(
'type' => new AddressType(),
'allow_add' => true,
))
;
}
public function getParent()
{
return 'fos_user_registration';
}
public function getName()
{
return 'fchanal_userbundle_registration';
}
} |
Mes problématiques :
- Déja je n'arrive pas à faire afficher la partie address dans le formulaire sans utiliser javascript (prototype) dommage, car lors de l'inscription je veux juste ajouter une seule addresse.
- Lors de la soumission de mon formulaire, l'enregistrement de "user_id" ne se fait pas en base
Par contre ce code fonctionne dans un controller :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $user = new User();
$user->setUsername('username');
$user->setUsernameCanonical('usernamecanonical');
$user->setEmail('test@acme.com');
$user->setPassword('pass');
$address = new Address();
$address->setFirstName('ACfirstname');
$address->setLastName('AClastname');
$address->setUser($user);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->persist($address);
$em->flush(); |
Merci d'avance de votre aide car la je pige plus rien sur un truc tout simple..