Loading src/UnicaenUtilisateur/View/Helper/UserConnection.php +80 −17 Original line number Diff line number Diff line Loading @@ -2,39 +2,102 @@ namespace UnicaenUtilisateur\View\Helper; /** * Aide de vue de génération du lien de connexion/déconnexion à l'appli selon qu'un * utilisateur est connecté ou pas. * Aide de vue dessinant : * - soit le lien de connexion à l'appli : {@see renderConnection()}. * - soit le lien de déconnexion : {@see renderDisconnection()}. * - soit l'un ou l'autre selon qu'un utilisateur est connecté ou pas : {@see render()}. * * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr> * @author Unicaen */ class UserConnection extends UserAbstract { /** * Point d'entrée. * * @return UserConnection */ public function __invoke() protected $template = '<a class="%s" href="%s" title="%s">%s</a>'; protected $classes = [ 'user-connection', //'navbar-link', ]; public function __invoke(): self { return $this; } public function addClass(string $class): self { $this->classes[] = $class; return $this; } /** * Retourne le code HTML généré par cette aide de vue. * * @return string */ public function __toString() { $template = '%s'; $out = sprintf($template, $this->createConnectionLink()); return $this->render(); } return $out; public function render(): string { if ($this->getIdentity()) { return $this->renderDisconnection(); } else { return $this->renderConnection(); } } /** * @return string Lien de connexion, ou '' si l'utilisateur est déjà connecté. */ public function renderConnection(): string { if ($this->getIdentity()) { return ''; } $urlHelper = $this->getView()->plugin('url'); $href = $urlHelper('zfcuser/login'); $lib = "Connexion"; $title = "Cliquez pour vous authentifier"; if ($this->getTranslator()) { $lib = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain()); $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain()); } $classes = implode(' ', $this->classes); return sprintf($this->template, $classes, $href, $title, $lib); } /** * @return string Lien de déconnexion, ou '' si aucun utilisateur n'est connecté. */ public function renderDisconnection(): string { if (!$this->getIdentity()) { return ''; } $urlHelper = $this->getView()->plugin('url'); $href = $urlHelper('zfcuser/logout'); $lib = "Déconnexion"; $title = "Cliquez pour vous déconnecter"; if ($this->getTranslator()) { $lib = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain()); $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain()); } $classes = implode(' ', $this->classes); return sprintf($this->template, $classes, $href, $title, $lib); } /** * * @return string * @deprecated Utiliser {@see render()} */ protected function createConnectionLink() { Loading @@ -42,11 +105,11 @@ class UserConnection extends UserAbstract $urlHelper = $this->getView()->plugin('url'); $template = '<a class="navbar-link user-connection" href="%s" title="%s">%s</a>'; $template = '<a class="btn btn-lg btn-outline-primary navbar-link user-connection" href="%s" title="%s">%s</a>'; if (!$identity) { $href = $urlHelper('zfcuser/login'); $lib = "Connexion"; $title = "Affiche le formulaire d'authentification"; $title = "Cliquez pour vous authentifier"; } else { $href = $urlHelper('zfcuser/logout'); Loading src/UnicaenUtilisateur/View/Helper/UserConnectionFactory.php +1 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ namespace UnicaenUtilisateur\View\Helper; use Interop\Container\ContainerInterface; use Psr\Container\ContainerInterface; use Laminas\ServiceManager\FactoryInterface; use Laminas\ServiceManager\ServiceLocatorInterface; Loading src/UnicaenUtilisateur/View/Helper/UserCurrent.php +73 −76 Original line number Diff line number Diff line Loading @@ -2,13 +2,17 @@ namespace UnicaenUtilisateur\View\Helper; use Laminas\View\Renderer\PhpRenderer; use UnicaenAuthentification\View\Helper\UserStatus; /** * Aide de vue affichant toutes les infos concernant l'utilisateur courant. * C'est à dire : * - "Aucun" + lien de connexion OU BIEN nom de l'utilisateur connecté + lien de déconnexion * - profil de l'utilisateur connecté * - infos administratives sur l'utilisateur * Aide de vue affichant toutes les infos concernant l'utilisateur connecté. * C'est à dire le nom de l'utilisateur connecté & son rôle courant. * * Lorsqu'on clique sur le nom, s'affiche un popover * présentant les rôles sélectionnables, des infos administratives, le formulaire d'usurpation (si habilité) * et le lien de déconnexion. * * Si aucun utilisateur n'est connecté, cette aide de vue renvoit ''. * * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr> */ Loading Loading @@ -41,14 +45,17 @@ class UserCurrent extends UserAbstract */ public function __toString(): string { $id = 'user-current-info'; $userStatusHelper = $this->getView()->plugin('userStatus'); /* @var $userStatusHelper UserStatus */ $status = $userStatusHelper(false); if (! $this->getIdentity()) { return ''; } // - Nom de l'utilisateur connecté, le cas échéant. /* @var $userStatusHelper UserStatus */ $userStatusHelper = $this->view->plugin('userStatus'); $nom = $userStatusHelper(false); // - Rôle courant. $role = ''; $userProfileSelectable = true; if ($this->getIdentity()) { if ($userProfileSelectable) { $role = $this->getUserContext()->getSelectedIdentityRole(); // cas où aucun rôle n'est sélectionné : on affiche le 1er rôle sélectionnable ou sinon "user" Loading @@ -56,66 +63,64 @@ class UserCurrent extends UserAbstract $selectableRoles = $this->getUserContext()->getSelectableIdentityRoles(); $role = current($selectableRoles) ?: $this->getUserContext()->getIdentityRole('user'); } $status .= sprintf(", <small class='role-libelle'>%s</small>", !method_exists($role, '__toString') ? $role->getRoleId() : $role); $role = sprintf( "<br/><small class='role-libelle'>%s</small>", !method_exists($role, '__toString') ? $role->getRoleId() : $role ); } $userProfileHelper = $this->getView()->plugin('userProfile'); /* @var $userProfileHelper UserProfile */ // - Rôles sélectionnables. /* @var \UnicaenUtilisateur\View\Helper\UserProfile $userProfileHelper */ $userProfileHelper = $this->view->plugin('userProfile'); $userProfileHelper->setUserProfileSelectable($userProfileSelectable); $roles = (string) $userProfileHelper; $userInfoHelper = $this->getView()->plugin('userInfo'); /* @var $userInfoHelper UserInfo */ $content = $userProfileHelper; // Affichage des affectations // - Infos administratives. $infos = ''; if ($this->isDisplayUserInfo()) { $content .= $userInfoHelper($this->getAffectationFineSiDispo()); /* @var \UnicaenUtilisateur\View\Helper\UserInfo $userInfoHelper */ $userInfoHelper = $this->view->plugin('userInfo'); $infos = (string)$userInfoHelper($this->getAffectationFineSiDispo()); } // formulaire d'usurpation d'identité // - Usurpation d'identité. $usurpation = ''; /** @var PhpRenderer $renderer */ $renderer = $this->getView(); // teste si userUsurpation de UnicaenAuthentification est dispo sans avoir de dépendance forte avec cette bib if ($renderer->getHelperPluginManager()->has('userUsurpation')) { /* @var \UnicaenAuthentification\View\Helper\UserUsurpationHelper $userUsurpationHelper */ $userUsurpationHelper = $renderer->plugin('userUsurpation'); $content .= $userUsurpationHelper; } } else { $content = _("Aucun"); if ($this->getTranslator()) { $content = $this->getTranslator()->translate($content, $this->getTranslatorTextDomain()); $userUsurpationHelper = $this->view->plugin('userUsurpation'); $usurpation = (string)$userUsurpationHelper; } } $content = htmlspecialchars(preg_replace('/\r\n|\n|\r/', '', $content)); $title = _("Utilisateur connecté à l'application"); if ($this->getTranslator()) { $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain()); } $out = <<<EOS <a class="navbar-link" id="$id" title="$title" // - Lien de déconnexion. /** @var \UnicaenUtilisateur\View\Helper\UserConnection $userConnectionHelper */ $userConnectionHelper = $this->getView()->plugin('userConnection'); $deconnexion = $userConnectionHelper->addClass('btn btn-lg btn-outline-success')->renderDisconnection(); // Dans un popover $linkText = $nom . $role; $popoverContent = htmlspecialchars(preg_replace('/\r\n|\n|\r/', '', $roles . $infos . $usurpation . '<hr>' . '<div class="text-center">' . $deconnexion . '</div>' )); return <<<EOS <a class="navbar-link dropdown-toggle" id="user-current-info" data-bs-placement="bottom" data-bs-toggle="popover" data-bs-container="#navbar" data-bs-html="true" data-bs-content="$content" href="#">$status<span class="caret"></span></a> EOS; $out .= PHP_EOL; $js = <<<EOS $(function() { $("#$id").popover({ html: true, sanitize: false, container: '#navbar' }); }); data-bs-sanitize="false" data-bs-content="$popoverContent" onclick="return false" href="#">$linkText<span class="caret"></span></a> EOS; $this->getView()->plugin('inlineScript')->offsetSetScript(1000, $js); return $out; } /** Loading @@ -140,23 +145,15 @@ EOS; return $this; } public function isDisplayUserInfo(): bool { return $this->displayUserInfo; } public function setDisplayUserInfo(bool $displayUserInfo): UserCurrent { $this->displayUserInfo = $displayUserInfo; return $this; } } src/UnicaenUtilisateur/View/Helper/UserInfo.php +2 −1 Original line number Diff line number Diff line Loading @@ -96,11 +96,12 @@ class UserInfo extends UserAbstract } } else { $template = "<strong>Informations administratives :</strong> <br>%s"; $aucuneAffDispo = _("Aucune information disponible."); if ($this->getTranslator()) { $aucuneAffDispo = $this->getTranslator()->translate($aucuneAffDispo, $this->getTranslatorTextDomain()); } $out .= $aucuneAffDispo; $out .= sprintf($template, $aucuneAffDispo); } return $out; Loading src/UnicaenUtilisateur/View/Helper/UserProfile.php +2 −6 Original line number Diff line number Diff line Loading @@ -2,9 +2,6 @@ namespace UnicaenUtilisateur\View\Helper; use UnicaenUtilisateur\Entity\Db\AbstractRole; use UnicaenUtilisateur\Entity\Db\RoleInterface; /** * Aide de vue permettant d'afficher le profil de l'utilisateur connecté. * Loading Loading @@ -39,7 +36,7 @@ class UserProfile extends UserAbstract */ public function render() { $title = _("Profil utilisateur"); $title = _("Rôle utilisateur"); $unknown = _("Inconnu"); $none = _("Aucun"); Loading @@ -48,8 +45,8 @@ class UserProfile extends UserAbstract $unknown = $this->getTranslator()->translate($unknown, $this->getTranslatorTextDomain()); $none = $this->getTranslator()->translate($none, $this->getTranslatorTextDomain()); } $roles = $this->getIdentityRolesAsOptions(); $roles = $this->getIdentityRolesAsOptions(); if (!$roles) { $roles[] = $none; Loading @@ -60,7 +57,6 @@ class UserProfile extends UserAbstract if ($this->userProfileSelectable) { $html .= $this->view->userProfileSelect(false); } else { $html .= $this->view->htmlList($roles); } Loading Loading
src/UnicaenUtilisateur/View/Helper/UserConnection.php +80 −17 Original line number Diff line number Diff line Loading @@ -2,39 +2,102 @@ namespace UnicaenUtilisateur\View\Helper; /** * Aide de vue de génération du lien de connexion/déconnexion à l'appli selon qu'un * utilisateur est connecté ou pas. * Aide de vue dessinant : * - soit le lien de connexion à l'appli : {@see renderConnection()}. * - soit le lien de déconnexion : {@see renderDisconnection()}. * - soit l'un ou l'autre selon qu'un utilisateur est connecté ou pas : {@see render()}. * * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr> * @author Unicaen */ class UserConnection extends UserAbstract { /** * Point d'entrée. * * @return UserConnection */ public function __invoke() protected $template = '<a class="%s" href="%s" title="%s">%s</a>'; protected $classes = [ 'user-connection', //'navbar-link', ]; public function __invoke(): self { return $this; } public function addClass(string $class): self { $this->classes[] = $class; return $this; } /** * Retourne le code HTML généré par cette aide de vue. * * @return string */ public function __toString() { $template = '%s'; $out = sprintf($template, $this->createConnectionLink()); return $this->render(); } return $out; public function render(): string { if ($this->getIdentity()) { return $this->renderDisconnection(); } else { return $this->renderConnection(); } } /** * @return string Lien de connexion, ou '' si l'utilisateur est déjà connecté. */ public function renderConnection(): string { if ($this->getIdentity()) { return ''; } $urlHelper = $this->getView()->plugin('url'); $href = $urlHelper('zfcuser/login'); $lib = "Connexion"; $title = "Cliquez pour vous authentifier"; if ($this->getTranslator()) { $lib = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain()); $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain()); } $classes = implode(' ', $this->classes); return sprintf($this->template, $classes, $href, $title, $lib); } /** * @return string Lien de déconnexion, ou '' si aucun utilisateur n'est connecté. */ public function renderDisconnection(): string { if (!$this->getIdentity()) { return ''; } $urlHelper = $this->getView()->plugin('url'); $href = $urlHelper('zfcuser/logout'); $lib = "Déconnexion"; $title = "Cliquez pour vous déconnecter"; if ($this->getTranslator()) { $lib = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain()); $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain()); } $classes = implode(' ', $this->classes); return sprintf($this->template, $classes, $href, $title, $lib); } /** * * @return string * @deprecated Utiliser {@see render()} */ protected function createConnectionLink() { Loading @@ -42,11 +105,11 @@ class UserConnection extends UserAbstract $urlHelper = $this->getView()->plugin('url'); $template = '<a class="navbar-link user-connection" href="%s" title="%s">%s</a>'; $template = '<a class="btn btn-lg btn-outline-primary navbar-link user-connection" href="%s" title="%s">%s</a>'; if (!$identity) { $href = $urlHelper('zfcuser/login'); $lib = "Connexion"; $title = "Affiche le formulaire d'authentification"; $title = "Cliquez pour vous authentifier"; } else { $href = $urlHelper('zfcuser/logout'); Loading
src/UnicaenUtilisateur/View/Helper/UserConnectionFactory.php +1 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ namespace UnicaenUtilisateur\View\Helper; use Interop\Container\ContainerInterface; use Psr\Container\ContainerInterface; use Laminas\ServiceManager\FactoryInterface; use Laminas\ServiceManager\ServiceLocatorInterface; Loading
src/UnicaenUtilisateur/View/Helper/UserCurrent.php +73 −76 Original line number Diff line number Diff line Loading @@ -2,13 +2,17 @@ namespace UnicaenUtilisateur\View\Helper; use Laminas\View\Renderer\PhpRenderer; use UnicaenAuthentification\View\Helper\UserStatus; /** * Aide de vue affichant toutes les infos concernant l'utilisateur courant. * C'est à dire : * - "Aucun" + lien de connexion OU BIEN nom de l'utilisateur connecté + lien de déconnexion * - profil de l'utilisateur connecté * - infos administratives sur l'utilisateur * Aide de vue affichant toutes les infos concernant l'utilisateur connecté. * C'est à dire le nom de l'utilisateur connecté & son rôle courant. * * Lorsqu'on clique sur le nom, s'affiche un popover * présentant les rôles sélectionnables, des infos administratives, le formulaire d'usurpation (si habilité) * et le lien de déconnexion. * * Si aucun utilisateur n'est connecté, cette aide de vue renvoit ''. * * @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr> */ Loading Loading @@ -41,14 +45,17 @@ class UserCurrent extends UserAbstract */ public function __toString(): string { $id = 'user-current-info'; $userStatusHelper = $this->getView()->plugin('userStatus'); /* @var $userStatusHelper UserStatus */ $status = $userStatusHelper(false); if (! $this->getIdentity()) { return ''; } // - Nom de l'utilisateur connecté, le cas échéant. /* @var $userStatusHelper UserStatus */ $userStatusHelper = $this->view->plugin('userStatus'); $nom = $userStatusHelper(false); // - Rôle courant. $role = ''; $userProfileSelectable = true; if ($this->getIdentity()) { if ($userProfileSelectable) { $role = $this->getUserContext()->getSelectedIdentityRole(); // cas où aucun rôle n'est sélectionné : on affiche le 1er rôle sélectionnable ou sinon "user" Loading @@ -56,66 +63,64 @@ class UserCurrent extends UserAbstract $selectableRoles = $this->getUserContext()->getSelectableIdentityRoles(); $role = current($selectableRoles) ?: $this->getUserContext()->getIdentityRole('user'); } $status .= sprintf(", <small class='role-libelle'>%s</small>", !method_exists($role, '__toString') ? $role->getRoleId() : $role); $role = sprintf( "<br/><small class='role-libelle'>%s</small>", !method_exists($role, '__toString') ? $role->getRoleId() : $role ); } $userProfileHelper = $this->getView()->plugin('userProfile'); /* @var $userProfileHelper UserProfile */ // - Rôles sélectionnables. /* @var \UnicaenUtilisateur\View\Helper\UserProfile $userProfileHelper */ $userProfileHelper = $this->view->plugin('userProfile'); $userProfileHelper->setUserProfileSelectable($userProfileSelectable); $roles = (string) $userProfileHelper; $userInfoHelper = $this->getView()->plugin('userInfo'); /* @var $userInfoHelper UserInfo */ $content = $userProfileHelper; // Affichage des affectations // - Infos administratives. $infos = ''; if ($this->isDisplayUserInfo()) { $content .= $userInfoHelper($this->getAffectationFineSiDispo()); /* @var \UnicaenUtilisateur\View\Helper\UserInfo $userInfoHelper */ $userInfoHelper = $this->view->plugin('userInfo'); $infos = (string)$userInfoHelper($this->getAffectationFineSiDispo()); } // formulaire d'usurpation d'identité // - Usurpation d'identité. $usurpation = ''; /** @var PhpRenderer $renderer */ $renderer = $this->getView(); // teste si userUsurpation de UnicaenAuthentification est dispo sans avoir de dépendance forte avec cette bib if ($renderer->getHelperPluginManager()->has('userUsurpation')) { /* @var \UnicaenAuthentification\View\Helper\UserUsurpationHelper $userUsurpationHelper */ $userUsurpationHelper = $renderer->plugin('userUsurpation'); $content .= $userUsurpationHelper; } } else { $content = _("Aucun"); if ($this->getTranslator()) { $content = $this->getTranslator()->translate($content, $this->getTranslatorTextDomain()); $userUsurpationHelper = $this->view->plugin('userUsurpation'); $usurpation = (string)$userUsurpationHelper; } } $content = htmlspecialchars(preg_replace('/\r\n|\n|\r/', '', $content)); $title = _("Utilisateur connecté à l'application"); if ($this->getTranslator()) { $title = $this->getTranslator()->translate($title, $this->getTranslatorTextDomain()); } $out = <<<EOS <a class="navbar-link" id="$id" title="$title" // - Lien de déconnexion. /** @var \UnicaenUtilisateur\View\Helper\UserConnection $userConnectionHelper */ $userConnectionHelper = $this->getView()->plugin('userConnection'); $deconnexion = $userConnectionHelper->addClass('btn btn-lg btn-outline-success')->renderDisconnection(); // Dans un popover $linkText = $nom . $role; $popoverContent = htmlspecialchars(preg_replace('/\r\n|\n|\r/', '', $roles . $infos . $usurpation . '<hr>' . '<div class="text-center">' . $deconnexion . '</div>' )); return <<<EOS <a class="navbar-link dropdown-toggle" id="user-current-info" data-bs-placement="bottom" data-bs-toggle="popover" data-bs-container="#navbar" data-bs-html="true" data-bs-content="$content" href="#">$status<span class="caret"></span></a> EOS; $out .= PHP_EOL; $js = <<<EOS $(function() { $("#$id").popover({ html: true, sanitize: false, container: '#navbar' }); }); data-bs-sanitize="false" data-bs-content="$popoverContent" onclick="return false" href="#">$linkText<span class="caret"></span></a> EOS; $this->getView()->plugin('inlineScript')->offsetSetScript(1000, $js); return $out; } /** Loading @@ -140,23 +145,15 @@ EOS; return $this; } public function isDisplayUserInfo(): bool { return $this->displayUserInfo; } public function setDisplayUserInfo(bool $displayUserInfo): UserCurrent { $this->displayUserInfo = $displayUserInfo; return $this; } }
src/UnicaenUtilisateur/View/Helper/UserInfo.php +2 −1 Original line number Diff line number Diff line Loading @@ -96,11 +96,12 @@ class UserInfo extends UserAbstract } } else { $template = "<strong>Informations administratives :</strong> <br>%s"; $aucuneAffDispo = _("Aucune information disponible."); if ($this->getTranslator()) { $aucuneAffDispo = $this->getTranslator()->translate($aucuneAffDispo, $this->getTranslatorTextDomain()); } $out .= $aucuneAffDispo; $out .= sprintf($template, $aucuneAffDispo); } return $out; Loading
src/UnicaenUtilisateur/View/Helper/UserProfile.php +2 −6 Original line number Diff line number Diff line Loading @@ -2,9 +2,6 @@ namespace UnicaenUtilisateur\View\Helper; use UnicaenUtilisateur\Entity\Db\AbstractRole; use UnicaenUtilisateur\Entity\Db\RoleInterface; /** * Aide de vue permettant d'afficher le profil de l'utilisateur connecté. * Loading Loading @@ -39,7 +36,7 @@ class UserProfile extends UserAbstract */ public function render() { $title = _("Profil utilisateur"); $title = _("Rôle utilisateur"); $unknown = _("Inconnu"); $none = _("Aucun"); Loading @@ -48,8 +45,8 @@ class UserProfile extends UserAbstract $unknown = $this->getTranslator()->translate($unknown, $this->getTranslatorTextDomain()); $none = $this->getTranslator()->translate($none, $this->getTranslatorTextDomain()); } $roles = $this->getIdentityRolesAsOptions(); $roles = $this->getIdentityRolesAsOptions(); if (!$roles) { $roles[] = $none; Loading @@ -60,7 +57,6 @@ class UserProfile extends UserAbstract if ($this->userProfileSelectable) { $html .= $this->view->userProfileSelect(false); } else { $html .= $this->view->htmlList($roles); } Loading