I am currently trying to update a Person in a table. The Table looks the following:
I want to be able to update the First-and Lastname and also the nin when I click on the Submit button. My twig file looks like this:
{% block body %} <h1>All our Patients</h1> <table class="table"> <thead class="thead-dark"> <tr> <th scope="col">#</th> <th scope="col">Firstname</th> <th scope="col">Lastname</th> <th scope="col">NIN</th> <th scope="col">Update</th> </tr> </thead> <tbody> {% for person in persons %} <tr> <form action="{{ path('updatePerson', {"id": person.id}) }}" method="post"> <td>{{ person.id }}</td> <td><input type="text" id="firstName" value="{{ person.firstName }}"></td> <td><input type="text" id="lastName" value="{{ person.lastName }}"></td> <td><input type="text" id="nin" value="{{ person.nin }}"></td> <td><input class="btn btn-primary" type="submit" value="Submit"></td> </form> </tr> {% endfor %} </tbody> </table> {% endblock %}
And my controller is the following:
/** * @Route("/user/persons/{id}", name="updatePerson") */ public function updatePerson(int $id): Response { $entityManager = $this->getDoctrine()->getManager(); $person = $entityManager->getRepository(Person::class)->find($id); if (!$person) { throw $this->createNotFoundException( 'No person found for id '.$id ); } $person->setFirstName('FirstName'); $person->setLastName('Lastname'); $person->setNin('00.09.69-420.2'); $entityManager->flush(); $persons = $this->getDoctrine()->getRepository(Person::class)->findAll(); return $this->render('user/person/index.html.twig', [ 'persons' => $persons, ]); }
Currently when I click update I just fill it what’s in the “setFirstName(‘FirstName’);”. I don’t really know how to pass in the correct data so it updates correctly? how would I obtain the changes I want to make by pressing submit?
Advertisement
Answer
The quick fix (not recommended):
You should add the name
attribute for text input tags
<td><input type="text" id="firstName" name="firstName" value="{{ person.firstName }}"></td> <td><input type="text" id="lastName" name="lastName" value="{{ person.lastName }}"></td> <td><input type="text" id="nin" name="nin" value="{{ person.nin }}"></td>
and modify controller:
/** * @Route("/user/persons/{id}", name="updatePerson") */ public function updatePerson(Request $request, Person $person): Response { $entityManager = $this->getDoctrine()->getManager(); $person->setFirstName($request->request('firstName')); $person->setLastName($request->request('lastName')); $person->setNin($request->request('nin'); $entityManager->flush(); $persons = $this->getDoctrine()->getRepository(Person::class)->findAll(); return $this->render('user/person/index.html.twig', [ 'persons' => $persons, ]); }
But for the best practice, you should use Symfony Form Collection and add validation rules for fields