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
{
/**
@ORM\Column(type="integer")
*/
private $id;
/**
@ORM\Column(type="string", length=255, nullable=true)
*/
private $img;
/**
// ... 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
{
/**
@ORM\Column(type="integer")
*/
private $id;
/**
@ORM\Column(type="string", length=250, nullable=true)
*/
private $way;
/**
@ORM\Column(type="string", length=10, nullable=true)
*/
private $pc;
/**
@ORM\Column(type="string", length=30, nullable=true)
*/
private $city;
public function getId(): ?int
{
return $this->id;
}
public function getWay(): ?string
{
return $this->way;
}
public function setWay(?string $way): self
{
$this->way = $way;
return $this;
}
public function getPc(): ?string
{
return $this->pc;
}
public function setPc(?string $pc): self
{
$this->pc = $pc;
return $this;
}
public function getCity(): ?string
{
return $this->city;
}
public function setCity(?string $city): self
{
$this->city = $city;
return $this;
}
}`
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
Bonjour,
J'ai réussi à trouver une solutionn avec :
$address= $addressForm->getNormData();
Thanks for the information, I will try to figure it out for more. Keep sharing such informative post keep suggesting such post.
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', ])
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