Documentation technique

Version 13 (Alexandre Cases, 06/03/2016 10:41 am) → Version 14/22 (Etienne Pallier, 06/03/2016 03:52 pm)

h1. Documentation technique

Cette page décrit les différents concepts techniques utilisés dans le projet.

[ [[Labinvent_nouvelle_version|Retour au sommmaire]] ]

{{toc}}

---

h2. LIENS UTILES

* HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting

* [[Installation|Page wiki pour l'installation]]

* Version majeure en cours (2.1): https://projects.irap.omp.eu/versions/101

* Liste complète des évolutions: https://gitlab.irap.omp.eu/epallier/labinvent/commits/master

* Browse files (gitlab): https://gitlab.irap.omp.eu/epallier/labinvent/tree/master

* Inventirap 1.3 (prod): https://inventirap.irap.omp.eu

* Inventirap 1.3 (test): https://inventirap-test.irap.omp.eu/

* CakePhp:

* ROADMAP: https://github.com/cakephp/cakephp/wiki
* Forum cakephp: http://discourse.cakephp.org
* Quickstart tutorial: http://book.cakephp.org/3.0/en/quickstart.html
* Bookmarker tutorial: https://github.com/cakephp/bookmarker-tutorial
* Cakephp CRUD: https://github.com/FriendsOfCake/crud

---

h2. Schéma de la base de données (v2.0.0)

{{thumbnail(BDD_IRAP.png, size=300, title=Pyros data model)}}

---

h2. Gestion des mails de management

* L'envoi de mail en local est réalisé grace à une adresse créer pour labinvent et donc le protocole d'envoi est défini dans app.php, lors de l'envoi d'un mail il faut utiliser le transport 'gmail' en local.
> Mail : labinvent2@gmail.com / Mot De Passe : cakephp3

* Pour changer de mail et de transport, il faut aller dans la section Email/Transport de app.php, remplacer l'adresse et son mot de passe, puis il faut définir un protocole d'envoi compatible avec l'adresse mail rentré précédemment.

h2. Tests (Mise en place et éxécution)

h3. Génération automatique des tests (avec bake)

* CakePHP permet aussi de gérer les tests facilement et de générer leurs squelettes avec la commande "bake".
--> Pour commencer il faut récupérer phpunit (https://phpunit.de/), si la version de PHP est inférieur à 5.6, il faut télécharger le phpunit.phar compatible avec PHP, sinon il faut prendre la derniere version (compatible avec PHP7 également).
--> Il faut configurer une base de donnée pour les tests dans "app.php"
<pre>
Commande génération test (se placer à la racine du projet ./labinvent) :

bin/cake bake test "type_src" "nom_table"

"type_src" correspond à Controller, Table, Entity, Form, Helper, Fixture...
</pre>

h3. Ajout manuel d'un test

h3. Exécution des tests

h3. Couverture de tests

Voici ce qui est testé actuellement:

bla bla bla...



h2. LDAP

* Pour le développement, j'utilise openLDAP pour avoir un LDAP et y connecter Labinvent2, pour gérer openLDAP, j'utilise l'outil de configuration phpLDAPadmin.
--> J'utilise une VM oû les outils d'openLDAP sont déja installés et configurés.
--> Il suffit de récupérer la machine virtuelle prête à l'emploi, et de lui attribuer manuellement une adresse IP libre (en général x.x.x.253/254) et son masque
--> Aller sur une autre machine (physique ou virtuelle), et taper l'adresse ip défini précédement dans un navigateur
--> Vous accéderez à une page de gestion (phpLdapAdmin)
--> ATTENTION -> Votre PC doit être branché en filaire pour que la machine virtuelle soit accessible
> https://www.turnkeylinux.org/openldap

h2. Gestion des ACL (droits des utilisateurs selon leur profil)

* CakePHP3 n'intègre plus un composant pour un gérer les ACLs, un plugin est à disposition pour remplacer ce composant, hélas il n'est pas stable, et le fait qu'il utilise la base de données ralenti les applications, car le composant effectue beaucoup de requêtes.

* De plus, il est conseillé pour des autorisations basiques d'utiliser la fonction isAuthorized($user) dans les controller.

* Dans labinvent2, on utilise la fonction isAuthorized($user), qui définit les choses que les utilisateurs connecté peuvent faire et donne tous les droits au Super-Admin dans AppContoller.php.
Puis, dans chaque controller la fonction est redéclarer, on définit les actions possible pour chaque rôle.

* Procédure ajout d'une fonctionnalité
- On ajoute la fonctionnalité dans le controller
- Si la fonctionnalité est accessible par tout le monde, il faut l'ajouter dans le isAuthorized($user) de l'AppController
- Sinon il faut ajouter la condition lié à l'action dans la fonction isAuthorized($user) du controller correspondant (1ère fonction de tous les controllers)
- Enfin lorsque vous réalisez la vue correspondante, il faut cacher les champs/boutons de votre fonctionnalité en fonction de vos droits, une variable "$role" est accessible dans toutes les vues, ainsi qu'une variable "$username" (nom de l'utilisateur, pas le login) pour tester la proriété d'un objet dans une vue.

* Si vous avez besoin de vérifier la propriété d'un objet pour un utilisateur, il faut utiliser la fonction "isOwnedBy" (déja défini dans materiels, suivis, emprunts)
<pre>
* Exemple de la fonction provenant du controller Materiels :

public function isOwnedBy($id, $nomUtilisateur)
{
return ($this->Materiels->exists(['id' => $id, 'nom_createur' => $nomUtilisateur]) || $this->Materiels->exists(['id' => $id, 'nom_responsable' => nomUtilisateur]));
}
</pre>

* *Exemple 1 :* Ajout de la fonctionnalité désarchivé avec un bouton sur la view d'un matériel (pour les adminplus+)
* On se place dans le controller Materiels, on y définit la fonction correspondante "setStatusArchived($id)".
* Dans la fonction "isAuthorized($user)" du même controller, rajouter les lignes suivante :
<pre>
if (in_array($action, ['setStatusArchived'])) {
if (in_array($role, ['Administration Plus', 'Super Administrateur'])) {
return true;
}
}
</pre>
* Puis on se place dans la view de materiels, et on affiche le bouton selon les mêmes conditions que l'action "setStatusArchived($id)" dans la fonction "isAuthorized($user)".

* *Exemple 2 :* Ajout d'une action "exportQrCode()" (pas très utile) pour tout le monde
* On se place dans la fonction "isAuthorized($user)" de l'AppController.
* Puis on ajoute l'action à la liste qui est autoriser à tout le monde
<pre>
//Pour tout le monde
if (in_array($action, ['index', 'find', 'view', 'creer', 'add', 'exportQrCode'])) return true;
</pre>

h2. Autres remarques

* Mode debug personnalisé :
> Faire $this->myDebug($var) dans un controlleur pour afficher le contenu de la variable si mode debug personnalisé actif, à condition que le mode debug soit activé.

> Voir : http://book.cakephp.org/3.0/fr/development/testing.html

* Pour charger une librairie (ex : phpqrcode, ...)
> Voir : http://book.cakephp.org/3.0/fr/core-libraries/app.html#charger-les-fichiers-de-vendor

* Pour créer les fichiers pdf d'entrée et de sortie, on utilise fpdf 1.8.1, on pourrait utiliser le plugin développé pour CakePHP3.
> Voir : https://github.com/FriendsOfCake/CakePdf

* Pour le JavaScript, le JS Helper a été retiré
> Voir : http://book.cakephp.org/3.0/fr/appendices/3-0-migration-guide.html#jshelper