Bonjour,
Voilà je débute dans symfony et je rencontre un petit problème dans la création d'évènement .
Dans l'esprit d'une gestion de rendez-vous par un planning voilà ce que je fais

Ici je récupère un Tableau de tableau des données que je veux manipuler, je me situe dans mon TarifRepository

      public function findByEntreprise($value)
    {

        $conn = $this->getEntityManager()->getConnection();
        $sql ="SELECT tarif.id, tarif.designation FROM tarif WHERE tarif.id IN
        (SELECT `tarif_id` FROM `tarif_entreprise` WHERE `entreprise_id` =" .$value.")";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
                // returns an array of arrays (i.e. a raw data set)
        return $stmt->fetchAll();
    }

Ensuite j'appelle le tout dans le contrôleur d'évènements et j'envoie dans le $options du buildForm :


    /**
    * @Route("/new", name="evenements_new", methods="GET|POST")
    */
    public function add(Request $request, TarifRepository $tarif): Response
    {

       $evenement = new Evenements();
        $id = $request-> get('id');  // id de l'entreprise pour le $value dans la requete SQL
        $resultat = $tarif->findByEntreprise($id);
        foreach ($resultat as $data);
           $form = $this->createForm(EvenementsAType::class, $evenement, ['listeTarif' => $data]);

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

Puis dans mon formType j'ai un choicetype pour la liste déroulante

class EvenementsAType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $test = $options['listeTarif'];
        dump($options['listeTarif']);

        //Form pour tarifHoraire 
        $builder
                ->add('fkEntreprise', EntityType::class, array(
                    'class' => Entreprise::class,
                    'choice_label' => 'nom',
                    'label' => 'Choisir entreprise',
                    'attr' => array(
                        'class' => 'form-control',
                    ),
                ))
                ->add('fkClient', EntityType::class, array(
                    'class' => Clients::class,
                    'label' => 'Choisir votre client',
                    'choice_label' => 'nom',
                    'attr' => array('class' => 'form-control'),
                ))
                ->add('startDate', DateTimeType::class, array(
                    'label' => 'Date de début',
                    'attr' => array(
                        'class' => 'form-control',
                        'type' => 'datetime-local'),
                ))
                ->add('endDate', DateTimeType::class, array(
                    'label' => 'Date de fin',
                    'attr' => array('class' => 'form-control',
                        'type' => 'datetime-local'),
                ))
                ->add('titre', TextType::class, array(
                    'attr' => array('class' => 'form-control'),
                ))
                ->add('description', TextAreaType::class, array(
                    'attr' => array('class' => 'form-control'),
                ))
                ->add('listeTarif', ChoiceType::class, array(
                    'mapped' => false,
                    'choices' => $options['listeTarif'],
                    'choice_value' => $options['listeTarif']['id'],
                   // 'choice_label' => ....
                ))
                ->add('quantite')
                ->add('fkTva', EntityType::class, array(
                    'class' => Tva::class,
                    'choice_label' => 'designation',
                ))
                ->add('total')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
        'data_class' => Evenements::class,
        'listeTarif' => [],
        ]);
    }

}

J'aimerais juste afficher la désignation du tarif dans ma liste déroulante.

Actuellement, ma liste déroulante affiche deux choix, désignation et désignation ! Alors que ce que je souhaite, c'est d'afficher les données du champs désignation .
Je passe peut-être à côter de quelque chose de simple, mais cela fait quelque temps que je bloque déçu sans réelle solution

5 réponses


Max78945
Auteur
Réponse acceptée

J'ai finit par résoudre mon probleme trés simplement en fin de compte

J'ai passer une option d'idTarif dans les options du BuildForm, est fait une égalité en DQL dans un EntityType

// pour le controller
  public function add(Request $request, TarifRepository $tarif): Response
    {
        $evenement = new Evenements();
        if ($request->get('type') == true)
        {
            $IdTarif = $request->get('tarif');
            $tarifId = $tarif->findOneBy(array('id' => $IdTarif));

        $form = $this->createForm(EvenementsAType::class, $evenement,  ['idTarif' => $tarifId->getId()]);

        }
 pour le form..
->add('fkTarif', EntityType::class, [
                    'label' => 'Choisir votre tarif',
                    'class' => Tarif::class,
                    'query_builder' => function (EntityRepository $er) use ($id) {
                        return $er->createQueryBuilder('u')
                                ->where('u.id='.$id.'')
                                ->orderBy('u.designation', 'ASC');
                    },

Merci Lartak et désolé pour le dérangement ! Je débute tant dans le développement que dans symfony je tiens a précisé , encore du chemin a faire !

Bonsoir.
Tu n'aurais pas un problème ici ?

foreach ($resultat as $data);
    $form = $this->createForm(EvenementsAType::class, $evenement, ['listeTarif' => $data]);

Depuis quand un ; est une syntaxe correcte pour un foreach ?
Les : et { je suis d'accord, mais pas le ;.

Max78945
Auteur

Bonjour oui erreur de ma part en épurant le code , merci malheureusement cela n'a pas résolut mon probleme :(


         foreach ($resultat as $data){
           $form = $this->createForm(EvenementsAType::class, $evenement, ['listeTarif' => $data]);
         }

Je pensais que tu aurais compris quelque chose au passage.
Tu n'as pas l'impression que tu écrases ta variable à chaque tour de boucle de ton foreach ?
Tu ne devrais pas plutôt instancier une variable que tu alimentes à chaque tour de boucle et que tu récupères ensuite pour définir listeTarif ?
Exemple :

$tarifs = [];
foreach ($resultat as $data) {
    array_push($tarifs, $data);
}
$form = $this->createForm(EvenementsAType::class, $evenement, ['listeTarif' => $tarifs]);
Max78945
Auteur

Non je n'est pas eu l'impression car je passe $data pour manipulé juste un des tableau de donnée ,

J'obtiens le même resultat sans instancier dans cette variable Tarifs , car la methode findByEntreprise de mon tarifRepository me renvoie déja un tableau de tableau

 public function findByEntreprise($value)
    {

        $conn = $this->getEntityManager()->getConnection();
        $sql ="SELECT tarif.id, tarif.designation FROM tarif WHERE tarif.id IN
        (SELECT `tarif_id` FROM `tarif_entreprise` WHERE `entreprise_id` =" .$value.")";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
                // returns an array of arrays (i.e. a raw data set)
        return $stmt->fetchAll();
    }

Il y a peux étre un principe que j'ai du mal a comprendre mais mon formType récupéré bien un tableau de tableau