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 :

CraueFormFlowBundle : comment l'utiliser [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut CraueFormFlowBundle : comment l'utiliser
    Bonjour,

    Je suis en train d'essayer de faire tourner le bundle CraueFormFlowBundle, qui permet de créer des formulaires multi-pages.
    Il semblerait que je ne sois pas trop loin du but, toutefois je bloque sur une étape.

    Dans mon controlleur, je crée l'action suivante (tiré de la doc craueFormFlowBundle) :

    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
        public function poemGeneratorAction() {
     
            $poem = new PoemGenerator();
     
            $flow = $this->get('yop.form.flow.poemGenerator');
            $flow->bind($poem);
     
            $form = $flow->createForm($poem);
     
            if ($flow->isValid($form)) {
                $flow->saveCurrentStepData();
     
                if ($flow->nextStep()) {
                    // render form for next step
                    return array(
                        'form' => $flow->createForm($poem)->createView(),
                        'flow' => $flow,
                    );
                }
     
     
                // flow finished
                /*
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($poem);
                $em->flush();
                */
     
                return $this->redirect($this->generateUrl('homepage'));
            }
     
            return array(
                'form' => $form->createView(),
                'flow' => $flow,
            );
        }
    Mais lorsque je visite la page, j'ai le message d'erreur suivant :

    The controller must return a response (Array(form => Object(Symfony\Component\Form\FormView), flow => Object(YOP\YourOwnPoetBundle\Form\PoemGeneratorFlow)) given).
    Pourtant, mon controlleur retourne bien le bon type de données non ?

    Si vous avez une piste vers où chercher, je suis preneur.

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Tu retournes un array. Or, c'est une Response qui est nécessaire.

    Il y a deux possibilités (mais il semble que tu utilises la premiere):
    - Tu utilises également FrameworkExtraBundle qui permet de renvoyer un array directement parce que le bundle cherche la vue automatiquement. Cela se fait par l'annotation Template.
    http://symfony.com/doc/2.0/bundles/S...ions/view.html

    - Tu remplaces tes arrays par des objets Response.
    http://symfony.com/doc/current/book/...ring-templates

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Effectivement problème résolu en retournant un objet réponse avec $this->render.
    La doc de CraueFormFlowBundle ne précise pas qu'ils utilisent SensioFrameworkExtraBundle... et comme je ne suis pas encore très à l'aise avec Symfony je n'ai pas su interpréter le message d'erreur...

    Merci beaucoup !

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    Question supplémentaire :

    Est-il possible, en utilisant craueFormBuilder, de vérifier les données entrées par l'utilisateur step by step, si possible en utilisant un handler ?
    Il faudrait par exemple que j'affiche des champs supplémentaires en fonction du choix de l'utilisateur dans le step actuel (avec jQuery), est-ce possible en combinaison avec craueFormBuilder ? Et si oui, où placer le code ce vérification ?

    Merci d'avance.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Par défaut
    J'essaie (désespérément) de réaliser ce que je décris dans mon post précédent, à savoir une forme sur pages multiples (crée avec craueFormBuilder) avec vérification des données page par page.

    J'ai pour cela crée une nouvelle classe PoemDataCollectorHandler et déplacé une partie de mon code dedans. Auparavant, tout ce code se trouvait directement dans le controlleur et ça fonctionnait bien.
    Après avoir déplacer le code, ma forme ne s'affiche plus ( car $process vaut 0, soit $this->flow->isValid($form) renvoie FALSE). Seulement je n'arrive pas à voir pourquoi...

    Est-ce qu'un oeil averti saurait trouver pourquoi ma 'form' n'est pas valide ?

    Mon controlleur :

    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
        public function collectPoemDataAction() {
     
            /* Collector collects all the data inputs */
            $collector = $this->get('yop.poem.datacollector');
            /* selector selects which raw verses will be used */
            $selector = $this->get('yop.poem.verseSelector');
            /* customizer customizes the raw poem with data
                * input by the visitor to make the real poem
                */
            $customizer = $this->get('yop.poem.poemcustomizer');
     
            /* customizedPoem contains the customized poems lines :
                * 5 intro, 5 msg and 5 trait lines
                */
            $customizedPoem = new CustomizedPoem();
     
            $request = $this->get('request');
            $flow = $this->get('yop.form.flow.poemDataCollector');
     
     
     
            $formHandler = new PoemDataCollectorHandler(
                    $flow,
                    $request,
                    $collector,
                    $selector,
                    $customizer,
                    $customizedPoem
                    );
            $process = $formHandler->process();
     
            switch ($process)
            {
                case 1:
                    return $this->render('YOPYourOwnPoetBundle:thePoet:collectPoemData.html.twig',array(
                        'form' => $flow->createForm($collector)->createView(),
                        'flow' => $flow,
                        ));
                    break;
                case 2:
                    return $this->render('YOPYourOwnPoetBundle:thePoet:showPoem.html.twig',array(
                    'poem' => $customizedPoem,
                    'city' => $collector->getCityNbSlb(),
                    'name' => $collector->getNameNbSlb(),
                    'relationship' => $collector->getRelationshipNbSlb(),
                    ));
                    break;
                default:
                    $url = $this->get('router')->generate('poem_generator');
                    $url_test = $this->get('router')->generate('test_link');
                    return $this->render('YOPYourOwnPoetBundle:Default:index.html.twig', array(
                        'link' => $url,
                        'test_link' => $url_test,
                        ));
                    break;
            }
        }
    Et mon Handler :

    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
    class PoemDataCollectorHandler {
     
        private $request;
        private $flow;
        private $collector;
        private $selector;
        private $customizer;
        private $customizedPoem;
     
        public function __construct(
                PoemDataCollectorFlow $flow,
                Request $request,
                PoemDataCollector $collector,
                VerseSelector $selector,
                PoemCustomizer $customizer,
                CustomizedPoem $customizedPoem)
        {
            $this->flow = $flow;
            $this->request = $request;
            $this->collector = $collector;
            $this->selector = $selector;
            $this->customizer = $customizer;
            $this->customizedPoem = $customizedPoem;
        }
     
     
        public function process()
        {
            $this->flow->bind($this->collector);
            $form = $this->flow->createForm($this->collector);
            if ($this->flow->isValid($form)) {
                $this->flow->saveCurrentStepData();
     
                if ($this->flow->nextStep()) {
                    // render form for next step
                    return 1;
                }
     
                /* collector calculates the number of syllables in some
                    * of the values collected : name, city and relationship
                    */
                $this->collector->calculateSlb();
     
                /* selector selects the raw verses that will be used
                 * to create the poem
                 */
                $this->selector->selectVerses();
     
                $this->customizer->setCustomizedPoem($this->customizedPoem);
                $this->customizer->customizePoem();
     
                return 2;
            }
            return 0;
        }
    }

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/02/2005, 14h39
  2. [Optimisation] Comment bien utiliser le StringBuffer?
    Par mathieu dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2004, 14h22
  3. Comment bien utiliser ce forum ?
    Par Alcatîz dans le forum Pascal
    Réponses: 0
    Dernier message: 21/04/2004, 16h37
  4. [scrapbook] comment l'utiliser ?
    Par Didier 69 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 16/04/2004, 17h28
  5. [INDY] -> IdIdentServer comment l'utiliser ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/08/2003, 16h00

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