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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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 : 54
    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
    Par défaut Mettre à jour certains éléments d'une liste sous condition
    Nom : formulaire d'édition.JPG
Affichages : 864
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 confirmé
    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 : 54
    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
    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 Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

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

  4. #4
    Membre confirmé
    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 : 54
    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
    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 confirmé
    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 : 54
    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
    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 confirmé
    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 : 54
    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
    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

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