2011-09-10 7 views
5

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.

Odpowiedz

0

Można zapobiec fisplaying "doktryna \ Common \ Collections \ ArrayCollection @ 0000000062cf59cf00000000e32fc883" wiadomości poprzez $ form-> get ('telefon') -> setData (''); Co do reszty, nie mogę ci pomóc, ja również jak odpowiedź ...

1

Spróbuj z

/** 
* @var Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\OneToMany(targetEntity="Phone", mappedBy="user", cascade={"persist"}) 
*/ 
private $phone; 

Dla Symfony HTML-Form z OneToMany relacji, trzeba dodać kaskadę = { "utrzymują "} w adnotacji