Selaa lähdekoodia

collections de genre et de réalisateurs

François 6 vuotta sitten
vanhempi
commit
28ef6bbf36

+ 45 - 1
src/AppBundle/Controller/VideothequeController.php

@@ -63,6 +63,19 @@ class VideothequeController extends Controller
                         $film->addRealisateur($recherche);
                     }
                 }
+            }
+            $genres = $film->getGenres();
+            foreach ($genres as $genre)
+            {
+                if ($genre->getId() == null)
+                {
+                    $recherche = $em->getRepository('AppBundle:Genre')->findOneBy(array('name'=>$genre->getName()));
+                    if ($recherche != null)
+                    {
+                        $film->removeGenre($genre);
+                        $film->addGenre($recherche);
+                    }
+                }
             }
 			$em->persist($film);
 			$em->flush();
@@ -86,7 +99,6 @@ class VideothequeController extends Controller
 		if ($form->isSubmitted() && $form->isValid())
 		{
             $realisateurs = $film->getRealisateurs();
-
             foreach ($realisateurs as $realisateur)
             {
                 if ($realisateur->getId() == null)
@@ -98,6 +110,19 @@ class VideothequeController extends Controller
                         $film->addRealisateur($recherche);
                     }
                 }
+            }
+            $genres = $film->getGenres();
+            foreach ($genres as $genre)
+            {
+                if ($genre->getId() == null)
+                {
+                    $recherche = $em->getRepository('AppBundle:Genre')->findOneBy(array('name'=>$genre->getName()));
+                    if ($recherche != null)
+                    {
+                        $film->removeGenre($genre);
+                        $film->addGenre($recherche);
+                    }
+                }
             }
 			$em->flush();
 			$this->addFlash('success', 'Le film a été modifié');
@@ -176,11 +201,30 @@ class VideothequeController extends Controller
             ->getManager()
             ->getRepository('AppBundle:Realisateur')
             ->findNomsComplets();
+        $liste = array();
         foreach ($realisateurs as $key=>$nom)
         {
             $liste[$key] = $this->get('serializer')->serialize($nom, 'json');
         }
 
+        return new JsonResponse($liste);
+    }
+
+    /**
+     * @Route("/ajax_req_genres", name="videotheque_ajax_genres")
+     */
+    public function ajaxGenres(Request $request)
+    {
+        $genres = $this
+            ->getDoctrine()
+            ->getManager()
+            ->getRepository('AppBundle:Genre')
+            ->findGenres();
+        $liste = array();
+        foreach ($genres as $key=>$nom)
+        {
+            $liste[$key] = $this->get('serializer')->serialize($nom, 'json');
+        }
 
         return new JsonResponse($liste);
     }

+ 46 - 5
src/AppBundle/Entity/Film.php

@@ -61,6 +61,12 @@ class Film
      */
     private $usersWhoSeen;
 
+    /**
+     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Genre", cascade={"persist"})
+     * @var \Doctrine\Common\Collections\Collection
+     */
+    private $genres;
+
     /**
      * @return mixed
      */
@@ -144,14 +150,15 @@ class Film
         $this->realisateurs = new \Doctrine\Common\Collections\ArrayCollection();
         $this->usersWantToView = new \Doctrine\Common\Collections\ArrayCollection();
         $this->usersWhoSeen = new \Doctrine\Common\Collections\ArrayCollection();
+        $this->genres = new \Doctrine\Common\Collections\ArrayCollection();
     }
 
     /**
-     * Add film
+     * Add realisateur
      *
-     * @param \AppBundle\Entity\Film $film
+     * @param \AppBundle\Entity\Realisateur $realisateur
      *
-     * @return Realisateurs
+     * @return Film
      */
     public function addRealisateur(\AppBundle\Entity\Realisateur $realisateur)
     {
@@ -161,9 +168,9 @@ class Film
     }
 
     /**
-     * Remove film
+     * Remove realisateur
      *
-     * @param \AppBundle\Entity\Film $film
+     * @param \AppBundle\Entity\Realisateur $realisateur
      */
     public function removeRealisateur(\AppBundle\Entity\Realisateur $realisateur)
     {
@@ -279,7 +286,41 @@ class Film
         } else {
             $this->addUserWhoSeen($user);
         }
+    }
+
+    /**
+     * Get genre
+     *
+     * @return \Doctrine\Common\Collections\Collection
+     */
+    public function getGenres()
+    {
+        return $this->genres;
+    }
+
+    /**
+     * Add genre
+     *
+     * @param \AppBundle\Entity\Genre $genre
+     *
+     * @return film
+     */
+    public function addGenre(\AppBundle\Entity\Genre $genre)
+    {
+        $this->genres[] = $genre;
+        return $this;
+    }
 
