Symfony3

Bonjour.
Je sèche un peu sur quelque chose de pourtant sans doute assez simple à faire (mais bon…) :
Dans une page, je lance un formulaire qui permet de créer de nouveaux atelier. Ce formulaire contient notemment un champ select nommé "catégorie". Or, je souhaiterais récupérer un ID d’une catégorie particulière, et présélectionner le champs « catégorie » par cet ID.

Mais je ne sais pas comment faire. J’ai bien essayé de « setter » la valeur category a atelier… mais ça ne marche évidemment pas puisque c’est un objet.

Ce que je fais

Voici mon constructeur du formulaire :

  public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('nom')
                ->add('description')
                ->add('disponible')
                ->add('image', MediaType::class)
                ->add('categorie')          // select
                ;
    }/**

Et le code concerné dans mon contrôleur :

    public function newAction(Request $request)
    {
        $session = $request->getSession();
        $categorie = $session->get('ongletactif'); //Recupere l'onglet actif
        $id_cat = $categorie->getId();

        $atelier = new Ateliers();
        $atelier -> setCategorie($categorie);   //ne marche pas !
        $form = $this->createCreateForm($atelier);

    /** Creates a form to create an atelier.  */ 
    private function createCreateForm(Ateliers $atelier)
    {
        $form = $this->createForm(AteliersType::class, $atelier);
        $form->add('submit', SubmitType::class, array('label' => 'Ajouter'));

        return $form;
    }

    }/**

Ce que je veux

Je n'ai pas trouvé dans la doc comment selectionner une valeur dans un select en passant par les constructeur de formulaire Symfony.

8 réponses


bonsoir, si tu as bien fait ta relation entre ton entity Atelier et Categorie, tu dois simplement choisir "EntityType" comme type pour le formulaire. et de là, dans ta vue tu auras directement un select avec toutes tes valeurs. Et pour ton controller, tu n'auras rien a faire de spécial en dehors de persister et de flusher ton objet.

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('nom')
                ->add('description')
                ->add('disponible')
                ->add('image', MediaType::class)
                ->add('categorie', EntityType::class, array(
                        "class" => "App\Entity\Category"
                ));
    }

Merci beaucoup pour ta réponse, Gallarian. Je ne suis pas sûr que ce soit exactement ce que je veux par contre : j’ai déjà bien toutes les catégories qui s’affichent dans mon champs categorie – je voudrais juste en présélectionner une par un ID que je peux récupérer par le controller.
Dans la doc. Symfony, il semblerait qu’il s’agisse de l’option 'choices'… mais je ne sais pas comment l’utiliser dans le formulaire, ni comment envoyer la variable $id du controller au From constructeur (je débute, tu l’auras compris).

Salut,

En php : https://stackoverflow.com/questions/8073236/symfony2-setting-a-default-choice-field-selection

Sinon pourquoi ne pas passer ton id a ton template et le gerer en front avec du JS ? :

<script>
var defaultCat = {{ categoryId }};
</script>

Salut,
il faut ajouter dans le ->add ça =>
'data'=> 'valeur à selectionne',

Exemple , où $countryCode est le code de mon User (mais ce champ n'est pas mapped pour d'autres raisons) =>

->add('country', CountryType::class, array(
                'label' => 'profile.me.country', 
                'mapped' => false,
                'data'=> $countryCode
                ))

Merci a tous pour vos reponses, mais je ne suis pas sur de comprendre.

En gros, ce que je passe depuis mon controleur, c'est :
$atelier = new Ateliers(); $atelier -> setCategorie($categorie); $form = $this->createForm(AteliersType::class, $atelier);

Et dans mon form builder :
$builder->add('categorie', AteliersType::class, array( 'data' => $atelier))

Mais symfony me repond que "Atelier" n'est pas une variable definie.

Julien, merci beaucoup pour la suggestion. Ca marche (bien plus facilement) comme cela !
Mais bon, si l'on veut faire les choses propres en PHP... c'est quoi qui merde dans mon code ?

Salut,

Ce code :

$builder->add('categorie', AteliersType::class, array(
'data' => $atelier))

est utilisable si tu veux intégrer un sous-formulaire 'AtelierType'. Le retour d'erreur est donc logique.
De plus, l'option data surcharge systématiquement la valeur du formulaire, je ne crois pas que ce soit ce que tu cherches (https://symfony.com/doc/current/reference/forms/types/entity.html#data)

Le champ adapté pour ce que tu veux faire est bien EntityType (merci @gallarian). Va voir : https://symfony.com/doc/current/reference/forms/types/entity.html
Sa valeur peut être hydratée via le contrôleur :

        $em = $this->getDoctrine->getManager();
        $categorie->$em->getRepository('AppBundle:Categories')->FindOneBy(['id' => $monId]);

        $atelier = new Ateliers();
        $atelier -> setCategorie($categorie); 

Dans ton form :

->add('categorie', EntityType::class, [ 'class' => 'AppBundle:Categories' ])

Tout simplement ! Ne sachant pas bien comment hydrater, je melangais un peu tout en fait. Digivia, grace a toi, tout est bien plus clair pour moi à présent.
Merci à tous ! Bossant dans un autre domaine que l'informatique, je peux vous dire que l'esprit d'entraide qui y reigne est singulier.