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 :

Mettre à jour certains éléments d'une liste sous condition


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut Mettre à jour certains éléments d'une liste sous condition
    Nom : formulaire d'édition.JPG
Affichages : 795
Taille : 112,1 KoBonsoir à vous.

    Je suis fasse à un soucis assez simple me dirais-vous, mais voilà, j'ai quelques difficultés.

    Lorsque j'arrive sur ma liste de client, il me faudrait mettre à jour certain éléments et d'autre non. La condition est d'avoir une checkbox cochée.

    Au niveau de mon controller, j'ai fait ainsi:

    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
     
    <?php
    	class DefaultController extends Controller
    	{
    	    public function indexAction(request $request)
    	    {
     
    // retrieve manager/repo/collection
    	    	$em = $this->getDoctrine()->getManager();
    	    	$client = $em->getRepository("clientBundle:client")->findAll();
    	    	$form = $this->createForm("collection",$client,array("type"=>new clientType, "required"=>false));
     
    	    	$form->handleRequest($request);
     // If user posted
    	    	if($request->isMethod("POST"))
    	    	{
    	    		foreach ($request->request->get("collection") as $key => $value) {
    	    			if($key !== "_token")
    	    			{
     
    // Check if checkbox checked
    	    				if(isset($_POST["collection"][$key]["check"]))
    	    				{
     
    // Store data
    	    					 $em->persist($client[$key]);
    	    					 $em->flush();
     
    	    				}
    	    			}
    	    		}
    	    	}
    	        return $this->render('clientBundle:Default:index.html.twig', array("form"=>$form->createView()));
    	    }
    	}
    ?>
    Voilà.
    Plus précisément, ce code met à jour toute ma collection et pas juste les éléments cochés alors qu'avec un print_r il me retourne bien uniquement les éléments coché.

    Merci d'avance pour votre aide précieuse.

    ps: dans le premier screen je demande d'updater la ligne 2 et supprimer la 3, hors supprimer pas de problème par contre updater la 2 bas si j'ai modifier la première ligne ou les autres sans checkbox il update quand même mes valeurs.

    Cordialement,
    Gillou!
    Images attachées Images attachées  

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut
    j'ai rajouté dans mon formulaire un checkbox delete et cela me supprime bien les lignes qu'on le checkbox delete à true par loop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if($form[$key]["delete"]->getData()==true)
    {
           $em->remove($clients[$key]);
    }
    donc pourquoi un update de valeur de mes champs par ligne ne prend pas en compte ma condition checkbox alors qu'un delete "remove(....)" oui

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    qu'est ce que tu as dans $client[key]?

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut
    Bonjour et merci pour ton soutien

    Alors tel que défini dans ce que j'ai publié $client est mon findAll() que j'utilise pour ma collection.

    pour $key, c'est la boucle de mon request->get("collection").

    Je pensais faire les update comme les delete .

    à peut être utile, j'ai mis mes 2 checkbox dans mon formType ainsi

    fichier clientType:
    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
     
    namespace collection\clientBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class clientType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add("update","checkbox",array("mapped"=>false))
                ->add("delete","checkbox",array("mapped"=>false))
                ->add('prenom')
                ->add('nom')
            ;
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'collection\clientBundle\Entity\client'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'collection_clientbundle_client';
        }
    }

    Je me demande s'il me serait possible de mettre une condition dans mon clientType afin que mes lignes soient mise à jour que si mon check est true.

    Car voila, même sans checkbox ou quoi si je demande de persister uniquement un objet de ma collection, toute ma table est mise à jour

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	    	$clients = $em->getRepository("clientBundle:client")->findAll();
    	    	$form = $this->createForm("collection",$clients,array("type"=>new clientType, "required"=>false, 'allow_add' => true,'allow_delete' => true,));
     
    	    	$form->handleRequest($request);
     
    	    	if($request->isMethod("POST"))
    	    	{
                       $em->persist($clients[3]) // J'ai 5 lignes et quoi qu'il arrive je veux persister uniquement cet objet et pas les autre :: comment faire ? 
                       $em->flush();
                    }
    par contre si je fait la même chose mais pour un remove($clients[3] la, ma ligne 3 (objet de ma collection) sera supprimé et pas les autres.

    Merci par avance pour votre soutien.

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut
    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
     
    	    		foreach ($clients as $key => $value) {
    	    			if(isset($rqt[$key]["delete"])) // si pour chaque objet ce trouve le $_POST["delete"] je demande de supprimer via le remove la dite ligne checcké
    	    			{
    	    				print_r($clients[$key]); //me retourne bien le nombre d'objets coché
    	    				$em->remove($clients[$key]); //la c'est niquel
    						$em->flush();
    	    			}
     
    	    			if(isset($rqt[$key]["update"])) // si pour chaque objet ce trouve le $_POST["update"] je demande de modifier les champs de cet objet de la dite ligne checcké
    	    			{
    	    				print_r($clients[$key]); //me retourne bien le nombre d'objets coché pour UPDATE et c'est mon problème
    	    				$em->persist($clients[$key]); // la je modifie 1 ligne pas coché alors pourquoi est elle persisté???????? 2 jours le bordel
    						$em->flush();
    	    			}
    	    		}
    Mon entity client n'a pas d'arraycollection puisque j'ai qu'une seul table serait il une erreur pour set mes valeurs

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut une condition dans la methode handleResquet() avec une collection
    Bonjour à tous,

    j'ai résolu mon problème en n'utilisant pas la méthode handelRequest($request) ou bind($request) avant mon post car il récupère mon formulaire actuel.

    J'ai donc modifier mon controller ainsi:

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <?php
     
    	namespace collection\clientBundle\Controller;
     
    	use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    	use Symfony\component\httpFoundation\request;
    	use Symfony\component\httpFoundation\response;
     
    	use collection\clientBundle\Entity\client; // mon entite et  formulaire
    	use collection\clientBundle\Form\clientType;
     
    	class collectionController extends Controller
    	{
    	    public function indexAction(request $request)
    	    {
    	    	$em = $this->getDoctrine()->getManager(); // manager
    	    	$liste = $em->getRepository("clientBundle:client"); // déclare mon entité client
    	    	$clients = $liste->findAll(); // je récupère tout le tableau
    	    	$client = new client(); // instance de mon entité pour insert
     
    			// mon formulaire arrays clients & formtype clienttype
    	    	$form = $this->createForm("collection", $clients, array("type"=> new clienttype, "required"=>false)); 
     
    	    	// si le formulaire est posté
    	    	if($request->isMethod("POST"))
    	    	{
    	    		// j'exploite ma collection
    	    		$collection = $request->request->get('collection');
    	    		// sous ces conditions j'insert mon nouveau client
    	    		if(!empty($_POST["prenom_new"]) && !empty($_POST["nom_new"]))
    		    	{
    		    		$client->setPrenom($_POST["prenom_new"]);
    		    		$client->setNom($_POST["nom_new"]);
    		    		$em->persist($client);
    		    		$em->flush();
     
    		    	}
    		    	// si ma collection est true donc pas vide
    				if($collection)
    				{
    					// je boucle chaque array de mon request collection
    			    	foreach ($collection as $key => $value) 
    			    	{
    			    		// si conditions je met à jour mes objets
    			    		if(isset($value["MiseAJour"]) && !empty($value["prenom"]) && !empty($value["nom"]))
    			    		{
    			    			// echo "<pre>".print_r($value["prenom"]);
    				    		$clients[$key]->setPrenom($value["prenom"]);
    				    		$clients[$key]->setNom($value["nom"]);
    				    		$em->persist($clients[$key]);
    				    		$em->flush();
    			    		}
    			    		// si checkbox delete je supprime 
    			    		if(isset($value["delete"]))
    			    		{
    			    			$em->remove($clients[$key]);
    			    			$em->flush();
    			    		}
    			    	}
    		    	}
    		    	// la j'utilise cette methode pour utiliser les validations et le reste
    		    	$form->handleRequest($request);
    		    	// si tous est ok session tag | validator notblank() .....
    		    	if($form->isValid())
    		    	{
    		    				// je rafraichis mon formulaire avec les modification à jour
    						    return $this->redirect($this->generateUrl("formulaire"));
    		    	}
     
    		    }
    		    // formulaire par default
    	    	return $this->render("clientBundle:Default:collection.html.twig", array("form"=>$form->createView()));
     
    		}
           }
    ?>
    j'ai donc persiste chaque objets de ma collection seulement voilà pour utiliser mes assert notBlank() de mon entité client j'ai du rajouter au bas de mon post mon handleRequest() pour interpréter mes conditions de validation.

    Ce que je souhaiterais est de trouver une solution pour que le handleRequest() prenne en compte une condition de ma case à cocher "miseAjour" pour mettre à jours uniquement les bon objets.

    Merci à tous.
    A très bientôt

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Désolé du temps de réponse j'ai pas eu le temps de repasser sur le forum.

    Peux tu poster ce que renvoi le var_dump ci dessous (ou print_r)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $form = $this->createForm("collection", $clients, array("type"=> new clienttype, "required"=>false)); 
     
            $form->handleRequest($request);
     
            var_dump($form->getData());

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut merci
    Bonjour à toi,

    avec un pint_r() il me retourne ça, c'est à dire le nombre d'objets de ma collection:

    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
     
    Array
    (
        [0] => collection\clientBundle\Entity\client Object
            (
                [id:collection\clientBundle\Entity\client:private] => 1
                [prenom:collection\clientBundle\Entity\client:private] => jean-marie
                [nom:collection\clientBundle\Entity\client:private] => bigard
            )
     
        [1] => collection\clientBundle\Entity\client Object
            (
                [id:collection\clientBundle\Entity\client:private] => 2
                [prenom:collection\clientBundle\Entity\client:private] => franck
                [nom:collection\clientBundle\Entity\client:private] => provost
            )
     
    )
    et je te remercie doublement car auparavant je tentais de faire cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<pre>".print_r($form->handleRequest($request),true);
    et ça tournait en boucle ~

    dans le handleRequest() le formulaire collection me récupère les données actuelles de mon formulaire mais ne gère pas de condition sur mon checkbox pour mise à jour, car je tente de le déclarer après.

    Je souhaite savoir comment insérer une condition sur le formulaire qui serait donc interprété par mon handleRequest() ou bind()

    Merci de m'éclairer en attendant je me doc sur les prototypes

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Je sais pas si c'est trop avancé ou trop différent de ton style de programmation, mais je te propose d'essayer de lier tes formulaires a des entités non doctrine.

    Le principe est de séparer les responsabilités et de ne pas lier tes informations de la couche vue (tes forms) à ta couche de données (ton modèle doctrine)

    Je t'explique :
    Première étape, créer un DTO (data transfert object, en gros, un objet qui transporte de l'information)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class ActionOnUserFormObject {
      //(pas besoin de faire des getter ou setter dans un dto, mais tu peux en faire si tu préfères)
      public $update;
      public $delete;
      public $idPerson;
      public $lastname
      public $firstname
     
    }
    Deuxieme étape, créer ton formType correspondant au DTO
    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
     
    class ActionOnUserType extends AbstractType
    {
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add("update","checkbox") //plus de problème de mapping
                ->add("delete","checkbox")
                ->add('firstname')
                ->add('lastname')
            ;
        }
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'collection\clientBundle\DTO\FormObject\ActionOnUserFormObject' //Tu lies ton formulaire a ton form Object
            ));
        }
    Si ca t'interesse je continue.

    Sinon pour ton problème actuel j'ai pas trop d'idée sur sa résolution

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Tu peux préciser à Doctrine que tu ne veux pas enregistrer les modifications faites à une entité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $entity1->setFoo('bar');
    $entity2->setFoor('bar');
    $em->detach($entity2);
     
    $em->flush();//les requetes SQL executées ne concerneront que $entity1
    Néammoins je vois pas pourquoi un utilisateur irait modifier une ligne du formulaire s'il ne veut pas enregistrer ses modifications, ça fait une action supplémentaire de cocher la checkbox.
    A noter que Doctrine n'effectue des requetes SQL que si les attributs de l'objet on vraiment changé.

  11. #11
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par gototog Voir le message
    ...
    Si ca t'interesse je continue.
    Je veux bien la suite car je vois pas ou placer la condition pour mon checkbox.

    une collection d'un formulaire englobe toute les valeurs du formulaire donc comment interprété quelque chose la dessus.

    Merci

  12. #12
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par arnooo999 Voir le message
    ...
    Cela était pour l"exemple.

    et si je veux un bouton ou checkbox ou radio pour chaque ligne "objets" de ma table pour dire si true fais si ou ça exemple liste de stock inventaire ou comptabilité segmenté ou tous simplement je suis un garçon ou une fille.....

    Oui je connais choice pour les formBuilder ok mais pour le reste.....

    ma condition je dois la mettre dans le formBuilder donc comment adapter une condition sur un objets dans un formulaire: un prototype, un attribut ....

Discussions similaires

  1. [SP-2010] Mettre à jour l'élément d'une liste
    Par Gratiano dans le forum SharePoint
    Réponses: 12
    Dernier message: 12/05/2014, 19h56
  2. mettre-à-jour l'ID d'une liste
    Par lesanglier dans le forum SharePoint
    Réponses: 6
    Dernier message: 05/01/2010, 13h55
  3. Réponses: 23
    Dernier message: 12/02/2009, 10h06
  4. mettre à jour un élément d'une frame à partir d'une autre
    Par Nulenprogra dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/10/2007, 22h16
  5. Réponses: 2
    Dernier message: 29/03/2007, 10h18

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