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 :
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 :
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 :
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 :
<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.
Partager