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 :

formulaire avec many to many [3.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut formulaire avec many to many
    Bonsoir à tous !

    j'ai un projet qui permet d'enregistrer des notes dans des catégories (many-to-many). Pour cela, dans le formulaire de création d'une note, j'ai une liste de catégories (checkbox).

    J'aimerais trier ces catégories selon un champ de tri dans la table (position).
    J'ai vu des choses à propos de query_builder, mais je ne suis pas sûre d'avoir compris comment l'utiliser


    D'autre part, si j'arrive à la création d'une note en venant d'une catégorie, j'aimerais pré-cocher ladite catégorie dans la liste des checkbox
    Y a-t-il une manière propre de pré-remplir des champs de formulaire ?

    merci d'avance !

    voici ce que j'ai dans NoteController => createAction

    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
    $form = $this->createFormBuilder($note)
                    ->add('titre', TextType::class)
                    ->add('categories', EntityType::class, array(
                        'class' => 'EliaStickitBundle:Category',
                        'label' => 'Catégories',
                        'expanded' => true,
                        'multiple' => true
                    ))
                    ->add('contenu', TextareaType::class)
                    ->add('visible_par', ChoiceType::class, array(
                        'choices'  => array(
                            'Moi uniquement' => 'private',
                            'Tout membre connecté' => 'shared',
                            'Tout le monde' => 'public',
                        )
                    ))
                    ->add('save', SubmitType::class, array('label' => 'Modifier'))
                    ->getForm();

  2. #2
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    alors, j'ai fini par trouver !

    mon contrôleur :
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    <?php
     
    namespace Elia\StickitBundle\Controller;
     
    use Elia\StickitBundle\Entity\User;
    use Elia\StickitBundle\Entity\Category;
    use Elia\StickitBundle\Entity\Note;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
     
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\CollectionType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Elia\StickitBundle\Repository\CategoryRepository;
     
    class NoteController extends Controller
    {
        /**
         * Matches /note/creer/* exactly
         *
         * @Route("/note/creer/{idCategory}", name="note_create", host="www.si.elia")
         */
    	public function createAction($idCategory = 0, Request $request)
    	{
            $user = $this->get('security.token_storage')->getToken()->getUser();
     
            if($this->container->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED'))
            {
                $user_id = $user->getId();
     
        	    $note = new Note();
     
                $form = $this->createFormBuilder($note)
                    ->add('titre', TextType::class)
                    ->add('categories', EntityType::class, array(
                        'class' => 'EliaStickitBundle:Category',
                        'label' => 'Catégories',
                        'query_builder' => function(CategoryRepository $er) {
                            return $er->getCategories();
                        },
                        'expanded' => true,
                        'multiple' => true
                    ))
                    ->add('contenu', TextareaType::class)
                    ->add('visible_par', ChoiceType::class, array(
                        'choices'  => array(
                            'Moi uniquement' => 'private',
                            'Tout membre connecté' => 'shared',
                            'Tout le monde' => 'public',
                        )
                    ))
                    ->add('save', SubmitType::class, array('label' => 'Ajouter'))
                    ->getForm();
     
                // enregistrement du formulaire soumis
                $form->handleRequest($request);
     
                if ($form->isSubmitted() && $form->isValid())
                {
                    $note = $form->getData();
     
                    if(empty($idCategory))
                    {
                        $idCategory = $_POST['form']['categories'][0];
                    }
     
                    $user = $this->getDoctrine()
                        ->getManager('stickit')
                        ->getRepository('EliaStickitBundle:User')
                        ->find($user_id);
     
                    // relate this note to the user
                    $note->setUser($user);
     
                    // position à 0 par défaut
                    $note->setPosition(0);
     
                    $em = $this->getDoctrine()->getManager('stickit');
     
                    // tells Doctrine you want to (eventually) save the note (no queries yet)
                    $em->persist($note);
     
                    // actually executes the queries (i.e. the INSERT query)
                    $em->flush();
     
                    return $this->redirect('/notes/'.$idCategory);
                }
     
                return $this->render('EliaStickitBundle:note:create.html.twig', array(
                    'form' => $form->createView(),
                    'titrePage' => 'Ajouter'
                ));
            }
     
            else
            {
                return $this->redirect('/connexion');
            }
    	}
    }
    le repository :
    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
    <?php
     
    namespace Elia\StickitBundle\Repository;
     
    use Doctrine\ORM\EntityRepository;
    use Doctrine\ORM\Mapping as ORM;
     
    Class CategoryRepository extends EntityRepository
    {
    	public function getCategories()
    	{
    		$qb = $this->createQueryBuilder('c');
     
            $qb->orderBy('c.position', 'ASC');
     
            return $qb;
    	}
    }
    à mettre dans un dossier Repository au même niveau que Entity

    et l'entité :
    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
    <?php
     
    namespace Elia\StickitBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
    use Elia\StickitBundle\Entity\User;
    use Elia\StickitBundle\Entity\Note;
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="category")
     * @ORM\Entity(repositoryClass="Elia\StickitBundle\Repository\CategoryRepository")
     */
    class Category
    {
    ...
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/08/2014, 22h22
  2. Réponses: 2
    Dernier message: 15/11/2012, 13h35
  3. Réponses: 0
    Dernier message: 30/05/2012, 21h05
  4. Problème avec une relation many-to-many
    Par jillthe1 dans le forum Doctrine2
    Réponses: 9
    Dernier message: 19/12/2011, 21h05
  5. [Data] Dao avec JDBC. Relations many-to-many
    Par Invité dans le forum Spring
    Réponses: 4
    Dernier message: 08/07/2009, 14h44

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