# Module User
## Intégration

### Module
Afin de joindre le module **user** à l'application, il faudra ajouter au fichier `composer.json` à la racine du projet l'élément suivant :
```json
{
    "require": {
      "siam-plugins/user": "XXX"
    }
}
```

### ACL
Le plugin propose un outil de contrôle d'accès, pour l'intégrer à l'application, il faudra ajouter au fichier `Module.php` ou `Application.php` les informations suivantes :
```PHP
<?php
class Module {
    public function onBootstrap(MvcEvent $e) {
        $app = $e->getApplication();
        $eventManager = $app->getEventManager();
        // [...]
        // Récupération de l'utilisateur connecté
        $user = $e->getApplication()
                    ->getServiceManager()
                    ->get('Zend\Authentication\AuthenticationService')
                    ->getIdentity();

        // Contient la config de l'ACL et peut être intégrée avec un include.
        $configAcl = array();

        // Sauvegarde l'objet ACL dans le module
        $acl = new Acl();

        // Initialise l'ACL avec l'utilisateur connecté, la liste des droits et le droit par defaut
        $acl->initialize($user, $configAcl, Role::ROLE_GUEST);
                //on passe l'objet ACL à la vue pour plus tard
                $e->getViewModel()->acl = $acl;

        // Appelle la fonction 'checkAcl' lors du déclenchement de l'event "route" depuis l'objet ACL du module
        $eventManager->attach('route', array($acl, 'checkAcl'));
        // Appelle la fonction 'handler' lors du déclenchement de l'event "route" depuis l'objet ACL du module
        $eventManager->attach(Acl::RIGHTS_ERROR, array($acl, 'handler'));

        // [...]
    }
}
?>
```
:warning: Il est possible de modifier le comportement par défaut du vérificateur de droits (fonction `checkAcl`) et de la gestion des erreurs (fonction `handler`),
pour celà, il faudra définir une nouvelle fonction (dans le module ou dans un autre objet), puis l'appeler à l'aide du callback.
```PHP
array($element, $nomFonction)
```
#### Format des ACLs
Le format requis est le suivant :
```PHP
<?php
return array(
    'roles' => array(
        'administrator' => array(
            // Peut se déconnecter
            'User\Controller\Authentication' => array('logout'),
            // Peut gérer son compte
            'User\Controller\Identity',
            // Peut gérer la liste des utisateur
            'User\Controller\User',
        ),
        'user' => array(
            // Peut se déconnecter
            'User\Controller\Authentication' => array('logout'),
            // Peut gérer son compte
            'User\Controller\Identity',
        ),
        'guest' => array(
            // Peut accèder aux fonctions de connexion
            'User\Controller\Authentication' => array('login', 'password-recovery', 'password-edit'),
        ),
    ),
);
```
Dans le tableau ci-dessus, les clefs correspondent aux noms des rôles et correspondent aux droits associés.

Quand la clef d'un droit est associée à un talbeau, chaque valeur sera associée à un controlleur et s'il possède des éléments, à une action,
dans le cas contraire, toutes les actions du controlleur seront autorisées.

### Les erreurs
Le fichier d'ACL s'occupe de gérer les erreurs 401 (Non indentifié) et 403 (accès interdit).
Il se base sur le layout d'erreur dans `/error/layout.phtml` et ses templates `/error/401.phtml` et `/error/403.phtml`.

Ce layout et ces templates peuvent être surchargées dans l'application hôte.


## Configuration et personnalisation
### Fichier de configuration
La configuration s'effectue sur plusieurs points
#### Application
Cet élément contient les éléments de configuration "simples" du module.
```PHP
<?php
array(
    'application' => array(
        'name' => 'Nom du site à afficher',
        'description' => 'Description du site',
        'password' => array( // Informations relatives au mot de passe
            'salt' => '$@l7',
        ),
    ),
);
```
#### Module
Le module doit connaitre deux informations importantes, la première étant la route de redirection par défaut (`accueil` par défaut) et la classe comportant les rôles.

```PHP
<?php
array(
    'brique' => array(
        'user' => array(
            'home_route' => 'accueil',
            'role_class' => 'User\Entity\Reference\Role',
        ),
    ),
);
```
:warning: La classe de rôle doit cependant impérativement être une instance de `User\Util\Enum`.

### Surcharge des vues
Les vues sont surchargeable en **définissant le module user avant le module hôte**, ainsi il est possible de définir dans `NAMESPACE/view/user` les nouvelles vues pour `USER/view/user`.

### Changement des routes
Les routes peuvent être surchargées en les ajoutant dans l'autoload de l'application (`/config/autoload`).

Par exemple, le fichier `/config/autoload/routes.global.php` :
```PHP
<?php
return array(
    'router' => array(
        'routes' => array(
            'id_de_la_route' => array(
                'clef_a_surcharger' => 'nouvelle_valeur',
                'child_routes' => array(
                    'clef_a_surcharger' => 'nouvelle_valeur',
                ),
            ),
        ),
    ),
);
```