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 :

Enregistrement d'une annonce via deux formulaires [4.x]


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
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut Enregistrement d'une annonce via deux formulaires
    Bonjour,

    Je dois effectuer l'enregistrement d'une annonce en deux formulaires consécutifs : le premier formulaire contient différentes informations, notamment différentes périodes dont le nombre est indéfini à la base car l'utilisateur peut en ajouter ou en supprimer via du javascript, et un second formulaire qui se base sur les périodes du premier formulaire. Pour ce faire, voici comment j'ai construit la fonction d'appel dans mon controller :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     
        /**
         *  @Route("/road_trip/newAdvert", name="road_trip_createAdvert")
         *  @Route("/road_trip/{id}/editAdvert", name="road_trip_editAdvert")
         */
     
        public function advertForm(Advert $advert = null, Request $request, ObjectManager $manager){
     
            $newAdvert = false;
            $step = 0;
     
            if (!$advert) 
            {
                $newAdvert = true;
                $advert = new Advert();
    ...
     
            }
    ...
     
            if (!isset($form)) {
                $form = $this->createForm(AdvertType::class, $advert);
                $form->handleRequest($request);
            }
     
            if ($form->isSubmitted() && $form->isValid()) 
            {
                $error = null;
     
                //Chek if is the first or the second step of the record form
                if ($form->get('step')->getData() == 1) {
     
                    $step = 1;
    ...
                    $unique_seasons = array_unique($seasons);
                    $numberPrices = count($unique_seasons);
     
                    for ($i=0; $i < $numberPrices; $i++) { 
     
                        $durations = $this->getParameter('periods_durations');
     
                        for ($j=0; $j < count($durations); $j++) { 
                            $price = new Price;
                            $price->setDuration($durations[$j]);
                            $price->setSeason($unique_seasons[$i]);
                            $advert->addPrice($price);
                        }
                    }
     
                    if (null == $error) {
                        $form = $this->createForm(PricesAdvertType::class, $advert);
                        $form->handleRequest($request);
                    }
     
                }
     
                //Second step management 
                if ($form->get('step')->getData() == 2) { 
     
                    $step = 2;
                    $prices = $advert->getPrices();
     
                    foreach ($prices as $price) 
                    {
     
                        $price->setAdvert($advert);
     
                    }
     
                    $manager->persist($advert);
                    $manager->flush();
                    //echo "Dans step2";
     
                    return $this->redirectToRoute('road_trip_adverts');
     
                }
     
     
            }     
     
            if ($step == 0) {
                return $this->render('road_trip/createAdvert.html.twig', ['formAdvert' => $form->createView(), 'editMode' => $advert->getId() !== null]);
            }
            else {
                return $this->render('road_trip/createPricesAdvert.html.twig', ['formPricesAdvert' => $form->createView(), 'editMode' => $advert->getId() !== null]);
            }
     
        }
    Après la soumission du premier formulaire, le second est bien appelé mais j'obtiens cette erreur :

    Neither the property "prices" nor one of the methods "prices()", "getprices()"/"isprices()"/"hasprices()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView".
    Cette erreur se produit à la ligne suivante dans mon second template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        {% for price in formPricesAdvert.prices %}
    Apparemment, mon objet "$advert" ne serait pas correctement transmis à mon template, comme je m'y serais attendu avec la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(PricesAdvertType::class, $advert);
    Je ne comprends pas où se situe mon erreur.

    Quelqu'un aurait une idée?

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Bonjour,

    Je n'ai pas très bien compris ton problème. Si tu veux faire un formulaire multipage? Voici un exemple mais il en existe d'autres.

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,

    pour les formulaires avec plusieurs etapes, il ya CraueFormFlowBundle.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Merci beaucoup pour vos interventions.

    Effectivement, étant donné que je ne m'en sors vraiment pas, je vais me tourner vers CraueFormFlowBundle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] enregistrer une images via un formulaire
    Par onesat dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 18/04/2012, 02h10
  2. Réponses: 2
    Dernier message: 01/08/2007, 20h45
  3. Réponses: 4
    Dernier message: 24/07/2007, 13h05
  4. [MySQL] problème d'enregistrement dans une db via un formulaire
    Par momoh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/04/2007, 10h56
  5. [Formulaire] Alerte avant suppression d'une donnée via un formulaire
    Par leloup84 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/01/2006, 11h50

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