Skip to content
Snippets Groups Projects
Select Git revision
  • 37e02b3bf7ce4ef8befb55526d9626805e57e44d
  • master default protected
  • b24
  • ll-workflow
  • alc-scindage-donnees-pj
  • FJ_LL_Tbl_Contrat
  • alc-docker-node
  • ll-apiplatform
  • php84
  • ll-rgpd
  • b23
  • alc-filtre-type-intervenant
  • ll-sans-mdb5
  • formules-ancienne-infra
  • ll-formules
  • alc-intervenant-dmep
  • ll-suppr-v_vol-s
  • b20
  • ll-postgresql
  • b23.0.1
  • b22
  • 24.8
  • 24.7
  • 24.6
  • 24.5
  • 24.4
  • 24.3
  • 24.2
  • 24.1
  • 24.0
  • 23.15
  • 24.0-beta19
  • 24.0-beta18
  • 24.0-beta17
  • 24.0-beta16
  • 24.0-beta15
  • 24.0-beta14
  • 24.0-beta13
  • 23.14
  • 24.0-beta12
  • 24.0-beta11
41 results

RoleProvider.php

Blame
  • user avatar
    gauthierb authored
    Ajout du nécessaire pour la sélection d'une structure à associer au profil Administrateur (mémorisée en session).
    NB : pour l'instant du code est mis en commentaires dans UserProfileSelectRadioItem::render() et dans AdministrateurRole (implementation de StructureAwareInterface) pour ne pas foutre la merde.
    37e02b3b
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    RoleProvider.php 3.79 KiB
    <?php
    
    namespace Application\Provider\Role;
    
    use Application\Acl\AdministrateurRole;
    use Application\Entity\Db\Role;
    use Application\Entity\Db\Structure as StructureEntity;
    use Application\Interfaces\StructureAwareInterface;
    use BjyAuthorize\Provider\Role\ProviderInterface;
    use Exception;
    use UnicaenApp\Exception\LogicException;
    use UnicaenApp\Service\EntityManagerAwareInterface;
    use UnicaenApp\Service\EntityManagerAwareTrait;
    use Zend\Permissions\Acl\Role\RoleInterface;
    
    /**
     * Fournisseur des rôles utilisateurs de l'application :
     * - ceux définis dans la configuration du fournisseur
     *
     *  * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
     */
    class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
    {
        use EntityManagerAwareTrait;
    
        /**
         * @var array
         */
        protected $config = [];
    
        /**
         * @var array
         */
        protected $roles;
    
        /**
         * Constructeur.
         * @param array $config
         */
        public function __construct( $config = [] )
        {
            $this->config = $config;
        }
    
        public function init()
        {
            $this->getEntityManager()->getFilters()->enable('historique');
        }
    
        /**
         * @return RoleInterface[]
         */
        public function getRoles()
        {
            if (null === $this->roles) {
                $this->roles = array();
    
                // Chargement des rôles de base
                foreach( $this->config as $classname ){
                    if (class_exists( $classname )){
                        $role = new $classname; /* @var $role RoleInterface */
                        $this->roles[$role->getRoleId()] = $role;
                    }else{
                        throw new LogicException('La classe "'.$classname.'" déclarée dans la configuration du fournisseur de rôles n\'a pas été trouvée.');
                    }
                }
    
                // chargement des rôles métiers
                $qb = $this->getEntityManager()->createQueryBuilder()
                    ->from("Application\Entity\Db\Role", "r")
                    ->select("r, tr, s")
                    ->distinct()
                    ->join("r.type", "tr")
                    ->leftJoin("r.structure", "s");
                foreach ($qb->getQuery()->getResult() as $role) { /* @var $role Role */
                    $roleId = $role->getType()->getCode();
                    if (! isset($this->roles[$roleId])){
                        throw new Exception('Le rôle "'.$roleId.'" est inconnu.');
                    }
                    $classname = get_class($this->roles[$roleId]);
                    if ($this->roles[$roleId] instanceof StructureAwareInterface && $role->getStructure()){
                        $roleId .= '-'.$role->getStructure()->getSourceCode();
                        $this->roles[$roleId] = new $classname($roleId);
                        $this->roles[$roleId]->setStructure( $role->getStructure() );
                    }else{
                        $this->roles[$roleId] = new $classname($roleId);
                    }
                    $this->roles[$roleId]->setTypeRole( $role->getType() );
                    
                    $this->injectSelectedStructureInRole($this->roles[$roleId]);
                }
            }
            
            return $this->roles;
        }
    
        /**
         * Inject la structure sélectionnée en session dans le rôle Administrateur.
         * 
         * @param Role $role
         * @return self
         */
        public function injectSelectedStructureInRole($role)
        {
            if (! $role instanceof AdministrateurRole) {
                return $this;
            }
                
            $role->setStructure($this->structureSelectionnee);
            
            return $this;
        }
    
        /**
         * @var StructureEntity
         */
        protected $structureSelectionnee;
        
        public function setStructureSelectionnee(StructureEntity $structureSelectionnee = null)
        {
            $this->structureSelectionnee = $structureSelectionnee;
            
            return $this;
        }
    }