Bonjour,

J'ai un constructeur de formulaire pour ajouter / éditer des articles de magasin et je souhaiterais pouvoir définir de quel fournisseur ils proviennent.

Pour ce faire j'ai un ChoiceType que je rempli en passant en paramètre l'ensemble des fournisseurs depuis mon ArticleControlleur.

Mon problème maintenant consiste à changer le label de ce ChoiceType pour qu'il corresponde aux fournisseurs et non aux articles.

Une idée? Je suis sur Symfony 3, mais si vous avez une solution adaptée à Symfony 2, je suis preneur. Merci

// AppBundle\Form\ArticleType
class ArticleType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('libelle', TextType::class)
            ->add('quantite', TextType::class, ['label' => 'Quantité'])
            ->add('prix', TextType::class)
            ->add('description', TextType::class)
            ->add('image', TextType::class)
            ->add('fournisseur', ChoiceType::class, [
              'choices' => $options['fournisseurs'],
              // Comment définir le label du ChoiceType avec un objet Fournisseur ?
              'choice_label' => ...
            ])
            ->add('save', SubmitType::class)
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Article',
            'fournisseurs' => [],
        ));
    }
}
// AppBundle\Controller\ArticleController
/**
 * @Route("/article/new", name="article.new")
 */
 public function newAction(Request $request)
 {
    $article = new Article();
    $form = $this->createForm(ArticleType::class, $article, [
        'fournisseurs' => $this->getDoctrine()->getRepository('AppBundle:Article')->findAll(),
     ]);

     $form->handleRequest($request);

     if ($form->isSubmitted() && $form->isValid()) {
        $article = $form->getData();
        $em = $this->getDoctrine()->getManager();
        $em->persist($article);
        $em->flush();

        return $this->redirect($request->getUri());
     }

     return $this->render('AppBundle::article/new.html.twig', [
        'form' => $form->createView(),
     ]);
}

1 réponse


Semeen
Réponse acceptée

Salut. Citation de la doc "Normally, the array key of each item in the choices option is used as the text that's shown to the user"
Donc, en faisant un petit traitement en amont sur les options que tu transmets ou chaque ligne du tableau aurait une forme

$x['fournisseur_nom'] = $x['fournisseur_id']

tu devrais te retrouver avec un select contenant les options de forme

<option value="/* l'id */">/* le nom */</option>

Sans avoir besoin d'utiliser le 'choice_label'