Bonjour bonsoir,

je souhaite créer un choix de radio bouton dans le code suivant


<?php

namespace AppBundle\Form\Annonce;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

class AnnonceCaracteristiqueType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
                $caracteristique = $event->getData();
                $form = $event->getForm();
                $options = $form->getConfig()->getOptions();
                $etagere = $caracteristique->getAnnonce()->getEtagere();
                $caract = $caracteristique->getCaracteristique();
                $nom = $caracteristique->getCaracteristique()->getNom();
                if($nom){
                    $label = $nom;
                }else{
                    $label = $caracteristique->getCaracteristique()->getSigle();
                }
                if($caracteristique->hasChoix()){
                    $choix = $this->array_choix($options, $caract, $etagere);

                    $form->add('choix', EntityType::class, array(
                            'class' => 'AppBundle:Magasin\Caracteristique\ChoixCaracteristique',
                            'choices' => $choix,
                            'placeholder' => 'Choix',
                            'label' => $label,
                            'required' => false
                            ));                 

                }
                else{
                    $form->add('valeur', null, array(
                        'label' => $label
                    ));
                }   
            })
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Annonce\AnnonceCaracteristique',
            'entityManager' => null
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_annonce_caracteristique';
    }

    public function array_choix(array $options, $caract, $etagere){
        $em = $options['entityManager'];
        $EtgCaract = $em->getRepository('AppBundle:Magasin\Caracteristique\EtagereCaracteristique')->findOneBy(array('etagere' => $etagere, 'caracteristique' => $caract));
        $choix = $EtgCaract->getChoix()->toArray();     
        return $choix;
    }
}

j'ai déjà testé avec ce code :


 $form->add('choix',ChoiceType::class,

                array('choices' =>$choix,

            'choices_as_values' => true,'multiple'=>false,'label'=>$nom,'expanded'=>true));

Malheureusement le résultat me sort les indices des tables alors que je souhaite avoir le libellé...

Pas facile.

merci pour votre aide !

5 réponses


glochen G Uyirr
Auteur
Réponse acceptée

j'avance,

comment faire pour atteindre la valeur de 'nom' dans ce tableau :

(j'ai fait un dump !)

array:3 [▼
  0 => ChoixCaracteristique {#3431 ▼
    -id: 28
    -nom: "Satiné"
    -sigle: "SAT"
    -caracteristique: Caracteristique {#3468 ▶}
    -etageresCaracteristiques: PersistentCollection {#4589 ▶}
    -annoncesCaracteristiques: PersistentCollection {#4426 ▶}
  }
  1 => ChoixCaracteristique {#3914 ▼
    -id: 43
    -nom: "Mat"
    -sigle: "MAT"
    -caracteristique: Caracteristique {#3468 ▶ …2}
    -etageresCaracteristiques: PersistentCollection {#5220 ▶}
    -annoncesCaracteristiques: PersistentCollection {#1401 ▶}
  }

]

Bonjour,
Si tu utilise une version de Symfony > 2.7, l'option choices_as_values a été dépréciée (voire supprimée sur les dernières versions).
Il faut que ta variable $choix contienne la même valeur pour la clé et la valeur.
Par exemple ["yes" => "yes", "no" => "no"]
Cela te donnera

<option value="yes">yes</option>

bonjour,

merci pour ta réponse.
j'ai enlevé choices_as_values.

le problème c'est que je ne comprends pas comment est structuré $choix.

Je ne comprends pas pourquoi tu as créé cette fonction :

public function array_choix(array $options, $caract, $etagere){
        $em = $options['entityManager'];
        $EtgCaract = $em->getRepository('AppBundle:Magasin\Caracteristique\EtagereCaracteristique')->findOneBy(array('etagere' => $etagere, 'caracteristique' => $caract));
        $choix = $EtgCaract->getChoix()->toArray();     
        return $choix;
    }

Tu ne veux pas récupérer l'id de ton entité EtagereCaracteristique pour l'enregistrer dans l'entité de destination de ton form (AnnonceCaracteristique)?
Sinon, il te faut modifier cette fonction array_choix pour obtenir un array avec chaque clé = valeur.
Pour voir le résultat de $choix, tu peux utiliser dump($choix) pour visualiser sa valeur en mode dev, dans le profiler...

Merci pour ta réponse...
sympa.
C'est pas simple d'arriver sur un projet déjà développé au niveau le plus profond.
Ce n'est donc pas moi qui ai créé cette fonction que j'ai du mal à saisir.
oui, j'ai déjà utilisé la fonction dump, mais c'est incompréhensible.
Il faut que je fouille.
Ce que je ne comprends pas c'est que le EntityType qui crée le select arrive bien à déterminer ID / NOM pour faire une liste déroulante.
Mais je ne comprends pas la structure de choix.
Bon, je vais creuser....
Merci !