IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Préremplir un champ de formulaire depuis le controller ?


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 134
    Par défaut Préremplir un champ de formulaire depuis le controller ?
    Bonjour à tous,

    Je voudrais que le champ 'service' qui est un select soit prérempli par l'id du service qui est récupéré par le controller ci-bas...
    J'ai essayé d'injecter la variable directement dans les paramètres du "create form" , rien n'y fait...

    D'autre part, mon formulaire n'envoie rien en bdd alors que la requête revient comme étant correcte...

    Merci d'avance pour votre expertise

    MailContactController.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    namespace App\Controller;
     
    use App\Form\ContactFormType;
    use App\Repository\ServicesRepository;
    use Symfony\Bridge\Twig\Mime\TemplatedEmail;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Mailer\MailerInterface;
    use Symfony\Component\Routing\Annotation\Route;
     
    #[Route('/contact-par-mail', name: 'app_contact_par_mail_')]
    class MailContactController extends AbstractController
    {
        #[Route('/envoyer-mail/{id}/{slug}', name: 'envoyer_mail')]
        public function envoyerMail($slug, MailerInterface $mailer, Request $request, ServicesRepository $servicesRepository, $id): Response
        {
            //Si l'on se trouve sur la page ou fiche d'un service
            $service_a_contacter = $servicesRepository->find($id);
            $idService = $service_a_contacter->getId();
     
            //Recherche des adresses mails du service
            $mail1 = $service_a_contacter->getMailService1();
            $placeholder = "Indiquez ici ce qui vous amène à nous contacter sans oublier vos coordonnées complète et les données du véhicule concerné.";
            $slug = $service_a_contacter->getSlug();
     
            $form = $this->createForm(ContactFormType::class);
            $contact = $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {  
     
                $email = (new TemplatedEmail())
                    ->from($contact->get('email')->getData())
                    ->to($mail1)
                    ->subject($contact->get('subject')->getData())
                    ->htmlTemplate('emails/contact_service.html.twig')
                    ->context([
                        'service' => $idService,
                        'mail' => $mail1,
                        'message' => $contact->get('message')->getData()
                    ]);
                    dd($email);
                $mailer->send($email);
     
                $this->addFlash('success', 'Le mail a bien été envoyé au service demandé, nous vous répondrons dans les meilleurs délais.');
                return $this->redirectToRoute('app_index', [
                    'slug' => $slug
                ]);
            }
     
            return $this->render('_partials/_modale-contact.html.twig', [
                'mail1' => $mail1,
                'service' => $service_a_contacter,
                'idService' => $idService,
                'form' => $form->createView()
            ]);
        }
    }
    ContactFormType.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    namespace App\Form;
     
    use App\Entity\Services;
    use FOS\CKEditorBundle\Form\Type\CKEditorType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\EmailType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Validator\Constraints\NotBlank;
    use Symfony\Component\Validator\Constraints\NotNull;
     
    class ContactFormType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options): void
        {
            $builder
                ->add('service', EntityType::class, [
                    'class' => Services::class,
                    'label' => 'Service contacté : ',
                ])
                ->add('subject', TextType::class, [
                    'label' => "Objet : ",
                    'constraints' => new NotBlank(),
                    'attr' => [
                        'class' => 'form-control',
                        'placeholder' => 'Décrivez-ici votre demande'
                    ],
     
                ])
                ->add('email', EmailType::class, [
                    'label' => 'Votre e-mail :',
                    'constraints' => new NotBlank(),
                    'attr' => ['class' => 'form-control', 'placeholder' => 'Votre email est obligatoire !'],
     
                ])
                ->add('message', CKEditorType::class, [
                    'label' => 'Votre message + coordonnées de contact + données du véhicule concerné : ',
                    'constraints' => new NotBlank(),
                    'attr' => ['class' => 'form-control'],
                ]);
        }
     
        public function configureOptions(OptionsResolver $resolver): void
        {
            $resolver->setDefaults([
     
            ]);
        }
    }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut
    Bonjour,

    Une idée à tester : dans ton FormType, tu peux utiliser la variable $options.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function buildForm(FormBuilderInterface $builder, array $options): void
        {
            $service = $options['service'];
     
            $builder
                ->add('service', EntityType::class, [
                    'class' => Services::class,
                    'label' => 'Service contacté : ',
                    'data' => $service
                ])
    ...
    Dans ton controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $form = $this->createForm(ContactFormType::class, $contact, array(
        'service' => $idService,
    ));
    En espérant que ça aide, dis nous ce que ça donne...

  3. #3
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mars 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2023
    Messages : 33
    Par défaut
    Bonjour,

    Il semble que vous souhaitiez préremplir le champ "service" de votre formulaire avec l'ID du service récupéré dans votre contrôleur. Vous avez déjà essayé d'injecter la variable directement dans les paramètres de création du formulaire, mais cela n'a pas fonctionné.

    Pour préremplir le champ "service" avec l'ID du service, vous pouvez utiliser l'option "data" lors de la création du champ dans votre formulaire. Voici comment vous pouvez le faire :

    Dans votre contrôleur, modifiez la ligne de création du formulaire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $form = $this->createForm(ContactFormType::class, null, [
        'service' => $idService,
    ]);
    Dans votre classe ContactFormType, ajoutez une option supplémentaire pour le champ "service" et utilisez-la pour définir la valeur par défaut du champ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    use Symfony\Component\OptionsResolver\OptionsResolver;
     
    // ...
     
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => null,
            'service' => null,
        ]);
    }
     
    // ...
     
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('service', EntityType::class, [
                'class' => Services::class,
                'label' => 'Service contacté : ',
                'data' => $options['service'], // Définit la valeur par défaut du champ
            ])
            // ...
    }
    De cette manière, vous pouvez transmettre l'ID du service lors de la création du formulaire et il sera utilisé pour préremplir le champ "service" avec la valeur correspondante.

    Concernant votre problème avec l'envoi du formulaire en base de données, il est difficile de déterminer la cause exacte sans plus de détails sur le problème et sans voir le code du modèle associé à votre formulaire. Cependant, voici quelques points à vérifier qui pourraient vous aider à résoudre le problème :

    Assurez-vous que les propriétés de votre modèle correspondent aux noms des champs dans le formulaire. Vérifiez également que les noms des champs sont correctement définis dans le modèle.

    Vérifiez les contraintes de validation appliquées sur vos champs. Assurez-vous que les données soumises respectent ces contraintes.

    Vérifiez si vous avez bien configuré le gestionnaire d'entités (EntityManager) pour sauvegarder les données dans la base de données. Assurez-vous que vous appelez les méthodes persist() et flush() appropriées après la validation du formulaire.

    Si vous pouvez fournir plus de détails sur le modèle associé à votre formulaire et sur la manière dont vous tentez de sauvegarder les données en base de données, je pourrai vous aider davantage à résoudre ce problème.

Discussions similaires

  1. Retourner un message au formulaire depuis le controller
    Par dubitoph dans le forum Symfony
    Réponses: 1
    Dernier message: 20/01/2019, 22h01
  2. Préremplir un champ de formulaire d'enquête
    Par SpaceFrog dans le forum Développement Sharepoint
    Réponses: 8
    Dernier message: 04/10/2016, 14h31
  3. Accéder champ sous-formulaire depuis autre formulaire
    Par CyberMen dans le forum VBA Access
    Réponses: 5
    Dernier message: 03/01/2010, 20h46
  4. valeur d'un champ de formulaire ajouté depuis une autre page
    Par manaboko dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 10h29
  5. Réponses: 2
    Dernier message: 28/10/2004, 17h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo