Souci formulaire

Par CVNeo, il y a 7 ans


Bonjour,

J'ai deux tables, une User et une autre lié one-to-one pour des détails de profiles.

Afin de modifier les infos dans la table lié je passe l'IDUser en paramêtre, seulement cela fonctionne que si une ligne est déjà présente dans la table lié pour update mais si c'est un insert j'ai cette erreur :

EntityManager#persist() expects parameter 1 to be an entity object, NULL given.

/** * @Route("/{_locale}/profile/", name="profile") * @param UserSocial|null $userSocial * @param Request $request * @param ObjectManager $manager * @return \Symfony\Component\HttpFoundation\Response */ public function index(UserSocial $UserSocial = null,Request $request, ObjectManager $manager) { if(!$UserSocial) { $UserSocial = new UserSocial(); } $UserSocial = $this->getDoctrine() ->getRepository('App\Entity\UserSocial') ->findOneByUser($this->getUser()); $form = $this->createForm(UserSocialType::class, $UserSocial); $form->handleRequest($request); if($form->isSubmitted() && $form->isValid()){ $manager->persist($UserSocial); $manager->flush(); return $this->redirectToRoute('profile'); } return $this->render('profile/index.html.twig', [ 'form' => $form->createView() ]); }

une idée ?
Merci

9 réponses

CVNeo, il y a 7 ans

En faite je me demande si il serait pas plus simple de passer l'id de l'user avant le persiste mais comment ?

if($form->isSubmitted() && $form->isValid()){ //Du genre : $UserSocial['IDUser'] = $IDUser; $manager->persist($UserSocial); $manager->flush(); return $this->redirectToRoute('profile'); }
Digivia, il y a 7 ans

Le problème est que tu vas chercher l'entité UserSocial... Mais si elle n'existe pas, elle a une valeur null.
essaye plutôt :

if (null === $UserSocial) { $UserSocial = new UserSocial(); // Ici tu initialises le User concerné par le profil à modifier... // Tu pourrais aussi le faire après soumission du form, mais si jamais tu as besoin d'un EventListener dans ton form, tu auras le User dans ton entité UserSocial $UserSocial->setUser($this->getUser()); }

Donc soit tu passes une entité UserSocial (modification d'un profil), soit tu veux en créer un, et il faut que tu définisses la relation one-to-one avec User.
Et ce code est à supprimer :

// A supprimer : $UserSocial = $this->getDoctrine() ->getRepository('App\Entity\UserSocial') ->findOneByUser($this->getUser());
CVNeo, il y a 7 ans

Ok merci pour l'explication cela fonctionne :)
Pas facile les débuts :)

Digivia, il y a 7 ans

C'est vrai qu'au début il faut s'habituer à manipuler les entités, mais ça va venir vite, tu verras. Et c'est tellement pratique qu'après tu te demanderas comment tu faisait avant :)

CVNeo, il y a 7 ans

Hum en fait du coup il m'affiche plus l'enregistrement existant lié dans le formulaire :(

CVNeo, il y a 7 ans

Je dois mal m'y prendre pour appeler les infos à entrée dans le formualire ?
J'ai du mal à comprendre comment gère les liaisons de tables ...

CVNeo, il y a 7 ans

En fait comment appler les data de la table lié via l'id de l'user connecté ?

Pour l'instant je le fait via un find :

$UserSocial = $this->getDoctrine() ->getRepository('App\Entity\UserSocial') ->findOneByUser(1);

y a une autre méthode ?

Digivia, il y a 7 ans

Ok, j'ai compris ce que tu veux faire, ajoute ce code avant :

$UserSocial = $this->getDoctrine() ->getRepository('App\Entity\UserSocial') ->findOneByUser($this->getUser());

Puis :

if (null === $UserSocial) { $UserSocial = new UserSocial(); $UserSocial->setUser($this->getUser()); }

Ainsi, tu commence à chercher si le profile user existe, sinon, tu l'initialise pour le créer au travers du form...

Digivia, il y a 7 ans

Tu avais la solution, mais pas dans le bon ordre ;)