Formulaires "imbriqués" avec 2 entités (User et Address) symfony 5.3

Par Caill0u, il y a 4 ans


Bonjour,
Je cherche à gérer une page de profil utilisateur. derrière cette page se trouve notamment 2 entités reliées avec une relation ManyToOne (User - ManyToOne - Address)

L'objectif est de pouvoir afficher dans un formulaire, en plus des autres infos de l'utilisateur, l'adresse complète (en 3 champs séparés de la table Address les paramètres "way, "pc", "city") si elle à déjà été renseignée ou donner la possibilité à l'utilisateur connecter de renseigner ces 3 champs.

Mon formulaire
`
class EditProfileType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, ['label' => 'Nom: ', 'required' => false])
->add('address', EntityType::class, [
'label' => 'Adresse: ',
'class' => Address::class,
'required' => false
])
//... + d'autres champs

// ne fonctionne pas
// ->add('address', TextType::class, [
// 'label' => 'Adresse: ',
// 'required' => false
// ])
// ->add('address', TextType::class, [
// 'label' => 'CP: ',
// 'required' => false
// ])
// ->add('address', TextType::class, [
// 'label' => 'Ville: ',
// 'required' => false
// ]);
->add('Save', SubmitType::class, ["label" => 'Enregistrer!']);
}
}
Dans UserController
class UserController extends AbstractController
{

/**
 * @Route("/edit-profile/{id}", name="app_profile", requirements={"id": "\d+"}, methods={"GET", "POST"})
 */
public function editProfile($id,EntityManagerInterface $em, Request $request, SluggerInterface $slugger)
{
    //Recuperation de l'instance de repository
    $userRepo = $this->getDoctrine()->getRepository(User::class);
    $user= $userRepo->find($id);

// $genderRepo = $this->getDoctrine()->getRepository(Gender::class);
// $gender= $genderRepo->find($id);

    $addressRepo = $this->getDoctrine()->getRepository(Gender::class);
    $address= $addressRepo->find($id);

    //----- creation du Formulaire
    //on crée une instance de la classe Form à partir de la classe User avec les données de $user
    $editProfileForm = $this->createForm(EditProfileType::class, $user);

    $editProfileForm->handleRequest($request);

    //----- Verification soumission et validité du formulaire
    if ($editProfileForm->isSubmitted()&& $editProfileForm->isValid())
    {
        $em->persist($user);
        $em->flush();
        //Ajout du message flash
        $this->addFlash('success', 'Profil enregistré!');

        return $this->redirectToRoute('general');
    }

    //redirection vers la vue "profile"
    return $this->render('user/profile.html.twig', [
        'user' => $user,
        'address' => $address,
        'editProfileForm' => $editProfileForm ->createView(),
    ]);
}

}
Dans User
class User implements UserInterface, \Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface
{
/**

// ... d'autres variables

/**
 * @ORM\ManyToOne(targetEntity=Address::class)
 */
private $address;

public function __construct()
{
    $this->article = new ArrayCollection();
    $this->comment = new ArrayCollection();
    $this->address = new ArrayCollection();// test
    $this->admin = false;
}

public function getId(): ?int
{
    return $this->id;
}

public function getName(): ?string
{
    return $this->name;
}

public function setName(?string $name): self
{
    $this->name = $name;

    return $this;
}

//...

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

public function setAddress(?Address $address): self
{
    $this->address = $address;

    return $this;
} 

}
Dans Address
class Address
{
/**

Dans mon twig
`
{% block body %}
<h2>Profil</h2>
<div>
{{ form_start(editProfileForm) }}

    {{ form_row(editProfileForm.name) }}

    {{ form_row(editProfileForm.address) }}

    {{ form_end(editProfileForm) }}
</div>

{% endblock %}
`

Ce que je veux

je cherche à afficher 3 champs de texte pour pouvoir enregistrer l'adresse de l'utilisateur.

Ce que j'obtiens

J'obtiens l'erreur suivante:
Object of class Proxies__CG__\App\Entity\Address could not be converted to string

4 réponses

alanwalker, il y a 4 ans

Thanks for the information, I will try to figure it out for more. Keep sharing such informative post keep suggesting such post.

Prepaidgiftbalance

aka-aka, il y a 4 ans

Bonjour, c'est difficile de lire ton code met le dans les bonnes balises...

Tu obtiens cette erreure car tu essaye d'afficher l'objet Adress.
Ajoute : 'choice_label' => 'name',
dans ton EditProfileType

->add('address', EntityType::class, [ 'label' => 'Adresse: ', 'class' => Address::class, 'required' => false, 'choice_label' => 'name', ])

Caill0u, il y a 4 ans

Bonjour,
J'ai réussi à trouver une solutionn avec :
$address= $addressForm->getNormData();

herywalter, il y a 4 ans

Excellent web site. A lot of useful information here. I’m sending it to a few pals and also sharing in delicious. And of course, thank you to your effort! Crediblebh