+    /**
+     * Remove genre
+     *
+     * @param \AppBundle\Entity\Genre $genre
+     * @return Film
+     */
+    public function removeGenre(\AppBundle\Entity\Genre $genre)
+    {
+        $this->genres->removeElement($genre);
+        return $this;
     }
 
 }

+ 65 - 0
src/AppBundle/Entity/Genre.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace AppBundle\Entity;
+
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * Genre
+ *
+ * @ORM\Table(name="genre")
+ * @ORM\Entity(repositoryClass="AppBundle\Repository\GenreRepository")
+ */
+class Genre
+{
+    /**
+     * @var int
+     *
+     * @ORM\Column(name="id", type="integer")
+     * @ORM\Id
+     * @ORM\GeneratedValue(strategy="AUTO")
+     */
+    private $id;
+
+    /**
+     * @var string
+     *
+     * @ORM\Column(name="name", type="string", length=255, unique=true)
+     */
+    private $name;
+
+    /**
+     * Get id
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set name
+     *
+     * @param string $name
+     *
+     * @return Genre
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+
+        return $this;
+    }
+
+    /**
+     * Get name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+}
+

+ 8 - 5
src/AppBundle/Form/FilmType.php

@@ -2,6 +2,9 @@
 
 namespace AppBundle\Form;
 
+use AppBundle\Entity\Film;
+use AppBundle\Entity\Genre;
+use Doctrine\ORM\Mapping\Entity;
 use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 use Symfony\Component\Form\Extension\Core\Type\CollectionType;
 use Symfony\Component\Form\Extension\Core\Type\TextType;
@@ -28,11 +31,11 @@ class FilmType extends AbstractType
                 'html5'     =>  true,
                 'required'  =>  false
             ))
-            /*->add('realisateur', EntityType::class, array(
-                'class'         =>  'AppBundle\Entity\Realisateur',
-                'choice_label'  =>  'nomComplet',
-                'required'      =>  false
-            ))*/
+            ->add('genres', CollectionType::class, array(
+                'entry_type'    =>  GenreType::class,
+                'allow_add'     =>  true,
+                'allow_delete'  =>  true
+            ))
             ->add('realisateurs', CollectionType::class, array(
                 'entry_type'    =>  RealisateurType::class,
                 'allow_add'     =>  true,

+ 36 - 0
src/AppBundle/Form/GenreType.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace AppBundle\Form;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class GenreType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder->add('name');
+    }/**
+     * {@inheritdoc}
+     */
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults(array(
+            'data_class' => 'AppBundle\Entity\Genre'
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
+    {
+        return 'appbundle_genre';
+    }
+
+
+}

+ 22 - 0
src/AppBundle/Repository/GenreRepository.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace AppBundle\Repository;
+
+/**
+ * GenreRepository
+ *
+ * This class was generated by the Doctrine ORM. Add your own custom
+ * repository methods below.
+ */
+class GenreRepository extends \Doctrine\ORM\EntityRepository
+{
+    public function findGenres ()
+    {
+        $qb = $this->createQueryBuilder('g');
+        $query = $qb
+            ->select('g.name')
+            ->getQuery();
+
+        return $query->getArrayResult();
+    }
+}

+ 32 - 37
src/AppBundle/Resources/public/assets/collectiontypeadd.js

@@ -1,14 +1,39 @@
-function collectionsRealisateurs (reponse) {
+function requete(chemin, nomDuDiv, nomDuBouton) {
+    $.ajax({
+        url: chemin,
+        type: 'POST',
+        dataType: 'json',
+        success: function (reponse) {
+            var reponseArray = parseJson(reponse);
+            console.log(reponseArray)
+            collections(reponseArray, nomDuDiv, nomDuBouton);
+        }
+    })
+}
+
+function parseJson(data) {
+    var tableau = [];
+    for (let i = 0; i < data.length; i++) {
+        let UnObjetJson = data[i];
+        let obj = JSON.parse(UnObjetJson);
+        sortie = Object.values(obj)
+        console.log(sortie[0]);
+        tableau.push(sortie[0]);
+    }
+    return tableau;
+}
+
+function collections (reponse, nomDuDiv, nomDuBouton) {
 
     // On récupère la balise <div> en question qui contient l'attribut « data-prototype » qui nous intéresse.
-    var $container = $('div#appbundle_film_realisateurs');
+    var $container = $('div#'+nomDuDiv);
 
     // On définit un compteur unique pour nommer les champs qu'on va ajouter dynamiquement
     var index = $container.find(':input').length;
 
     // On ajoute un nouveau champ à chaque clic sur le lien d'ajout.
-    $('#add_realisateur').click(function(e) {
-        addRealisateur($container);
+    $('#'+nomDuBouton).click(function(e) {
+        addConteneur($container);
 
         e.preventDefault(); // évite qu'un # apparaisse dans l'URL
         return false;
@@ -16,25 +41,24 @@ function collectionsRealisateurs (reponse) {
 
     // On ajoute un premier champ automatiquement s'il n'en existe pas déjà un (cas d'une nouvelle annonce par exemple).
     if (index == 0) {
-        //addRealisateur($container);
     } else {
         // S'il existe déjà des catégories, on ajoute un lien de suppression pour chacune d'entre elles
         $container.children('fieldset').each(function() {
             $container.find(':input').autocomplete({
                 source: reponse
             });
-            console.log('Lien de suppression');
+
             addDeleteLink($(this));
         });
     }
 
     // La fonction qui ajoute un formulaire RealisateurType
-    function addRealisateur($container) {
+    function addConteneur($container) {
         // Dans le contenu de l'attribut « data-prototype », on remplace :
         // - le texte "__name__label__" qu'il contient par le label du champ
         // - le texte "__name__" qu'il contient par le numéro du champ
         var template = $container.attr('data-prototype')
-            .replace(/__name__label__/g, 'Réalisateur')
+            .replace(/__name__label__/g, 'Truc')
             .replace(/__name__/g,        index)
         ;
 
@@ -70,35 +94,6 @@ function collectionsRealisateurs (reponse) {
             return false;
         });
     }
-
-    function completeAuto($realisateurs) {
-        var tableau = $realisateurs;
-        console.log('Bonjour');
-    }
-
-
 }
 
-function requeteRealisateurs(chemin) {
-    $.ajax({
-        url: chemin,
-        type: 'POST',
-        dataType: 'json',
-        success: function (reponse) {
-            //console.log('Réponse : '+reponse);
-            var reponseArray = parseJson(reponse);
-            collectionsRealisateurs(reponseArray);
-            //console.log(test)
-        }
-    })
-}
 
-function parseJson(data) {
-    var tableau = [];
-    for (let i = 0; i < data.length; i++) {
-        let realisateur = data[i];
-        let {nomComplet} = JSON.parse(realisateur);
-        tableau.push(nomComplet);
-    }
-    return tableau;
-}

+ 2 - 3
src/AppBundle/Resources/views/videotheque/ajouter.html.twig

@@ -9,9 +9,8 @@
 	<script src="{{ asset('/bundles/app/assets/collectiontypeadd.js') }}"></script>
 	<script>
 		$(document).ready(function () {
-		    requeteRealisateurs('{{ path('videotheque_ajax_realisateurs') }}');
-            //console.log(requeteRealisateurs('{{ path('videotheque_ajax_realisateurs') }}'));
-
+		    requete('{{ path('videotheque_ajax_realisateurs') }}', 'appbundle_film_realisateurs', 'add_realisateur');
+		    requete('{{ path('videotheque_ajax_genres') }}', 'appbundle_film_genres', 'add_genre');
         });
 	</script>
 {% endblock %}

+ 4 - 0
src/AppBundle/Resources/views/videotheque/form.html.twig

@@ -8,6 +8,10 @@
                 <div class="form-group row">
                     {{ form_row(form.annee) }}
                 </div>
+                <div class="form-group row">
+                    {{  form_row(form.genres) }}
+                </div>
+                <a href="#" id="add_genre" class="btn btn-link">Choisir un genre</a>
             </div>
             <div class="col">
                 <div class="form-group row">

+ 2 - 3
src/AppBundle/Resources/views/videotheque/modifier.html.twig

@@ -10,9 +10,8 @@
 	<script src="{{ asset('/bundles/app/assets/collectiontypeadd.js') }}"></script>
 	<script>
         $(document).ready(function () {
-            requeteRealisateurs('{{ path('videotheque_ajax_realisateurs') }}');
-            //console.log(requeteRealisateurs('{{ path('videotheque_ajax_realisateurs') }}'));
-
+            requete('{{ path('videotheque_ajax_realisateurs') }}', 'appbundle_film_realisateurs', 'add_realisateur');
+            requete('{{ path('videotheque_ajax_genres') }}', 'appbundle_film_genres', 'add_genre');
         });
 	</script>
 {% endblock %}