bonjour,
j'ai un problème sur l'affichage de mon formulaire de type OneToMany qui me retour ceci:
The form's view data is expected to be an instance of class
BackOffice\Model\UserInfo, but is an instance of class Doctrine\Common\Collections\ArrayCollection. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms an instance of class Doctrine\Common\Collections\ArrayCollection to an instance of BackOffice\Model\UserInfo

et si j'enlève le changement type de UserInfo dans ma classe User::__construct
ça me renvoi ceci

Neither the property "UserInfo" nor one of the methods "setUserInfo()", "set()" or "call()" exist and have public access in class "Proxies__CG__\VS\UserBundle\Entity\Description".
voici mes codes:

//le formulaire User
namespace BackOffice\Formulaire;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use BackOffice\Formulaire\UserInfoType;

class UserType extends AbstractType{
/*..*/
    public function builder(FormBuilderInterface $builder, array $options){
        $builder->add('UserInfo',new UserInfoType);
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'BackOffice\Model\User'
            ));
        }

}
//le formulaire UserInfo
namespace BackOffice\Formulaire;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use BackOffice\Formulaire\UserInfoType;

class UserInfoType extends AbstractType{
    public function builder(FormBuilderInterface $builder, array $options){
        $builder->add('adr1','text',array('attr'=>array('placeholder'=>'adresse1')));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'BackOffice\Model\UserInfo'
            ));
        }
}

//le model User
namespace BackOffice\Model;
use Symfony\Component\Security\Core\User\UserInterface;
use UserInfo;
class User extends UserInterface{
/*.autre attribut.*/
    /**
    *@ORM\OneToMany(targetEntity="UserInfo", mappedBy="user", cascade={"persist"})
    *@ORM\JoinColumn(nullable=false)
    */
    private $UserInfo;

    public function __construct(){
    $this->UserInfo = new \Doctrine\Common\Collections\ArrayCollection();
    }
    public function addUserInfo(UserInfo $userinfo){
    $this->UserInfo[] = $userinfo;
    return $this;
    }

    public function removeUserInfo(UserInfo $userinfo){
    $this->UserInfo->removeElement($userinfo);
    return $this;
    }
    public function getUserInfo(){
    return $this->UserInfo;
    }
}

//le modèle UserInfo:

namespace BackOffice\Model;
use User;
class UserInfo{
/*.autre attribut.*/
    /**
    *@ORM\ManyToOne(targetEntity="User", inversedBy="UserInfo", cascade={"persist"})
    *@ORM\JoinColumn(nullable=false)
    */
    private $user;
    public function setUser(User $user){
        $this->user = $user;
    }
    public function getUser(){
    return $this->user;
    }

}

en tombant sur d'autre forum, je vois qu'il faut ajouté un attribut multiple =true à la formulaire UserType, cela n'est valable qu'au type de champ entité ou collection mais moi je veux avec un type "entityType" comme UserInfoType, à part de créer une formulaire personnalisé pour ajouter l'attribut multiple, y a-t-il d'autre solution de ce genre.
Merci.

1 réponse


nicovak
Réponse acceptée

Une onetomany sous entend un type collection DOC
Dans ton formulaire tu veux ajouter plusieurs autre entités en les créant. L'erreur "Proxies__CG\VS\UserBundle\Entity\Description". vient du lazy loading de doctrine. Tu peux spécifier un fetch EAGER dans tes relations pour eviter ce genre d'erreurs.
Exemple: *ManyToOne(targetEntity="Group", cascade={"all"}, fetch="EAGER")