Documentation technique
Version 18 (Alexandre Cases, 06/22/2016 07:03 pm) → Version 19/22 (Alexandre Cases, 06/23/2016 02:18 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 qu'il faut créer pour labinvent et donc le protocole d'envoi est a définir dans app.php selon le serveur choisi, lors de l'envoi d'un mail il faut utiliser le transport 'dev' en local.
* L'application étant paramétré pour utiliser gmail, il est préférable de le garder et de créer une adresse gmail.
Puis il faut activer l'option "utiliser des applications moins sécurisé" à l'adresse suivante : https://www.google.com/settings/security/lesssecureapps
Enfin il faut remplir le champ "username" avec l'adresse créer et le champ "password" avec son mot de passe associé (voir exemple gmail plus bas).
* Pour changer de mail et de transport, il faut aller dans la section Email/Transport de app.php, et adapter le bloc suivant sous le 'default' (exemple avec 'gmail')
<pre>
'EmailTransport' => [
...
'dev' => [
'className' => 'Smtp',
'host' => 'ssl://smtp.gmail.com',
'port' => 465,
'username' => 'xxxxxxxxxxxxxxxxxxxxx',
'password' => 'xxxxxxxxxxxxxxxxxxxxx',
'context' => [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]
],
],
</pre>
* Adresse créer pour tester à l'IRAP :
Mail : labinvent2@gmail.com / Mot De Passe : cakephp3
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
* Pour installer un composant avec le composer :
<pre>
A la racine :
./composer.phar require --dev phpunit/phpunit
</pre>
* Pour supprimer un composant avec le composer :
<pre>
A la racine :
./composer.phar remove phpunit/phpunit
</pre>
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 qu'il faut créer pour labinvent et donc le protocole d'envoi est a définir dans app.php selon le serveur choisi, lors de l'envoi d'un mail il faut utiliser le transport 'dev' en local.
* L'application étant paramétré pour utiliser gmail, il est préférable de le garder et de créer une adresse gmail.
Puis il faut activer l'option "utiliser des applications moins sécurisé" à l'adresse suivante : https://www.google.com/settings/security/lesssecureapps
Enfin il faut remplir le champ "username" avec l'adresse créer et le champ "password" avec son mot de passe associé (voir exemple gmail plus bas).
* Pour changer de mail et de transport, il faut aller dans la section Email/Transport de app.php, et adapter le bloc suivant sous le 'default' (exemple avec 'gmail')
<pre>
'EmailTransport' => [
...
'dev' => [
'className' => 'Smtp',
'host' => 'ssl://smtp.gmail.com',
'port' => 465,
'username' => 'xxxxxxxxxxxxxxxxxxxxx',
'password' => 'xxxxxxxxxxxxxxxxxxxxx',
'context' => [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]
],
],
</pre>
* Adresse créer pour tester à l'IRAP :
Mail : labinvent2@gmail.com / Mot De Passe : cakephp3
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
* Pour installer un composant avec le composer :
<pre>
A la racine :
./composer.phar require --dev phpunit/phpunit
</pre>
* Pour supprimer un composant avec le composer :
<pre>
A la racine :
./composer.phar remove phpunit/phpunit
</pre>