Commit 03cda7ad authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Rattrapage des évolutions dans unicaen/auth : aides de vues User*

parent 50bda821
Loading
Loading
Loading
Loading
+80 −17
Original line number Diff line number Diff line
@@ -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()
    {
@@ -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');
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@

namespace UnicaenUtilisateur\View\Helper;

use Interop\Container\ContainerInterface;
use Psr\Container\ContainerInterface;
use Laminas\ServiceManager\FactoryInterface;
use Laminas\ServiceManager\ServiceLocatorInterface;

+73 −76
Original line number Diff line number Diff line
@@ -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>
 */
@@ -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"
@@ -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;
    }

    /**
@@ -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;
    }




}
+2 −1
Original line number Diff line number Diff line
@@ -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;
+2 −6
Original line number Diff line number Diff line
@@ -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é.
 *
@@ -39,7 +36,7 @@ class UserProfile extends UserAbstract
     */
    public function render()
    {
        $title   = _("Profil utilisateur");
        $title   = _("Rôle utilisateur");
        $unknown = _("Inconnu");
        $none    = _("Aucun");

@@ -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;
@@ -60,7 +57,6 @@ class UserProfile extends UserAbstract
        if ($this->userProfileSelectable) {
            $html .= $this->view->userProfileSelect(false);
        } else {

            $html .= $this->view->htmlList($roles);
        }

Loading