3 votes

Symfony2 createFormBuilder - Formulaire de recherche avancée dynamique

J'utilise une API qui, dans le cadre de la réponse, renvoie un tableau appelé "form". Il s'agit d'un tableau de noms de champs, de types de données et de valeurs.

Le nombre et le nom de ces champs peuvent varier en fonction du point de terminaison de l'API actuellement utilisé. Mais la structure du tableau du formulaire est toujours la même. Ainsi, le processus, en ce qui concerne Symfony, est le suivant :

  1. Créer un objet de formulaire
  2. Boucle à travers le tableau du formulaire et ajoute les éléments du tableau comme champs.
  3. Envoyer le tableau à la vue

En fait, ce formulaire n'est rien d'autre qu'un formulaire de recherche avancée. Il n'y a absolument aucun lien avec les Entités dans le système.

Donc, étant nouveau dans Symfony2, et après avoir lu cette documentation (http://symfony.com/doc/2.0/book/forms.html#building-the-form) j'ai essayé de faire cela dans le contrôleur en créant la fonction suivante :

/**
 * Generate a form for each field passed in an array.
 * 
 * @param array $formArray A custom array of fields do be shown in the form
 * @return formView
 */
private function generateForm($formArray)
{

    // Simple demo for testing
    $formArray = array(
        0 => array(
            'name' => 'FirstName', 'type' =>'text'
            ),
        1 => array(
            'name' => 'LastName', 'type' =>'text'
            )
        ); 

    $form = $this->createFormBuilder($formArray);

    foreach($formArray as $field) {
        $form->add($field['name'], $field['type']);
    }        

    $form->getForm();

    return $form->createView();

}

Ce que j'en retire est

Fatal error: Call to undefined method Symfony\Component\Form\FormBuilder::createView() in .... (my controller file)

Curieusement, si je fais de l'ajout des champs et de l'appel à getForm() une chaîne comme dans l'exemple du document, tout va bien.

Qu'est-ce que je fais de mal ici ?

6voto

Aaryn Points 650

Ah, j'ai compris. Cette ligne

$form->getForm();

Cette méthode retourne un objet Form, alors que je la traitais comme un setter.

La fonction du contrôleur de fonctionnement est donc la suivante :

 /**
 * Generate a form for each field passed in an array.
 * 
 * @param array $formArray A custom array of fields do be shown in the form
 * @return formView
 */
private function generateForm($formArray)
{

    $formBuilder = $this->createFormBuilder($formArray);

    foreach($formArray as $field) {
        $formBuilder->add($field['name'], $field['type']);
    }        

    $form = $formBuilder->getForm();

    return $form->createView();

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X