2013-07-26 15 views
6

Ciao a tutti Ho qualche problema con Symfony2 FormBuilder, in realtà, ho un utente entità collegato (OneByOne) a un'entità Indirizzo, sembra essere molto semplice ma quando i ' m cercando di incorporare il modulo AddressType nella UserType quella che sto di fronte a questa eccezione:Symfony2: Problema dati visualizzazione modulo

visualizzare i dati del modulo dovrebbe essere un'istanza della classe Acme \ Bundle \ AddressBundle \ Entity \ Adresse, ma è un'istanza della classe Doctrine \ Common \ Collections \ ArrayCollection. È possibile evitare questo errore impostando l'opzione "data_class" su null o aggiungendo un trasformatore di visualizzazione che trasforma un'istanza di classe Doctrine \ Common \ Collections \ ArrayCollection in un'istanza di Acme \ Bundle \ AddressBundle \ Entity \ Adresse

ho messo qui qualche codice (ridotto a essere leggibile) per rendere il mio problema più understable:

la mia classe utente (che si estende del FosUserBundle uno):

class User extends BaseUser 
{ 
    ... 

    /** 
    * @ORM\OneToOne(targetEntity="Acme\bundle\AddressBundle\Entity\Address", cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(nullable=true) 
    * @Assert\Valid 
    */ 
    public $address; 

    ....... 

} 

la Linke Funzione d tipo di modulo buildForm:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     // add your custom field 
     $builder->add('name','text') 
       ->add('address',new AddressType(),array(

          'data_class' => 'Acme\Bundle\AddressBundle\Entity\Address' 

        ) 
       ); 


    } 

mio indirizzo tipo di modulo:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('city','text') 
       ->add('title','text'); 
    } 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\Bundle\AddressBundle\Entity\Address' 
     )); 
    } 

vi ringrazio in anticipo per il vostro aiuto!

+0

Hai provato ciò che è suggerito nel messaggio di errore? – cheesemacfly

+0

Sì, l'ho provato, ma quando lo faccio ho questo messaggio: spl_object_hash() si aspetta che il parametro 1 sia oggetto, stringa data –

risposta

1

Un problema è che si indirizzo fatto una proprietà pubblica. In Doctrine 2 è necessario rendere le proprietà private o protette. D2 si basa su questo per implementare il caricamento lento. Fondamentalmente, il tuo indirizzo non viene mai caricato, anche se il motivo per cui stai ricevendo un array è un po 'un enigma. Stai inizializzando l'indirizzo come array nel tuo costruttore? Forse un errore di copia/incolla?

si dovrebbe avere:

class User extends BaseUser 
{ 
    protected $address; 

    public function getAddress() { return $this->address; } 

Sarà inoltre necessario per garantire che un UserObject ha sempre un oggetto Indirizzo o la forma si lamenterà.

========================================= ==========

Guardando il tuo pastebin, vedo:

class User extends BaseUser 
{ 
public function __construct() 
{ 
    $this->adresse = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

che non solo spiega la matrice indesiderati, ma sarà anche rovinare la classe base di utenti fos visto che è costruttore è non chiamato.

Suggerisco di spogliare i tipi di modulo fino al minimo utente/indirizzo e far funzionare le cose. Quindi aggiungi la tua villia e tutte le altre cose. In effetti, inizia semplicemente con la creazione di un utente semplice e quindi aggiungi l'indirizzo.

Non hai mostrato come stavi creando l'oggetto utente ma ricorda che spetta a te assicurarti che un oggetto indirizzo esista prima che il modulo inizi. Doctrine non lo creerà per te.

+1

Ciao Cerad, grazie, ho apportato modifiche da pubblico a protetto, non sto inizializzando l'indirizzo per essere un array nel costruttore e l'utente ha sempre un oggetto Address collegato a –

+0

Il tuo messaggio di errore ha ... Entity \ Adresse ... ma la tua entità si chiama Address. Problema di copia incolla? Sei sicuro di passare un'entità Utente al modulo? È quasi come se avessi due versioni di User sul tuo sistema. – Cerad

+0

Cerad, è un problema di copia incolla, considera indirizzo come indirizzo, sto lavorando con FOSUserBundle e il suo RegistrationFormType, l'unica entità utente utilizzata è FOSUSerBundle estesa (Acme/Bundle/UserBundle/User) –

0

L'indirizzo è un'entità, quindi è necessario informare il modulo che il tipo di campo viene caricato da un'entità. Vedi qui: http://symfony.com/doc/2.2/reference/forms/types/entity.html

provare qualcosa di simile:

$builder->add('name', 'text') 
     ->add('address', 'entity',array(
       'class' => 'AddressBundle:Address', 
       'property' => 'address' 
)); 
+2

Un tipo di entità è usato quando devi scegliere da una lista di entità esistenti. Non esattamente ciò che l'op sta cercando di fare. – Cerad

Problemi correlati