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 :

Question sur les dashboards


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : octobre 2016
    Messages : 37
    Points : 37
    Points
    37
    Par défaut Question sur les dashboards
    Bonjour, j'ai une petite question. Je travaille sous Symfony 3.1.

    Imaginons que j'ai un utilisateur qui possède plusieurs rôles il est relié à une ou plusieurs crèche(s). Dans les rôles , l'utilisateur peut être travailleur simple d'une crèche mais aussi gérant d'une crèche auquel cas il a un dashboard différent. L'utilisateur peut être gérant de plusieurs crèches auquel cas il doit pouvoir accéder aux dashboards de plusieurs crèches.

    J'ai mis en place un dropdown qui permet à l'utilisateur qui a le bon rôle de naviguer entre les différents dashboards cependant j'ai un petit problème.

    Pour que l'utilisateur puisse naviguer entre les différents dashboards en tant que gestionnaire de crèche on doit avoir l'utilisateur courant (on peut accéder à l'utilisateur courant via le contrôleur ou à partir d'une vue grâce a Symfony) mais on doit avoir une information (par exemple l'identifiant) sur la crèche en question ! Et c'est la que vient ma question : Comment mettre cela en place ?

    Je peux accéder au dashboard de la bonne crèche en faisant une route par exemple : /{id_creche}/dashboard et mettre dans une vue un lien pour chaque crèche à laquelle est lié l'utilisateur courant. Mais une fois qu'on va sur une autre page du dashboard on n'a plus d'information par rapport à la crèche ce qui ne me permet pas de développer des fonctionnalités sur base de la crèche en question.

    J'ai pensé à une solution qui fonctionne mais qui a un défaut : je mets l'identifiant de la crèche dans la session lorsque l'utilisateur choisit la crèche à laquelle il veut se connecter en tant que gestionnaire. Cela me permet de récupérer cet identifiant dans la vue et de construire des fonctionnalités dans le dashboard du manager de la crèche lambda par rapport à la crèche lambda. J'ai même introduit une petite condition qui stipule que lorsque l'on se connecte à un dashboard gérant de crèche on vérifie si l'identifiant de la crèche qu'on à dans la variable session est bien celui de la crèche où on veut aller. Ceci dit, si on est dans /{id_creche=5}/fonctionalite-super-sympa et qu'on change l'url en /{id_creche=18}/fonctionalite-super-sympa on va avoir des problèmes car ma vérification n'a pas été faire et je suppose qu"il doit y avoir un moyen de faire ça plus proprement que de mettre la condition sur chaque fonctionnalité...

    Au niveau code ça donne :
    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
        public function dashboardAction($nursery_id)
        {
            //$currentUser = $this->get('security.token_storage')->getToken()->getUser();
            $nurseryRepo = $this->getDoctrine()->getRepository('VSCrmBundle:Nursery');
     
            $nursery = $nurseryRepo->findOneBy(array('id' => $nursery_id));
     
            // Let's start the session and store in it the nursery_id
            $session = $this->get('session');
            $test = $session->get('nid');
     
            // if the nursery_id stored in the session is not our nursery_id we change it
            if($test != $nursery_id)
            {
                $session->set('nid', (int)$nursery_id);
            }
     
            // Sometimes may help
            if(!$nursery)
            {
                throw $this->createNotFoundException("The nursery has not been found or you are not allowed to access it.");
            }
     
            return $this->render("VSCrmBundle:Manager:dashboard.html.twig", array(
                'nursery' => $nursery
            ));
        }
    Mon petit dropdown :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <li class="dropdown-header">Nurseries</li>
              {% if is_granted('ROLE_MANAGER') %}
                      {% for nursery in app.user.nurseries %}
                        <li><a href="{{ path('vs_crm_nursery_manager_dashboard', {'nursery_id' : nursery.id}) }}">{{ nursery.name }} dashboard</a></li>
                    {% endfor %}
             {% endif %}
    </li>
    Et un exemple concret : On est le dashboard du gérant de la crèche alpha et on veut voir tous le personnel dans cette crèche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public function getAllAction($nursery_id){
            $allNurseryStaff = $this->getDoctrine()->getRepository('VSCrmBundle:Nursery')->getNurseryStaff($nursery_id);
     
            return $this->render('VSCrmBundle:Manager\Staff:get-all.html.twig', array(
                'staff' => $allNurseryStaff
            ));
        }
    et on accède à ce contrôleur via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li><a href="{{ path('vs_crm_staff_get_all', {'nursery_id': app.session.get('nid')}) }}">Staff</a></li>
    Donc voilà c'est un peu long mais c'est difficile d'expliquer, si vous avez déjà rencontré ce problème alors comment l'avez-vous résolu ?!

    Merci.

  2. #2
    Membre émérite
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2012
    Messages
    2 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2012
    Messages : 2 030
    Points : 2 885
    Points
    2 885
    Par défaut
    j'ai lu de façon rapide.

    * pour essayer de repondre, normalement il faut faire en sorte de faire les traitements dans le controller et servir les données à afficher à la vue.
    la vue doit avoir le moins de logique possible.

    * après, tu peux aller voir du coté des macros twig.
    cela permet de factoriser du code html et d'y inclure des conditions ou pas (en fonction des rôles...)

    * ou un include de template conditionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {% include isValid ? 'option1.html.twig' : 'option2.html,twig' %}
    * ou encore le render controller (à utiliser avec sagesse)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : octobre 2016
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par dukoid Voir le message
    j'ai lu de façon rapide.

    * pour essayer de repondre, normalement il faut faire en sorte de faire les traitements dans le controller et servir les données à afficher à la vue.
    la vue doit avoir le moins de logique possible.

    * après, tu peux aller voir du coté des macros twig.
    cela permet de factoriser du code html et d'y inclure des conditions ou pas (en fonction des rôles...)

    * ou un include de template conditionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {% include isValid ? 'option1.html.twig' : 'option2.html,twig' %}
    * ou encore le render controller (à utiliser avec sagesse)
    A mon avis, je me suis mal exprimé...

    Imaginons que l'utilisateur puisse se connecter à plusieurs dashboards qui représentent des crèches différentes.

    Il me faut l'identifiant de la crèche à laquelle il est lié. Ceci se fait dans mon dropdown (la où je fais "for nursery in app.user.nurseries" ) car je génère un lien vers toutes les crèches auxquelles mon utilisateur est lié. Jusque la tout va bien.

    Arrivant sur le dashboard de la crèche lambda je veux afficher tous les membres du personnel de la crèche en question mais pour cela il me faut l'identifiant de cette crèche que je n'ai plus ...

    D'où ma solution qui est de mettre l'identifiant de la crèche à laquelle on se connecte la session et de la récupérer dans la vue pour faire un lien vers la méthode "affiche le personnel de la crèche" qui prend l'identifiant de la crèche. Le problème est que si on change l'url manuellement, on peut se retrouver avec des données erronées car ma vérification de l'identifiant se fait que quand on accède au dashboard et pas par après. La deuxième solution (à mon avis) serait de demander à toutes les fonctions du dashboard d'une crèche lambda l’identifiant de la crèche en paramètre. Mais est-ce une bonne solution ?

  4. #4
    Membre émérite
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2012
    Messages
    2 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2012
    Messages : 2 030
    Points : 2 885
    Points
    2 885
    Par défaut
    mettre un ID dans une url n'est pas une bonne chose. déjà c'est un peu degueux visuellement, de plus c'est pas sécurisé.
    je mettrais plutôt /creche-paris /creche-dijon (qui est une sorte de code unique/slug en base de donnée)


    à chaque action du controlleur : sous la forme d'un listener. une sorte de pre action
    - tu dois vérifier que l'user a bien le droit d'accès à la crèche indiqué : (creche-paris par exemple)
    - tu récupères en même temps son ID (pour l'utiliser dans l'action)


    à savoir, qu'il existe des fonctions pour slugyfier des phrases pour le format url, par exemple pour la ville : Bagnères de Bigorre deviendra : bagnere-de-bigorre (que tu concatenera avec "creche-") -> creche-bagnere-de-bigorre

    prévoir le cas si il y a 2 ou x creches dans une ville...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : octobre 2016
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par dukoid Voir le message
    mettre un ID dans une url n'est pas une bonne chose. déjà c'est un peu degueux visuellement, de plus c'est pas sécurisé.
    je mettrais plutôt /creche-paris /creche-dijon (qui est une sorte de code unique/slug en base de donnée)


    à chaque action du controlleur : sous la forme d'un listener. une sorte de pre action
    - tu dois vérifier que l'user a bien le droit d'accès à la crèche indiqué : (creche-paris par exemple)
    - tu récupères en même temps son ID (pour l'utiliser dans l'action)


    à savoir, qu'il existe des fonctions pour slugyfier des phrases pour le format url, par exemple pour la ville : Bagnères de Bigorre deviendra : bagnere-de-bigorre (que tu concatenera avec "creche-") -> creche-bagnere-de-bigorre

    prévoir le cas si il y a 2 ou x creches dans une ville...
    Un grand merci à toi ! C'est bien la question de la sécurité qui me tracasse dans tout ça... Je vais essayer tout ca

Discussions similaires

  1. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 14h49
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 03h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 14h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 09h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 17h11

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