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 :

Inclusion de bundle [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 21
    Par défaut Inclusion de bundle
    Bonjour,

    J'aimerai comprendre pourquoi le formulaire de mon bundle lorsqu'il est inclus dans un template parent avec twig par la fonction render() et la fonction controller() ne fonctionne pas.
    Le code "$form->handleRequest($request)->isValid()" ne fonctionne jamais ni même l'affichage des erreurs par twig "{{ form_errors(form) }}".

    Lorsque j'envoie le formulaire la page se recharge mais rien ne se passe, ni enregistrement en BDD, ni erreur php, ni erreur Symfony2, ni message d'erreur du formulaire affiché par twig. Je reviens uniquement à la même page!

    Voici mon bundle, le fichier routing.yml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dg_apply:
        path:      /apply
        defaults:  { _controller: DGApplyBundle:Default:index }

    le controller qui contient la méthode indexAction:

    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
    <?php
     
    namespace DG\ApplyBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Request;
     
    use DG\ApplyBundle\Entity\Apply;
    use DG\ApplyBundle\Form\ApplyType;
     
    class DefaultController extends Controller
    {
        public function indexAction(Request $request)
        {
            $apply = new Apply();
     
            $form = $this->get('form.factory')->create(new ApplyType(), $apply);
     
            if ($form->handleRequest($request)->isValid())
            {
                $em = $this->getDoctrine()->getManager();
                $em->persist($apply);
                $em->flush();
                echo 'Apply enregistrée!';
            }
            else
            {
               echo 'Apply non enregistrée!';
            }
     
            return $this->render
            (
                'DGApplyBundle:Default:index.html.twig', array
                (
                    'form' => $form->createView()
                )
            );
        }
    }
     
    ?>
    Le template twig du bundle inclus:

    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
    <div class="section-row half-padding-bottom">
     
        <div class="container">
     
            <div class="row">
     
                <div class="col-lg-12">
     
                    <h1 class="section-title show-counter">
                        Appliquer chez W<span class="text-primary">ÿ</span>rd
                        <small>Vous vous sentez à la hauteur, venez affronter les plus monstrueuses créatures.</small>
                    </h1>
     
                </div>
     
            </div>
     
            <div class="row">
     
                <div class="col-md-12">
     
                    <div class="alert alert-danger text-center">
                        Tous les champs sont obligatoires
                    </div>
     
                    {{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }}
     
                    {{ form_errors(form) }}
     
                    <div class="form-group">
                        <div class="col-md-12">
                            {{ form_widget(form.armory, {'attr': {'class': 'form-control', 'placeholder': 'URL de ton armurerie'}}) }}
                            {{ form_errors(form.armory) }}
                        </div>
                    </div>
     
                    <div class="form-group">
                        <div class="col-md-12">
                            {{ form_widget(form.login, {'attr': {'class': 'form-control', 'placeholder': 'Ton nom de joueur'}}) }}
                            {{ form_errors(form.login) }}
                        </div>
                    </div>
     
                    <div class="form-group">
                        <div class="col-md-12">
                            {{ form_widget(form.postuler, {'attr': {'class': 'btn btn-sm btn-block btn-primary'}}) }}
                        </div>
                    </div>
     
                    {{ form_rest(form) }}
                    {{ form_end(form) }}
     
                </div>
     
            </div>
     
        </div>
     
    </div>
    L'endroit où il est inclus dans le template parent d'un autre bundle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <section id="apply-form" class="section">
     
        <div class="section-row-container">
     
            {{ render(controller("DGApplyBundle:Default:index")) }}
     
        </div>
     
    </section>
    Comme dit le formulaire s'affiche bien mais ne fonctionne pas lorsque je l'envoie. Merci de votre aide.

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    dans applyType() tu as bien défini action ?

    ensuite pour savoir ou ça bloque dans le controller, tu peux user de die("ici");

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 21
    Par défaut
    Bonsoir,

    Oui il pointe vers la route du bundle parent + une ancre comme s'agit d'un site one page.
    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $form = $this->get('form.factory')->create(new ApplyType(), $apply, array('action' => $this->generateUrl('dg_guild_homepage').'#apply-form'));
    Le code html généré est comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <form name="dg_applybundle_apply" method="post" action="/app_dev.php/guild#apply-form" class="form-horizontal">
    Je peux mettre des die() mais il n'y a pas d'erreur dans le controller. Le problème vient de l'inclusion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ render(controller("DGApplyBundle:Default:index")) }}

  4. #4
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    les die c’était pour savoir si il y va au moins dans le controlleur comme ça , on sera fixé
    1. affiche la vue
    2. ajoute le die("ici"); début du controlleur
    3. submit


    autre chose, quand tu valides un formulaire, dans le controleur il y a 2 cas :
    1 : le form est valide
    donc tu retourne sur la vue avec le form vide form->create()
    2 : il y a des erreurs
    donc tu retournes sur la vue mais en renvoyant le form reçu tel quel (et non le form->create())


    dans ton code, pour le cas 1 ou 2 tu renvois toujours le form->create() donc problème

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 21
    Par défaut
    Je viens de faire ce que tu m'as demandé, la soumission va bien à l'URL: /app_dev.php/guild#apply-form et le controller du bundle qui contient le formulaire est bien chargé par cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ render(controller("DGApplyBundle:Default:index")) }}
    J'ai le die qui s'affiche:

    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
     
    <?php
     
    namespace DG\ApplyBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Request;
     
    use DG\ApplyBundle\Entity\Apply;
    use DG\ApplyBundle\Form\ApplyType;
     
    class DefaultController extends Controller
    {
        public function indexAction(Request $request)
        {
            die('ici');
        	$apply = new Apply();
     
            $form = $this->get('form.factory')->create(new ApplyType(), $apply, array('action' => $this->generateUrl('dg_guild_homepage').'#apply-form'));
     
            if ($form->handleRequest($request)->isValid()) 
            {
                $em = $this->getDoctrine()->getManager();
                $em->persist($apply);
                $em->flush();
                echo 'Apply enregistrée!';
            }
            else
            {
                echo 'Apply non enregistrée!';
            }
     
            return $this->render
            (
            	'DGApplyBundle:Default:index.html.twig', array
            	(
          			'form' => $form->createView()
        		)
            );
        }
    }
     
    ?>

  6. #6
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    après tu faire un die si il passe le handle request->isvalid()


    quand tu affiche ta vue le render fait appel au controleur qui te fournira toujours le form->create() donc toujours le formulaire vide (sans les erreurs si il y en avait eu)

    car quand tu valides un formulaire, dans le controleur il y a 2 cas :
    1 : le form est valide
    tu enregistres en base
    tu retournes sur la vue avec le form vide form->create()
    2 : le form non valide : il y a des erreurs
    donc tu retournes sur la vue mais en renvoyant le form reçu car le handle request injecte les erreurs dedans (et donc dans ce cas ne pas envoyer form->create() mais form)


    dans ton code, pour le cas 1 ou 2 tu renvois toujours le form->create() donc problème



    un render controlleur avec un form dedans c'est peut etre pas une bonne idée ! voyons ....

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

Discussions similaires

  1. [Débutant][bundle] plusieurs "bundle"
    Par lando dans le forum Développement Web en Java
    Réponses: 12
    Dernier message: 11/09/2003, 18h13
  2. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  3. Inclusion de fichier .h
    Par Tony49 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/11/2002, 11h10
  4. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30
  5. Inclusion de fichiers en IDL
    Par babou dans le forum CORBA
    Réponses: 10
    Dernier message: 30/07/2002, 16h47

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