Ver código fonte

Champs réalisateurs remanié

François 6 anos atrás
pai
commit
dbe862106a

+ 2 - 0
app/Resources/views/base.html.twig

@@ -3,6 +3,7 @@
     <head>
         <meta charset="UTF-8" />
         <title>{% block title %}VideoPotes{% endblock %}</title>
+		<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
 		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.8.0/css/bootstrap-datepicker.css">
 		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
 		<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css" integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
@@ -87,6 +88,7 @@
 
 		</div>
 		<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
+		<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
 	<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
 		<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
 		<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.8.0/js/bootstrap-datepicker.js"></script>

+ 1 - 1
src/AppBundle/Controller/RealisateurController.php

@@ -45,7 +45,7 @@ class RealisateurController extends Controller
 
 		return $this->render('@App/realisateur/ajouter.html.twig', array(
 			'form'	=>	$form->createView(),
-			'realisateur'	=>	$realisateur
+			//'realisateur'	=>	$realisateur
 		));
 	}
 

+ 52 - 7
src/AppBundle/Controller/VideothequeController.php

@@ -3,12 +3,15 @@
 namespace AppBundle\Controller;
 
 use AppBundle\Entity\Commentaire;
+use AppBundle\Entity\Realisateur;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\Routing\Annotation\Route;
 use Symfony\Component\HttpFoundation\Request;
 use AppBundle\Entity\Film;
 use AppBundle\Form\FilmType;
+use Symfony\Component\Serializer\Tests\Fixtures\NullableConstructorArgumentDummy;
 
 class VideothequeController extends Controller
 {
@@ -42,12 +45,25 @@ class VideothequeController extends Controller
 		$film = new Film;
 		$film->setAuthered($this->getUser());
 		$form = $this->createForm(FilmType::class, $film);
+        $em = $this->getDoctrine()->getManager();
 
 		$form->handleRequest($request);
 		if ($form->isSubmitted() && $form->isValid())
 		{
-			$film = $form->getData();
-			$em = $this->getDoctrine()->getManager();
+            $realisateurs = $film->getRealisateurs();
+
+            foreach ($realisateurs as $realisateur)
+            {
+                if ($realisateur->getId() == null)
+                {
+                    $recherche = $em->getRepository('AppBundle:Realisateur')->findOneBy(array('nomComplet'=>$realisateur->getNomComplet()));
+                    if ($recherche != null)
+                    {
+                        $film->removeRealisateur($realisateur);
+                        $film->addRealisateur($recherche);
+                    }
+                }
+            }
 			$em->persist($film);
 			$em->flush();
 			$this->addFlash('success', 'Le film a été ajouté');
@@ -56,7 +72,6 @@ class VideothequeController extends Controller
 
 		return $this->render('@App/videotheque/ajouter.html.twig', array(
 			'form'	=>	$form->createView(),
-			'film'	=>	$film
 		));
 	}
 
@@ -67,11 +82,23 @@ class VideothequeController extends Controller
 	{
 		$form = $this->createForm(FilmType::class, $film);
 		$form->handleRequest($request);
-
+        $em = $this->getDoctrine()->getManager();
 		if ($form->isSubmitted() && $form->isValid())
 		{
-            $em = $this->getDoctrine()->getManager();
-			$film = $form->getData();
+            $realisateurs = $film->getRealisateurs();
+
+            foreach ($realisateurs as $realisateur)
+            {
+                if ($realisateur->getId() == null)
+                {
+                    $recherche = $em->getRepository('AppBundle:Realisateur')->findOneBy(array('nomComplet'=>$realisateur->getNomComplet()));
+                    if ($recherche != null)
+                    {
+                        $film->removeRealisateur($realisateur);
+                        $film->addRealisateur($recherche);
+                    }
+                }
+            }
 			$em->flush();
 			$this->addFlash('success', 'Le film a été modifié');
 			return $this->redirectToRoute('videotheque_liste');
@@ -79,7 +106,7 @@ class VideothequeController extends Controller
 
 
 		return $this->render('@App/videotheque/modifier.html.twig', array(
-			'form'	=> $form->createView()
+			'form'	=> $form->createView(),
 		));
 	}
 
@@ -139,4 +166,22 @@ class VideothequeController extends Controller
         ));
     }
 
+    /**
+     * @Route("/ajax_req_realisateurs", name="videotheque_ajax_realisateurs")
+     */
+    public function ajaxRealisateurs(Request $request)
+    {
+        $realisateurs = $this
+            ->getDoctrine()
+            ->getManager()
+            ->getRepository('AppBundle:Realisateur')
+            ->findNomsComplets();
+        foreach ($realisateurs as $key=>$nom)
+        {
+            $liste[$key] = $this->get('serializer')->serialize($nom, 'json');
+        }
+
+
+        return new JsonResponse($liste);
+    }
 }

+ 18 - 58
src/AppBundle/Entity/Realisateur.php

@@ -23,17 +23,9 @@ class Realisateur
 
     /**
      * @var string
-     *
-     * @ORM\Column(name="prenom", type="string", length=255)
+     * @ORM\Column(name="nom_complet", type="string", length=255, unique=true)
      */
-    private $prenom;
-
-    /**
-     * @var string
-     *
-     * @ORM\Column(name="nom", type="string", length=255)
-     */
-    private $nom;
+    private $nomComplet;
 
     /**
      * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Film", mappedBy="realisateurs", cascade="persist")
@@ -51,53 +43,6 @@ class Realisateur
         return $this->id;
     }
 
-    /**
-     * Set prenom
-     *
-     * @param string $prenom
-     *
-     * @return Realisateur
-     */
-    public function setPrenom($prenom)
-    {
-        $this->prenom = $prenom;
-
-        return $this;
-    }
-
-    /**
-     * Get prenom
-     *
-     * @return string
-     */
-    public function getPrenom()
-    {
-        return $this->prenom;
-    }
-
-    /**
-     * Set nom
-     *
-     * @param string $nom
-     *
-     * @return Realisateur
-     */
-    public function setNom($nom)
-    {
-        $this->nom = $nom;
-
-        return $this;
-    }
-
-    /**
-     * Get nom
-     *
-     * @return string
-     */
-    public function getNom()
-    {
-        return $this->nom;
-    }
     /**
      * Constructor
      */
@@ -147,6 +92,21 @@ class Realisateur
      */
     public function getNomComplet ()
     {
-        return $this->prenom . ' ' . $this->nom;
+        return $this->nomComplet;
+    }
+
+    /**
+     * Set nomComplet
+     *
+     * @param string $nomComplet
+     *
+     * @return Realisateur
+     */
+    public function setNomComplet($nom)
+    {
+        $this->nomComplet = $nom;
+
+        return $this;
     }
+
 }

+ 3 - 7
src/AppBundle/Form/FilmType.php

@@ -34,14 +34,10 @@ class FilmType extends AbstractType
                 'required'      =>  false
             ))*/
             ->add('realisateurs', CollectionType::class, array(
-                'entry_type'    =>  EntityType::class,
-                'entry_options'    =>  array(
-                        'class'     =>  'AppBundle\Entity\Realisateur',
-                        'choice_label'  =>  'nomComplet',
-                        'required'  =>  false
-                ),
+                'entry_type'    =>  RealisateurType::class,
                 'allow_add'     =>  true,
-                'allow_delete'  =>  true
+                'allow_delete'  =>  true,
+                'allow_extra_fields'    => true
             ))
 		    ->add('save', SubmitType::class, array('label' => 'Enregistrer'));
     }

+ 5 - 3
src/AppBundle/Form/RealisateurType.php

@@ -3,7 +3,6 @@
 namespace AppBundle\Form;
 
 use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 use Symfony\Component\Form\Extension\Core\Type\TextType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -15,8 +14,11 @@ class RealisateurType extends AbstractType
      */
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('prenom', TextType::class)
-                ->add('nom', TextType::class);
+        /*$builder->add('prenom', TextType::class)
+                ->add('nom', TextType::class);*/
+        $builder->add('nomComplet', TextType::class, array(
+
+        ));
                 //->add('save', SubmitType::class, array ('label' =>  'Enregistrer'));
     }
 

+ 10 - 0
src/AppBundle/Repository/RealisateurRepository.php

@@ -68,4 +68,14 @@ class RealisateurRepository extends \Doctrine\ORM\EntityRepository
 
         return $query->getResult();
     }
+
+    public function findNomsComplets ()
+    {
+        $qb = $this->createQueryBuilder('r');
+        $query = $qb
+            ->select('r.nomComplet')
+            ->getQuery();
+
+        return $query->getArrayResult();
+    }
 }

+ 43 - 4
src/AppBundle/Resources/public/assets/collectiontypeadd.js

@@ -1,4 +1,5 @@
-$(document).ready(function() {
+function collectionsRealisateurs (reponse) {
+
     // 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');
 
@@ -18,7 +19,11 @@ $(document).ready(function() {
         addRealisateur($container);
     } else {
         // S'il existe déjà des catégories, on ajoute un lien de suppression pour chacune d'entre elles
-        $container.children('div').each(function() {
+        $container.children('fieldset').each(function() {
+            $container.find(':input').autocomplete({
+                source: reponse
+            });
+            console.log('Lien de suppression');
             addDeleteLink($(this));
         });
     }
@@ -29,7 +34,7 @@ $(document).ready(function() {
         // - 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 n°' + (index+1))
+            .replace(/__name__label__/g, 'Réalisateur')
             .replace(/__name__/g,        index)
         ;
 
@@ -41,6 +46,9 @@ $(document).ready(function() {
 
         // On ajoute le prototype modifié à la fin de la balise <div>
         $container.append($prototype);
+        $container.find(':input').autocomplete({
+            source: reponse
+        });
 
         // Enfin, on incrémente le compteur pour que le prochain ajout se fasse avec un autre numéro
         index++;
@@ -62,4 +70,35 @@ $(document).ready(function() {
             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;
+}

+ 10 - 1
src/AppBundle/Resources/views/videotheque/ajouter.html.twig

@@ -5,4 +5,13 @@
 {% block body %}
 	{{ include('@App/videotheque/form.html.twig') }}
 {% endblock %}
-{% block javascripts %}<script src="{{ asset('/bundles/app/assets/collectiontypeadd.js') }}"></script>{% endblock %}
+{% block javascripts %}
+	<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') }}'));
+
+        });
+	</script>
+{% endblock %}

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

@@ -20,3 +20,4 @@
     {{ form_rest(form) }}
     {{ form_end(form) }}
 
+

+ 10 - 1
src/AppBundle/Resources/views/videotheque/modifier.html.twig

@@ -6,4 +6,13 @@
 {% block body %}
 	{{  include('@App/videotheque/form.html.twig') }}
 {% endblock %}
-{% block javascripts %}<script src="{{ asset('/bundles/app/assets/collectiontypeadd.js') }}"></script>{% endblock %}
+{% block javascripts %}
+	<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') }}'));
+
+        });
+	</script>
+{% endblock %}