Sytème de Cat/SousCat problème d'entity

Default
,

Bonjour a tous,

Je rencontre un petit problème avec système de catégorie sous catégorie.

Chacun de mes posts sont relié a une entity sous-category qui elle meme est relié avec une entité category,

Mon système fonctionne parfaitement, seulement, au moment de l'envoie de formulaire, le champs subCategory me renvoit son ID au lieu de l'objet, je tourne en rond depuis pas mal de temps, alors je solicite votre aide

Voici mon formulaire PostType :

<?php

namespace App\Form;

// uses

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, array('required'  => true))
            ->add('description', TextareaType::class, array('required'  => true, 'data'=>'Hello les students,'))
            ->add('location' , NumberType::class, array('required' => true))
            ->add('price', TextType::class, array('required'  => false))
            ->add('type', ChoiceType::class, array(
               'required' => true,
               'expanded' => true,
               'multiple' => false,
               'choices' => array(
                       'Un objet' => 1,
                       'Un service' => 2,
                ),
            ))

            ->add('paiement', ChoiceType::class, [
                'choices'  => [
                    'Par heure' => 'h',
                    'Par jour' => 'j',
                    'fixe' => 'fixe',
                    'non remunéré' => 'none',
                ],
                "placeholder" => "Choisir un moyen de paiement",
                'required' => true
            ])
            ->add('category', EntityType::class, [
                'class' => Category::class,
                'required' => true,
                'placeholder' => 'Choisi une categorie !!',
                'mapped' => false
            ])
            ->add('save', SubmitType::class, [
                'attr' => [
                    'class' => 'btn btn-primary float-right'
                ]
            ])
        ;

        $builder->get('category')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event){
                $form = $event->getForm();
                //le probleme se situe ici, il me renvoit l'id de la subCat...
                $form->getParent()->add('subCategory', EntityType::class, [
                    'class' => SubCategory::class,
                    'placeholder' => 'Choisi une sous-categorie',
                    'choices' => $form->getData()->getSubCategories()
                ]);
            }
        );

        $builder->get('type')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event){
                $form = $event->getForm();
                $data = $event->getData();
                if($data == "1"){
                    $form->getParent()->add('category', EntityType::class, [
                        'class' => Category::class,
                        'placeholder' => 'Choisi Categorie Service',
                        "query_builder" =>function (CategoryRepository $cr){
                            return $cr->findCat(0);
                        },
                        'required' => true,
                        'mapped' => false
                    ]);
                }elseif($data == "2"){
                    $form->getParent()->add('category', EntityType::class, [
                        'class' => Category::class,
                        'placeholder' => 'Choisi Categorie Objet',
                        "query_builder" =>function (CategoryRepository $cr){
                            return $cr->findCat (1);
                        },
                        'required' => true,
                        'mapped' => false
                    ]);
                }
            }
        );

        $builder->addEventListener(
            FormEvents::POST_SET_DATA,
            function (FormEvent $event){
                $form = $event->getForm();
                $data = $event->getData();
                $subCategory = $data->getSubCategory();
                if($subCategory){
                    $form->get('category')->setData($subCategory->getCategory());
                    $form->add('subCategory', EntityType::class, [
                        'class' => SubCategory::class,
                        'placeholder' => 'Choisi une sous-categorie',
                        'choices' => $subCategory->getCategory()->getSubCategories()
                    ]);
                }else{
                    $form->add('subCategory', EntityType::class, [
                        'class' => SubCategory::class,
                        'placeholder' => 'Choisi une sous-categorie',
                        'choices' => []
                    ]);
                }
            }
        );
    }

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

Si vous avez besoin de plus d'information pour potentiellement m'éclairer, dites le moi ;)

Merci d'avance pour votre aide et bon journée,

Antoine

4 Réponse

129923
,

Pour moi c'est normal car tu recupère l'id passé par ton formulaire.
A toi de faire une requete pour avoir l'objet du style :

$subCategories = CategoryRepository->findBy(['id' => $form->getData()->getSubCategories() ]);
Default
,

Hello aka-aka et merci beaucoup pour ta réponse,

Ce que je ne comprends pas c'est que le champs de formulaire que je rajoute est bien un champs de type SubCategory....

Je peux essayer de trouver les Sous cat avec ton findBy mais ou placé cette ligne, car si je me trompe pas, c'est assez complexe d'utiliser les repository dans les eventlistener non?

129923
,

Alors non rien de compliqué en réalité.
Je te conseille de faire un FormType personalisé.
Regarde cette documentation officiel : https://symfony.com/doc/current/form/create_custom_field_type.html

Default
,

Je suis désolé d'insister, mais je ne comprends vraiment pas comment avec cette méthode, je peux faire une request de sous-categorie dans mon event listener qui prend en compte la categorie selectionné.

Je ne comprends pas non plus pourquoi le form me renvoie l'ID de la sous-categorie alors que j'appelle bien la methode getSubCategories qui elle me renvoie bien une liste d'entité et non d'id...

Merci pour ton temps !