Je suis en train de développer une application de gestion d'un parc automobile. Pour cela, j'ai deux fonctions importantes qui sont le relevé kilométrique et l'ajout de carburant (faire le plein).
J'ai sans aucun soucis créé ma fonction de relevé kilométrique :
public function addKm(?Vehicule $vehicule, Request $request): Response
{
// Création du formulaire
$km = new ReleveKilometrique;
$form = $this->createForm(AddKmType::class, $km);
// analyse de la requête par le formulaire
$form->handleRequest($request);
//Traitement des données reçues du formulaire
if($form->isSubmitted()){// && $form->isValid()
if($km->getVehicule() == null){
// Ajout du vehicule
$km->setVehicule($vehicule);
}
$this->manager->persist($km);
$this->manager->flush();
//Retour à la page précédente
return $this->redirectToRoute('lireVl', ['id'=>$vehicule->getId()]);
}
//Génération du controller
return $this->renderForm('garage/addKm.html.twig', [
'form' => $form,
'vehicule' => $vehicule,
]);
}
Et le formulaire qui va avec :
{% block body %}
{# Gestion de présélection de véhicule
Désactivation du menu de sélection de véhicule #}
{% set disabled = false %}
{% set kmEnCours = 0 %}
{% if vehicule != null %}
{% set disabled = true %}
{% set kmEnCours = vehicule.getKmEnCours %}
{% endif %}
{{form_start(form)}}
<div class="col-md-4">
{# DATE #}
{{form_row(
form.date,{
'label':"Date :"
}
)}}
</div>
<div class="col-md-4">
{# KM #}
{{form_row(
form.km,{
'label':"Compteur :",
'value':kmEnCours
}
)}}
</div>
<div class="col-md-4">
{# VEHICULE #}
{{form_row(
form.vehicule,{
'label':"Véhicule :",
'placeholder':vehicule,
'attr':{
'disabled':disabled,
}
}
)}}
</div>
<button type="submit" id="add_km_Valider" name="add_km[Valider]" class="btn btn-success">Valider</button>
{{form_end(form)}}
Mais, lors d'un relevé kilométrique, l'ajout de carburant est lié au relevé kilométrique. Le but est que, qaund un utilisateur fait le plein, il effectue également un relevé kilométrique. Et là, franchement, après avoir suivi le cours, je ne vois pas du tout comment faire...
Pour l'instant j'ai fait ça :
public function addFuel(?Vehicule $vehicule, Request $request): Response
{
// Création du formulaire
$fuel = new Carburant;
$km = new ReleveKilometrique;
$form = $this->createForm(AddFuelType::class, $fuel);
// analyse de la requête par le formulaire
$form->handleRequest($request);
//Traitement des données reçues du formilaire
if($form->isSubmitted()){// && $form->isValid()
if($fuel->getVehicule() == null){
// Ajout du vehicule
$fuel->setVehicule($vehicule);
}
if($fuel->getTypeCarburant() == null){
// Ajout du type de carburant
$fuel->setTypeCarburant($vehicule);
}
$this->manager->persist($fuel);
$this->manager->flush();
//Retour à la page précédente
return $this->redirectToRoute('lireVl', ['id'=>$vehicule->getId()]);
}
//Génération du controller
return $this->renderForm('garage/addFuel.html.twig', [
'form' => $form,
'vehicule' => $vehicule,
]);
}
Salut, je ne me retrouve pas vraiment dans ton code mais as tu verifier le controlleur qui doit mettre ces valeurs dans la base de donnees ?
Tu fais un createForm(AddFuelType::class, $fuel) donc c'est normal que seul l'ajout de carburant soit pris en compte. Tu devrais customiser ton form pour ton cas et manipuler les donnees en consequence.
Salut, je ne me retrouve pas vraiment dans ton code mais as tu verifier le controlleur qui doit mettre ces valeurs dans la base de donnees ?
Tu fais un createForm(AddFuelType::class, $fuel) donc c'est normal que seul l'ajout de carburant soit pris en compte. Tu devrais customiser ton form pour ton cas et manipuler les donnees en consequence.
Merci de t'intéressez à mon sujet.
Comment fait-on pour customiser le form (en dehors des customisations dans twig) ?
Il y a possibilité de mettre plusieurs Type dans le createForm ?
Si je suis ceci, tu pourrais rajouter ceci a ton formulaire AddFuelType, dans la methode buildForm() :$builder->add('addkm', AddKmType::class);
Puis a l'affichage, a la place de : form.km ou form.vehicule tu vas ecrire form.addkm.km form.addkm.vehicule . C'est pareil mais la tu geres un seul formulaire.
Puis le controlleur(addFuel) resembleras a ceci:
public function addFuel(?Vehicule $vehicule, Request $request): Response
{
$km = new ReleveKilometrique; // Ligne 5
if($form->isSubmitted()){// && $form->isValid()
$data = $form->getData();
$km = $data['addKm'];
$fuel = $data... // Remplir chaque champ manuellement
$this->manager->persist($fuel, $km); // Ligne 23
ou persist($fuel) puis persist($km) si on peut mettre les deux en meme temps.
$this->manager->flush();
//
}
}
Bon en faisant ainsi y'aura pas mal de changements peut-etre pas 'necessaires' pour toi.
Mais tu peux garder ton code et persister $km, a la ligne 23 tu as fait uniquement persist($fuel) c'est pourquoi ton $km n'etais pas pris en compte. (je viens de le remarquer desole)
Un truc m'interpelle sans connaître ta modélisation des entités. L'ajout de carburant et les km sont liés à une voiture alors pourquoi ne transmets tu pas à ton form l'objet voiture qui fait l'objet de la modification (ajout de carburant à une valeur kilométrique donnée). L'objet voiture pourrait être choisie avant en fonction par exemple de l'utilisateur ou autre critère.
ALors, j'avais déjà dans la methode buildForm() :$builder->add('km', AddKmType::class);
Mais c'est dans mon rendue que je faisais une erreur. au lieu de
{{form_row(form.km.km)}}
J'avais mis
{{form_row(form.km)}}
Ce qui empêchait le bon fonctionnement.
Un petit persist sur $fuel et $km et tout est parfait.
- Edité par Aklain52 21 mai 2022 à 15:20:10
Apprendre est ma plus grande passion.
Symfony 5 - Formulaire contenant 2 entities
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Apprendre est ma plus grande passion.
Apprendre est ma plus grande passion.
Apprendre est ma plus grande passion.