IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

modification collection formulaire => delete ?


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut modification collection formulaire => delete ?
    Bonjour,

    Je suis assez nouveau sur Symfony que j'utilise pour mon stage de fin d'études et je me heurte au problème suivant :

    J'ai une entité ListUser qui gère des listes d'utilisateur et une entité MembersOfLists et une relation ManyToOne entre les deux.

    Dans le formulaire de création de liste j'ai imbriqué un champs 'collection' de membersOfList de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name', 'text')
                ->add('membersOfList', 'collection', array(
                    'type' => new MembersOfListType(),
                    'allow_add' => true,
                    'allow_delete' => true
                ))
            ;
        }
    La création fonctionne très bien, j'arrive à ajouter le bouton ajouter un membre, supprimer un membre afin d'ajouter dynamiquement des membres à la liste lors de sa création.

    Mon soucis maintenant c'est la modification de la liste, j'arrive tout comme lors de la création de la liste, à ajouter et supprimer des nouveaux membres. Il m'affiche bien les membres existants et sont même éditables, par contre il n'y a aucun moyen de supprimer les membres déjà existants :/

    Connaissez-vous une bonne pratique afin de réaliser cela ? Je pense que beaucoup de personnes ont déjà du être confrontés à ce soucis mais je n'ai rien trouvé sur le net à ce sujet (j'ai peut-être pas assez cherché :/)

    Merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    une façon simple de faire ce coup là est de supprimer touts les "memberOfList" reliés à ta liste, puis d'ajouter tous ceux du formulaire après modification. D'ailleurs, c'est ce que SF2 préconise de faire sans sa documentation :
    http://symfony.com/fr/doc/current/co...llections.html

    Regarde partie "Doctrine: Assurer la persistence dans la base de données"

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 97
    Points : 40
    Points
    40
    Par défaut
    Bonjour Vynka et merci de m'apporter ton aide

    J'ai suivi ton conseil, au début de ma fonction lorsque je détecte que la requête est de type POST je vide les membersOfLists de la liste, puis je fais un handleRequest dessus, malheureusement ça ne fonctionne pas :/ J'ai supprimé manuellement en Javascript une des lignes du formulaire et suite à l'envoie du formulaire le membre que j'ai supprimé est toujours présent

    Voici mon code j'espère que quelqu'un pourra m'aider, je m'y prend probablement mal :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public function modifListAction(ListUser $list)
        {
            if(!$this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){
                throw new AccessDeniedException("modification d'une liste");
            }
            $formList = $this->createForm(new ListUserType(), $list);
     
            //on crée ensuite un deuxième formulairequi va juste avoir un champ file
            $formBuilderFile = $this->createFormBuilder()->add('file','file', array(
                'required' => false,
            ));
            $formFile = $formBuilderFile->getForm();
     
     
            $request = $this->get('request');
            if ($request->getMethod() == 'POST') {
     
                foreach($list->getMembersOfList() as $member){
                    $list->removeMembersOfList($member);
                }
     
                $formList -> handleRequest($request);
                $formFile -> handleRequest($request);
     
                if ($formList->isValid() && $formFile->isValid()) {
     
                    $em = $this->getDoctrine()->getManager();
     
                    $file = $formFile['file'] -> getData();
                    //on regarde si un fichier a été envoyé, si c'est le cas on ajoute les mails contenus dans le fichier, sinon on passe à l'ajout de la liste
                    if($file != null){
     
                        //je ne copie pas le code présent dans cette boucle, j'y fais simplement un traitement sur un fichier excel car j'autorise la personne à indiquer des membres directement depuis un fichier excel
     
                    }
     
     
                    foreach($list->getMembersOfList() as $member){
                        if($member->getListUser() === null){
                            $member->setListUser($list);
                        }
                    }
     
                    $em -> persist($list);
                    $em -> flush();
     
                    $this->get('session')->getFlashBag()->add(
                        'message',
                        'Votre liste nommée '. $list->getName() .' a bien été modifiée.'
                    );
     
                    return $this->redirect($this->generateUrl('in_apps_pass_way_manage_lists'));
                }
            }
     
     
            return $this->render('InAppsPassWayBundle:List:createList.html.twig', array(
                'formList' => $formList->createView(),
                'formFile' => $formFile->createView()
            ));
     
        }
    Edit :

    J'ai suivi pas à pas le lien que tu m'avais fourni et ça a fonctionné, je stocke les membres avant modification, je regarde ceux qu'il y a dans le résultats et si il y en a un qui manque je fais un $em->remove($member); du coup ça marche plutôt bien mais je trouve dommage que Symfony ne gère pas tout ça de base :/ m'enfin tant pis ^^

    Merci beaucoup pour ton aide

Discussions similaires

  1. champs obligatoires (modification par formulaire)
    Par milielf dans le forum Access
    Réponses: 2
    Dernier message: 22/05/2006, 11h36
  2. Modification fiche formulaire
    Par noname_971 dans le forum Access
    Réponses: 3
    Dernier message: 26/04/2006, 15h30
  3. Modif sur formulaire instantané
    Par xboulney dans le forum Access
    Réponses: 4
    Dernier message: 01/03/2006, 16h04
  4. Modification sélecteur formulaire
    Par Gebudi. dans le forum Access
    Réponses: 5
    Dernier message: 11/01/2006, 09h01
  5. Mise à jour champs modifés via formulaire
    Par Al3x dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/01/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo