Problème d'affichage des données de deux tables différents relation ManyToMany

dellai.najeh
Messages postés
16
Date d'inscription
samedi 25 août 2018
Statut
Membre
Dernière intervention
10 mars 2019
- Modifié le 21 déc. 2018 à 09:06
Bonjour,
j'ai 2 problèmes à poser : le 1er problème est que lors de l'affichage des données depuis la base de données, en fait j'ai 3 entités ( Enseignant, EnseignantLangue et Langue) . la relation est manytomany entre Entre enseignant et EnseignantLangue. Lors de l'affichage du datatable je veux afficher les ddonnées du Enseignant et la description de Enseignant. Le problème c'est qu'on j'affiche la description elle me renvoie toujours la description de la 1ere instance pour tous les autres ( elle se répète) je n'ai pas pu afficher la description de chaque EnseignantLangue pour chaque Enseignant.

le 2ème problème : quand mes tables sont vides et quand je lance la route de la page index (liste des enseignant) elle me renvoie cette erreur " Undefined Offset : 0 " quand il éxécute cette ligne
  $enseignantLangue=$this->findContentByLanguage($enseignants[0]);


j'ai passé 2 jours et je n'arrive à trouver la solution due au manque connaissance au développement.
Merci de donne l'aide et pour votre compréhension

voici ma fonction:
 /**
     * @Route("/",name="index_enseignant")
     */
    public function indexAction(Request $request) {
        //get entity manager
        $em = $this->getDoctrine()->getManager();
        //get id of selected language
        $choice=$request->get('lang');
        //get the list of existant language Fr, An, ...
        $langues=$em->getRepository('MDWEBAdminBundle:Langue')->findAll();

        if($choice!=null && $choice!=''){
            //get the id of selected language
            $langue=$em->getRepository('MDWEBAdminBundle:Langue')->find($choice);
            //find enseignants in order of laguage or by date
            $enseignants = $em->getRepository('MDWEBAdminBundle:Enseignant')->findinOrder($langue);
            //get the id of  selected langage
            $defaultLangue=$langue->getId();
            //if there no instance of enseignant
            if(count($enseignants)==0){
                return $this->render('MDWEBAdminBundle:Enseignant:index.html.twig', array(
                    'enseignants' => array(),
                    'enseignantLangue'=>null,
                    'langues'=>$langues,
                    'defaultselectedLangue'=>$defaultLangue
                ));
            }
            else{

                $enseignantLangue=$enseignants[0]->getEnseignantLangue();
            }

        }
        else{
            /* Try to find content for the default Language French*/
            $langue=$em->getRepository('MDWEBAdminBundle:Langue')->findBy(array('name'=>'Fr'));
            $enseignants = $em->getRepository('MDWEBAdminBundle:Enseignant')->findinOrder($langue);
            $defaultLangue=$langue;
            /* if there's none,  try to get the next Content by InsertionDate */
            if(count($enseignants)==0){
                $enseignantLangue=$this->findContentByLanguage($enseignants[0]);
                $defaultLangue=$enseignantLangue[0]->getLangue();
                $enseignants = $em->getRepository('MDWEBAdminBundle:Enseignant')->findinOrder($defaultLangue);
            }
            else{
                $enseignantLangue=$enseignants[0]->getEnseignantLangue();
            }
        }


        $website = $this->container->getParameter('website');
        return $this->render('MDWEBAdminBundle:Enseignant:index.html.twig', array(
            'website'=>$website,
            'enseignants' => $enseignants,
            'enseignantLangue'=>$enseignantLangue[0],
            'langues'=>$langues,
            'defaultselectedLangue'=>$defaultLangue
        ));
    }




   /*
    * Try to find the content in the default Language French
    * if not try to get the next Content by InsertionDate
    */
    public function findContentByLanguage($enseignant){
        $em = $this->getDoctrine()->getManager();
        $langue=$em->getRepository('MDWEBAdminBundle:Langue')->findBy(array('name'=>'Fr'));
        $enseignantLangue=$em->getRepository('MDWEBAdminBundle:EnseignantLangue')->findBy(array('enseignant' => $enseignant,'langue' => $langue));
        if(count($enseignantLangue)==0){
            $enseignantLangue=$em->getRepository('MDWEBAdminBundle:EnseignantLangue')->findBy(array('enseignant' => $enseignant),array('createdAt'=>'DESC'));
        }
        return $enseignantLangue;
    }


<?php

namespace MDWEB\AdminBundle\Repository;

/**
 * EnseignantRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class EnseignantRepository extends \Doctrine\ORM\EntityRepository
{
    // get enseignants by selected language
    // if there is no language is selected
    // display by date de creation
    public function findinOrder($lang = null)
    {
        $qb = $this->createQueryBuilder('e');
        $qb ->select('e')
            ->where('e.deleted =0');

        if ($lang != null) {
            $qb->innerJoin('e.enseignantLangue', 'el')
                ->andWhere('el.langue = :lang')
                ->setParameter('lang', $lang);
        }

        $qb->orderBy('e.createdAt', 'DESC');
        return $qb->getQuery()->getResult();

    }



}




Mon view : index.html.twig



{% extends 'layout.html.twig' %}

{% block stylesheets %}
    {{ parent() }}
    <!-- DataTables -->
    <link href="{{ asset('bundles/mdwebadmin/plugins/datatables/jquery.dataTables.min.css') }}" rel="stylesheet" type="text/css" />
    <link href="{{ asset('bundles/mdwebadmin/plugins/datatables/buttons.bootstrap.min.css') }}" rel="stylesheet" type="text/css" />
    <link href="{{ asset('bundles/mdwebadmin/plugins/datatables/fixedHeader.bootstrap.min.css') }}" rel="stylesheet" type="text/css" />
    <link href="{{ asset('bundles/mdwebadmin/plugins/datatables/responsive.bootstrap.min.css') }}" rel="stylesheet" type="text/css" />
    <link href="{{ asset('bundles/mdwebadmin/plugins/datatables/scroller.bootstrap.min.css') }}" rel="stylesheet" type="text/css" />
    <link href="{{ asset('bundles/mdwebadmin/plugins/switchery/switchery.min.css')}}" rel="stylesheet" />
    {#   Modal #}
    <link href="{{ asset('assets/css/modal.css')}}" rel="stylesheet" />
{% endblock %}

{% block title_navbar %} Liste des enseignants {% endblock %}

{% block body %}
    <div class="container" >
        <div class="row">
            <div class="col-sm-4">
                <a href="{{ url('creer_enseignant') }}" class="btn btn-primary waves-effect waves-light btn-xs m-b-5" data-animation="fadein" data-plugin="custommodal"
                   data-overlaySpeed="200" data-overlayColor="#36404a"><i class="md md-add fa fa-plus"></i> Ajouter un enseignant</a>
            </div><!-- end col -->
        </div>

        <div class="row">
            <div class="col-sm-12">
                {% set msg=0 %}
                {% for flashMessage in app.session.flashbag.get('notice') %}
                    <div class="alert alert-success">
                        <button class="close" data-dismiss="alert"></button>
                        <strong><i class="icon-ok"></i></strong> {{ flashMessage }}
                    </div>
                {% endfor %}
                {% for flashMessage in app.session.flashbag.get('error') %}
                    <div class="alert alert-error">
                        <button class="close" data-dismiss="alert"></button>
                        <strong><i class='icon-remove'></i> </strong> {{ flashMessage }}
                    </div>
                {% endfor %}
                {% for flashMessage in app.session.flashbag.get('StateActive') %}
                    {% if msg==0%}
                        <div class="alert alert-success alert-dismissable">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                            <strong>{{ flashMessage }}</strong>
                        </div>
                        {% set msg = 1 %}
                    {% endif %}
                {% endfor %}
                {% for flashMessage in app.session.flashbag.get('StateInActive') %}
                    {% if msg==0%}
                        <div class="alert alert-danger alert-dismissable">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                            <strong>{{ flashMessage }}</strong>
                        </div>
                        {% set msg = 1 %}
                    {% endif %}
                {% endfor %}

                <div class="card-box table-responsive" >
                    <div class="row" style="width: 100%;margin-bottom: 3%">
                        <div class="col-sm-8" style="width: 100%">
                            <div class="form-group">
                                <select class="form-control" name="langueSelect" id="langueSelect"  style="float: right;width: 20%">
                                    {% for langue in langues %}
                                        {% if defaultselectedLangue ==langue.id %}
                                            <option value="{{ langue.id }}" selected  data-id ="{{ langue.id  }}">{{ langue.fullName }}</option>
                                        {% else %}
                                            <option value="{{ langue.id }}">{{ langue.fullName }}</option>
                                        {% endif %}
                                    {% endfor %}
                                </select>
                            </div>
                        </div>
                    </div>
                    <div id="contentRefreshed">
                        <table id="datatable-responsive" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
                            <thead>
                            <tr>
                                <th style="text-align:center;width:23.33% !important">Nom </th>
                                <th style="text-align:center;width:23.33% !important">Prénom</th>
                                <th style="text-align:center;width:33.33% !important">Adresse email</th>
                                <th style="text-align:center;width:33.33% !important">Description</th>
                                <th style="text-align:center;width:33.33% !important">CV</th>
                                <th style="text-align:center;width:33.33% !important">Status</th>
                                <th style="text-align:center;width:33.33% !important">Actions</th>
                            </tr>
                            </thead>
                            <tbody >
                            {% for enseignant in enseignants %}
                                <tr>


                                    <td style="text-align:center;width:23.33% !important">{{ enseignant.name}}</td>
                                    <td style="text-align:center;width:23.33% !important">{{ enseignant.prename}}</td>
                                    <td style="text-align:center;width:33.33% !important">{{ enseignant.email}}</td>
                                    <td style="text-align:center;width:33.33% !important">{{ enseignantLangue.description}}</td>
                                    <td style="text-align:center;width:33.33% !important">{{ enseignant.pieceJointe}}</td>

                                    <td style="text-align:center;">
                                        <a href="{{ url('status_enseignant',{'id': enseignant.id}) }}">
                                            {% if  enseignant.activated == 1 %}
                                                <input type="checkbox" checked data-plugin="switchery" data-color="#00b19d" data-size="small">
                                            {% else %}
                                                <input type="checkbox"  unchecked data-plugin="switchery" data-color="#00b19d" data-size="small"/>
                                            {% endif %}
                                        </a>
                                    </td>

                                    <td>
                                        <a href="{{ path('afficher_enseignant', {'id': enseignant.id }) }}" class="glyphicon glyphicon-eye-open" title="Voir"></a>
                                        <a href="{{ path('modifier_enseignant', {'id': enseignant.id }) }}" value="" id="edit_act" name="edit_language" class="glyphicon glyphicon-pencil" title="Modifier"></a>
                                        {#<------------ Button supprimer ----------------->#}
                                        <a id="{{ enseignant.id }}"  class="glyphicon glyphicon-trash" data-target="#deleteModal"   data-toggle="modal" ></a>
                                        {#<------------ Modal de confirmation----------------->#}
                                        <div id="{{ enseignant.id }}_enseignant" style="display:none; cursor: default">
                                            <h5>Etes-vous sûr de vouloir supprimer cet enseignant ?</h5>
                                            <button  data-id="{{ enseignant.id }}" type="button"
                                                     data-path="{{ path('supprimer_enseignant') }}" data-basepath="{{ app.request.basepath() }}"
                                                     class="d-yes">
                                                Oui
                                            </button>
                                            <input type="button" class="no" value="Non" />
                                        </div>

                                    </td>
                                </tr>
                            {% endfor %}
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="deleteModalLabel">Modal title</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">×</span>
                </button>
            </div>
            <div class="modal-body">
                ...
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Non</button>
                <button type="button" class="btn btn-primary">Oui</button>
            </div>
        </div>

    </div>
{% endblock %}

{% block javascripts_bib %}
    {{ parent() }}
    <!-- Datatables-->
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/jquery.dataTables.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/dataTables.bootstrap.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/dataTables.buttons.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/buttons.bootstrap.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/jszip.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/pdfmake.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/vfs_fonts.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/buttons.html5.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/buttons.print.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/dataTables.fixedHeader.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/dataTables.keyTable.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/dataTables.responsive.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/responsive.bootstrap.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/datatables/dataTables.scroller.min.js') }}"></script>
    <script src="{{ asset('bundles/mdwebadmin/plugins/switchery/switchery.min.js')}}"></script>


    <!-- Datatable init js -->
    <script src="{{ asset('bundles/mdwebadmin/pages/datatables.init.js') }}"></script>


{% endblock %}


{% block javascripts %}
    {#Traduction du datatable Anglais-> Français#}
    <script type="text/javascript" language="javascript" >
        $(document).ready(function () {
            $('#datatable-responsive').DataTable({
                "language": {
                    "sProcessing": "Traitement en cours ...",
                    "sLengthMenu": "Afficher _MENU_ lignes",
                    "sZeroRecords": "Aucun résultat trouvé",
                    "sEmptyTable": "Aucune donnée disponible",
                    "sInfo": "Lignes _START_ à _END_ sur _TOTAL_",
                    "sInfoEmpty": "Aucune ligne affichée",
                    "sInfoFiltered": "(Filtrer un maximum de_MAX_)",
                    "sInfoPostFix": "",
                    "sSearch": "Chercher:",
                    "sUrl": "",
                    "sInfoThousands": ",",
                    "sLoadingRecords": "Chargement...",
                    "oPaginate": {
                        "sFirst": "Premier", "sLast": "Dernier", "sNext": "Suivant", "sPrevious": "Précédent"
                    },
                    "oAria": {
                        "sSortAscending": ": Trier par ordre croissant", "sSortDescending": ": Trier par ordre décroissant"
                    }
                }
            });


        });


    </script>


    {#Fin script Traduction du datatable Anglais-> Français#}
    <script type="text/javascript">
        $(document).ready(function () {
            $('#datatable-responsive').DataTable();
        });

    </script>
    <script>
        var elements = $('.modal-overlay, .modal');

        $('#delete').click(function(){
            elements.addClass('active');
        });

        $('.close-modal').click(function(){
            elements.removeClass('active');
        });
    </script>
    <script>
        /*
         Change the datatable Content on the Language Change
         */
        $(document).ready(function () {
            $('#langueSelect').change(function () {
                var id=$("#langueSelect").find("option:selected").val();
                $(this).addClass('selected');
                var datapath = "{{ path('index_enseignant') }}";
                $.ajax({
                    type: 'POST',
                    url: datapath,
                    data: {
                        "lang": id,
                    },
                    success: function (response) {
                        var url = datapath + '?lang=' + id;
                        // reload the page with the new language choice
                        window.location.href = url;
                        $("#edit_act").val(id);

                    },
                    error: function (error) {
                    }

                })
            })
        });
    </script>
{% endblock %}






et ceci une capture d'écran sur les relations entre les tables :