Mam jednostki użytkownika i telefonu ze związkiem OneToMany między nimi.Symfony2 Embedded Entity
Moja jednostka użytkownika:
namespace Project\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Project\UserBundle\Entity\User
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/* ..... */
/**
* @var Doctrine\Common\Collections\ArrayCollection
*
* @ORM\OneToMany(targetEntity="Phone", mappedBy="user")
*/
private $phone;
public function __construct()
{
$this->phone = new ArrayCollection();
}
/**
* Add phone
*
* @param Project\UserBundle\Entity\Phone $phone
*/
public function addPhone(\Project\UserBundle\Entity\Phone $phone)
{
$this->phone[] = $phone;
}
/**
* Get phone
*
* @return Doctrine\Common\Collections\Collection
*/
public function getPhone()
{
return $this->phone;
}
/* ..... */
}
A moja jednostka Telefon:
namespace Project\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Project\UserBundle\Entity\Phone
*
* @ORM\Table(name="user_phone")
* @ORM\Entity
*/
class Phone
{
/* ..... */
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="phone")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @var string $number
*
* @ORM\Column(name="number", type="string", length=128)
*/
private $number;
/**
* Set user
*
* @param Project\UserBundle\Entity\User $user
*/
public function setUser(\Project\UserBundle\Entity\User $user)
{
$this->user = $user;
}
/**
* Get user
*
* @return Project\UserBundle\Entity\User
*/
public function getUser()
{
return $this->user;
}
/* ..... */
}
usunąłem część kodu aby to trochę krótki, mam pole Id i dodatkowe inne pola związane z podmiotami.
W moim kontrolera, to robię:
public function showFormAction($entity)
{
/* ..... */
$user = new User();
$phone = new Phone();
$user->addPhone($phone);
$form = $this->createForm(new UserRegister(), $user);
/* ..... */
}
W mojej klasie forma:
class UserRegister extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('email', 'text')
->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => 'The password fields must match.',
'options' => array('label' => 'Password'),
'error_bubbling' => false)
)
->add('first_name', 'text')
->add('last_name', 'text')
->add('phone', 'text');
}
public function getName()
{
return 'register';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Project\UserBundle\Entity\User',
);
}
}
I w moim gałązka Szablon:
<div>
{{ form_errors(form.phone) }}
{{ form_label(form.phone, null, { 'attr': {'class': 'span-3'} }) }}
{{ form_widget(form.phone, { 'attr': {'class': 'text'} }) }}
</div>
co mam Próba zasadniczo polega na umożliwieniu użytkownikowi posiadania wielu numerów telefonicznych, stąd posiadanie relacji OneToMany pomiędzy Użytkownikiem a Telefonem. W mojej formie chcę pokazać w polu formularza "numer" jednostki "Telefon", a następnie dodać pojedynczy rekord telefonu do danego użytkownika.
Obecnie z powyższym kodem, forma jest trójwymiarowa, ale pokazujący:
"Doktryna \ Common \ Collections \ ArrayCollection @ 0000000062cf59cf00000000e32fc883" w polu Phone.
Zmiana "telefonu" na "kolekcja" w wynikach klasy formularza na Twig_Runtime_Error "Telefon nie mógł zostać przekonwertowany na ciąg znaków" 500 wewnętrzny błąd serwera. Próbowałem renderować telefon jako "form.phone.number" w celu uzyskania elementu number w elemencie Phone, jednak jest napisane:
"Numer metody" "dla obiektu" Symfony \ Component \ Form \ FormView "nie istnieje "
Próbowałem również zmienić typ" telefonu "w klasie formularza na" obiekt "i dodano tablicę do odzwierciedlenia przestrzeni nazw jednostki, jednak zawsze wyświetlałaby ona komunikat" Musisz zarządzać swoim obiektem ".
Jestem zagubiony i nie jestem pewien, jak to zrobić, przeczytałem gdzieś, że mogę osobno utworzyć wystąpienia obiektów User i Phone, wprowadzać zmiany, a następnie utrzymywać je jeden po drugim. Nie jestem pewien, czy jest to najlepsza praktyka czy nie, moim podejściem było stworzenie obiektu użytkownika, dodanie do niego rekordu Telefonu, a następnie utrwalenie obiektu Użytkownika.