Developpement

Version 463 (Etienne Pallier, 12/11/2017 03:47 pm)

1 150 Etienne Pallier
h1. Labinvent 2 (cakephp3) - Développement
2 1 Etienne Pallier
3 148 Etienne Pallier
Cette page décrit le processus de développement du logiciel, ainsi que les outils utilisés.
4 148 Etienne Pallier
5 148 Etienne Pallier
[ [[Labinvent_nouvelle_version|Retour au sommmaire]] ]
6 148 Etienne Pallier
7 1 Etienne Pallier
8 1 Etienne Pallier
{{toc}}
9 1 Etienne Pallier
10 1 Etienne Pallier
---
11 1 Etienne Pallier
12 4 Etienne Pallier
h2. LIENS UTILES
13 94 Etienne Pallier
14 254 Etienne Pallier
* *DEMANDES (TODO LIST) : https://projects.irap.omp.eu/projects/inventirap/issues?query_id=222*
15 250 Etienne Pallier
16 251 Etienne Pallier
* *ROADMAP (VERSIONS) : https://projects.irap.omp.eu/projects/inventirap/roadmap?utf8=%E2%9C%93&tracker_ids%5B%5D=1&tracker_ids%5B%5D=2&tracker_ids%5B%5D=4&tracker_ids%5B%5D=5&tracker_ids%5B%5D=6&tracker_ids%5B%5D=7&tracker_ids%5B%5D=8&tracker_ids%5B%5D=9&with_subprojects=0&with_subprojects=1#version_2.5.x*
17 250 Etienne Pallier
18 252 Etienne Pallier
* Version numbering : http://semver.org
19 252 Etienne Pallier
20 97 Etienne Pallier
* HOWTO Format Redmine Wiki : http://www.redmine.org/projects/redmine/wiki/FrRedmineWikiFormatting
21 94 Etienne Pallier
22 96 Etienne Pallier
* [[Installation|Page wiki pour l'installation]]
23 1 Etienne Pallier
24 93 Etienne Pallier
* Version majeure en cours (2.1): https://projects.irap.omp.eu/versions/101
25 93 Etienne Pallier
26 92 Etienne Pallier
* Liste complète des évolutions: https://gitlab.irap.omp.eu/epallier/labinvent/commits/master
27 1 Etienne Pallier
28 92 Etienne Pallier
* Browse files (gitlab): https://gitlab.irap.omp.eu/epallier/labinvent/tree/master
29 1 Etienne Pallier
30 92 Etienne Pallier
* Inventirap 1.3 (prod): https://inventirap.irap.omp.eu
31 1 Etienne Pallier
32 92 Etienne Pallier
* Inventirap 1.3 (test): https://inventirap-test.irap.omp.eu/
33 92 Etienne Pallier
34 309 Etienne Pallier
* *CakePhp*:
35 1 Etienne Pallier
36 92 Etienne Pallier
 * ROADMAP: https://github.com/cakephp/cakephp/wiki
37 380 Etienne Pallier
 * *Migrations* plugin: http://book.cakephp.org/3.0/fr/migrations.html
38 310 Etienne Pallier
 * *CONVENTIONS*: https://book.cakephp.org/3.0/fr/intro/conventions.html
39 382 Etienne Pallier
 * Déploiement : https://book.cakephp.org/3.0/fr/deployment.html
40 93 Etienne Pallier
 * Forum cakephp: http://discourse.cakephp.org
41 381 Etienne Pallier
 * Debug Kit : https://book.cakephp.org/3.0/fr/debug-kit.html
42 93 Etienne Pallier
 * Quickstart tutorial: http://book.cakephp.org/3.0/en/quickstart.html
43 1 Etienne Pallier
 * Bookmarker tutorial: https://github.com/cakephp/bookmarker-tutorial
44 93 Etienne Pallier
 * Cakephp CRUD: https://github.com/FriendsOfCake/crud
45 380 Etienne Pallier
 * Plugin Chronos pour gérer les dates plus facilement : https://book.cakephp.org/3.0/fr/chronos.html
46 1 Etienne Pallier
47 1 Etienne Pallier
---
48 1 Etienne Pallier
49 363 Etienne Pallier
h2. CONVENTIONS CAKEPHP
50 1 Etienne Pallier
51 363 Etienne Pallier
https://book.cakephp.org/3.0/fr/intro/conventions.html
52 1 Etienne Pallier
53 363 Etienne Pallier
54 374 Etienne Pallier
* *+SYNTHÈSE GÉNÉRALE+*
55 1 Etienne Pallier
56 374 Etienne Pallier
En utilisant les conventions CakePHP dans le nommage des différentes parties de votre application, vous gagnerez des fonctionnalités sans les tracas et les affres de la configuration. Voici un exemple récapitulant les conventions abordées :
57 374 Etienne Pallier
58 374 Etienne Pallier
<pre>
59 374 Etienne Pallier
    Nom de la table de la base de données: “articles”
60 374 Etienne Pallier
    Classe Table: ArticlesTable se trouvant dans src/Model/Table/ArticlesTable.php
61 374 Etienne Pallier
    Classe Entity: Article se trouvant dans src/Model/Entity/Article.php
62 374 Etienne Pallier
    Classe Controller: ArticlesController se trouvant dans src/Controller/ArticlesController.php
63 374 Etienne Pallier
    Template de View se trouvant dans src/Template/Articles/index.ctp
64 374 Etienne Pallier
</pre>
65 374 Etienne Pallier
66 374 Etienne Pallier
En utilisant ces conventions, CakePHP sait qu’une requête de type http://exemple.com/articles/ sera liée à un appel à la fonction index() du Controller ArticlesController, dans lequel le model Articles est automatiquement disponible (et automatiquement lié à la table ‘articles’ dans la base) et rendue dans un fichier. Aucune de ces relations n’a été configurée par rien d’autre que la création des classes et des fichiers dont vous aviez besoin de toute façon.
67 374 Etienne Pallier
68 374 Etienne Pallier
69 373 Etienne Pallier
* *+Controleurs+*
70 365 Etienne Pallier
71 365 Etienne Pallier
noms des classes de controller sont au pluriel, en CamelCase et se terminent par Controller. UsersController et ArticleCategoriesController sont des exemples respectant cette convention
72 365 Etienne Pallier
73 365 Etienne Pallier
les méthodes publiques des controllers sont souvent exposées comme des ‘actions’ accessibles via un navigateur web. Par exemple /users/view correspond à la méthode view() de UsersController sans rien modifier. Les méthodes privées ou protégées ne sont pas accessibles avec le routing
74 365 Etienne Pallier
75 365 Etienne Pallier
UsersController (qui serait défini dans le nom de fichier UsersController.php) est accessible à l’adresse http://exemple.com/users.
76 365 Etienne Pallier
77 365 Etienne Pallier
/article-categories/view-all est la bonne forme pour accéder à l’action ArticleCategoriesController::viewAll()
78 365 Etienne Pallier
79 365 Etienne Pallier
Quand vous créez des liens en utilisant this->Html->link(), vous pouvez utiliser les conventions suivantes pour le tableau d’url:
80 365 Etienne Pallier
81 366 Etienne Pallier
<pre>
82 365 Etienne Pallier
$this->Html->link('link-title', [
83 365 Etienne Pallier
    'prefix' => 'MyPrefix' // CamelCased
84 365 Etienne Pallier
    'plugin' => 'MyPlugin', // CamelCased
85 365 Etienne Pallier
    'controller' => 'ControllerName', // CamelCased
86 365 Etienne Pallier
    'action' => 'actionName' // camelBacked
87 365 Etienne Pallier
]
88 366 Etienne Pallier
</pre>
89 363 Etienne Pallier
90 363 Etienne Pallier
91 373 Etienne Pallier
* *+Fichiers et noms de Classe+*
92 368 Etienne Pallier
93 368 Etienne Pallier
En général, les noms de fichiers correspondent aux noms des classes et suivent les standards PSR-0 et PSR-4 pour l’autoloading (chargement automatique). 
94 368 Etienne Pallier
Voici quelques exemples de noms de classes et de fichiers:
95 368 Etienne Pallier
96 372 Etienne Pallier
<pre>
97 368 Etienne Pallier
    La classe controller LatestArticlesController devra se trouver dans un fichier nommé LatestArticlesController.php.
98 368 Etienne Pallier
    La classe Component (Composant) MyHandyComponent devra se trouver dans un fichier nommé MyHandyComponent.php.
99 368 Etienne Pallier
    La classe Table OptionValuesTable devra se trouver dans un fichier nommé OptionValuesTable.php.
100 368 Etienne Pallier
    La classe Entity OptionValue devra se trouver dans un fichier nommé OptionValue.php.
101 368 Etienne Pallier
    La classe Behavior (Comportement) EspeciallyFunkableBehavior devra se trouver dans un fichier nommé EspeciallyFunkableBehavior.php.
102 368 Etienne Pallier
    La classe View (Vue) SuperSimpleView devra se trouver dans un fichier nommé SuperSimpleView.ctp.
103 368 Etienne Pallier
    La classe Helper (Assistant) BestEverHelper devra se trouver dans un fichier nommé BestEverHelper.php.
104 372 Etienne Pallier
</pre>
105 368 Etienne Pallier
106 368 Etienne Pallier
Chaque fichier sera situé dans le répertoire/namespace approprié dans le dossier de votre application.
107 368 Etienne Pallier
108 368 Etienne Pallier
109 375 Etienne Pallier
* *+Modèles et Bases de Données+*
110 368 Etienne Pallier
111 368 Etienne Pallier
Les noms de classe de *model* sont au *pluriel, en CamelCase et finissent par Table*. *UsersTable, ArticleCategoriesTable et UserFavoritePagesTable* en sont des exemples.
112 368 Etienne Pallier
113 368 Etienne Pallier
Les noms de *tables* correspondant aux models CakePHP sont au *pluriel et utilisent le caractère souligné* (underscore). Les tables correspondantes aux models mentionnés ci-dessus seront donc respectivement : *users, article_categories et user_favorite_pages*.
114 368 Etienne Pallier
115 370 Etienne Pallier
La convention est d’utiliser des *mots anglais pour les noms de colonne et de table*. Si vous utilisez des mots dans une autre langue, CakePHP ne va pas pouvoir convertir correctement les bonnes inflections (du singulier vers le pluriel et vice-versa). Dans certains cas, *si vous souhaitez ajouter vos propres règles pour des mots d’une autre langue, vous pouvez utiliser la classe utilitaire Cake\Utility\Inflector*.
116 368 Etienne Pallier
117 371 Etienne Pallier
Les *noms des champs avec deux mots ou plus* doivent être avec des *underscores* comme ici : *first_name*.
118 373 Etienne Pallier
119 371 Etienne Pallier
Les *clés étrangères des relations hasMany, belongsTo ou hasOne* sont *reconnues par défaut grâce au nom (singulier) de la table associée, suivi de _id*. Donc, si *Users hasMany Articles, la table articles se référera à la table users via une clé étrangère user_id*. Pour une table avec un nom de plusieurs mots comme *article_categories, la clé étrangère sera article_category_id*.
120 371 Etienne Pallier
121 371 Etienne Pallier
Les *tables de jointure utilisées dans les relations BelongsToMany* entre models doivent être *nommées d’après le nom des tables qu’elles unissent, dans l’ordre alphabétique (articles_tags plutôt que tags_articles)*.
122 372 Etienne Pallier
123 371 Etienne Pallier
124 375 Etienne Pallier
* *+Vues+*
125 371 Etienne Pallier
126 371 Etienne Pallier
Les fichiers de *template de view* sont nommés d’après les fonctions du controller qu’elles affichent, sous une forme avec underscores. La fonction *viewAll() de la classe ArticlesController cherchera un gabarit de view dans src/Template/Articles/view_all.ctp*.
127 371 Etienne Pallier
128 372 Etienne Pallier
Le schéma classique est *src/Template/Controller/nom_de_fonction_avec_underscore.ctp*.
129 371 Etienne Pallier
130 371 Etienne Pallier
131 363 Etienne Pallier
132 189 Etienne Pallier
133 188 Etienne Pallier
---
134 187 Etienne Pallier
135 393 Etienne Pallier
h2. TODOLIST
136 393 Etienne Pallier
137 463 Etienne Pallier
*TODO DEC 2017 URGENT (vu avec Nicole Legal)* :
138 463 Etienne Pallier
139 463 Etienne Pallier
- les étiqueteuses ne marchent plus !!! (ex: Postes de Dorine et Marjorie à côté)
140 463 Etienne Pallier
141 463 Etienne Pallier
- export en CSV : colonne fournisseur VIDE !!!
142 463 Etienne Pallier
143 463 Etienne Pallier
- étiquettes d'inventaire : avant "IRAP", ajouter l'organisme (UPS ou CNRS). 
144 463 Etienne Pallier
145 463 Etienne Pallier
- s'arranger pour savoir qui a fait quoi (par exemple qui a archivé tel ou tel matériel)
146 463 Etienne Pallier
147 463 Etienne Pallier
148 463 Etienne Pallier
*TODO Aout 2017* :
149 463 Etienne Pallier
150 426 Etienne Pallier
151 462 Etienne Pallier
-  *Terminer l'implémentation de easyACL !!!*
152 461 Etienne Pallier
153 455 Etienne Pallier
- (EP DONE 09/17) -Bugfix (mail reçu le 8/9/17) : message mail insuffisant, il manque l'id du matériel :
154 448 Etienne Pallier
Dorine Roma a modifié le matériel "MACBOOK PRO".
155 448 Etienne Pallier
Veuillez vérifier et compléter si besoin la fiche corespondante.
156 448 Etienne Pallier
Vous recevez ce message car vous avez demandé à le recevoir. Pour faire retirer votre mail de la liste, veuillez contacter un SuperAdmin.
157 455 Etienne Pallier
=> AJOUTER DES TESTS SUR LES RETOUR EMAIL !!!-
158 448 Etienne Pallier
159 457 Etienne Pallier
- bugfix inconsistance de nommage des champs de table :
160 457 Etienne Pallier
on a groupes_thematique_id dans la table materiels
161 457 Etienne Pallier
et groupe_thematique_id (sans 's') dans la table users => à corriger (y-compris dans le code)
162 457 Etienne Pallier
163 460 Etienne Pallier
- *Bugfix et amélioration MAILS* : vérifier que les mails sont bien envoyés à bon escient ; il faut pour cela écrire des TESTS (aucun pour l'instant sur les emails !!!) en utilisant les MOCK objects (pour remplacer la fonction sendmail afin qu'au lieu d'envoyer réellement un mail, elle se contente d'afficher les infos envoyées, ça sera plus simple et plus rapide à tester) :
164 456 Etienne Pallier
Tester que les ACLs (voir doc ACLs) sont respectés, par exemple :
165 456 Etienne Pallier
Si qq modifie (ou valide, ou supprime...) MON materiel, JE dois recevoir une email qui m'en informe, ET aussi le superadmin, ET aussi la liste labinvent@irap.omp.eu, ET aussi les gens qui sont dans la "liste spécifique" (mais sans doublon)... (et pour "emprunts" et "suivis" ???)
166 456 Etienne Pallier
167 443 Etienne Pallier
- Bugfix : il semble que le profil "Responsable" ne peut pas editer un matériel qui lui appartient pourtant (créé en son nom), c'est un comble !!!
168 443 Etienne Pallier
(vérifier aussi pour les autres profils, cette possibilité doit être accordée à TOUS les profils)
169 443 Etienne Pallier
170 444 Etienne Pallier
- Bugfix : les "responsables de domaines" ont-ils une raison d'être pour l'IRAP ? (à supprimer de autres listes)
171 444 Etienne Pallier
172 444 Etienne Pallier
- Bugfix : les "unites" ont-elles une raison d'être pour l'IRAP ? (à supprimer de autres listes)
173 444 Etienne Pallier
174 454 Etienne Pallier
- (EP DONE 09/17) -*Mettre en place les Tests paramétrés* pour éviter redondance avec les différents profils- (cf https://jtreminio.com/2013/03/unit-testing-tutorial-part-2-assertions-writing-a-useful-test-and-dataprovider/ et https://dzone.com/articles/practical-php-testing/practical-php-testing-patterns-46)
175 445 Etienne Pallier
176 454 Etienne Pallier
- *Mettre en place le mocking d'objets* et méthodes pour simplifier les choses difficiles : https://jtreminio.com/2013/03/unit-testing-tutorial-part-4-mock-objects-stub-methods-dependency-injection/ et https://jtreminio.com/2013/03/unit-testing-tutorial-part-5-mock-methods-and-overriding-constructors/
177 447 Etienne Pallier
178 439 Etienne Pallier
- Remplacer les TODO: (non reconnus dans task list de Eclipse) par @todo
179 439 Etienne Pallier
180 435 Etienne Pallier
- Ajouter le commentaire //BETTER: devant les lignes qui sont un progrès d'écriture (meilleure pratique) par rapport à ce qu'on faisait avant
181 435 Etienne Pallier
182 442 Etienne Pallier
- Lire la doc sur Authentication et surtout Authorization pour voir si on peut pas mieux faire
183 442 Etienne Pallier
https://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html
184 442 Etienne Pallier
(puis lire les 2 articles à suivre tout à la fin)
185 442 Etienne Pallier
186 427 Etienne Pallier
- Finir de regrouper et numéroter les tests selon le doc ACL (regroupement par controleur, puis par ACTION, puis tester chaque action avec tous les ROLES)
187 427 Etienne Pallier
188 426 Etienne Pallier
- Merger les vues add et edit car elles se ressemblent énormément et ça évitera des redondances inutiles :
189 426 Etienne Pallier
http://phpmysqltalk.com/1851-cakephp-merge-add-and-edit-actions-into-a-single-html-form.html
190 426 Etienne Pallier
http://blog.grzegorzpawlik.com/2010/03/how-to-merge-edit-and-add-methods-in-cakephp/
191 426 Etienne Pallier
192 426 Etienne Pallier
193 393 Etienne Pallier
194 393 Etienne Pallier
NOUVEAUX BUGS (au 30/6/17) :
195 393 Etienne Pallier
196 407 Etienne Pallier
Bugfixes:
197 398 Etienne Pallier
- BD test_labinvent pas créée automatiquement avec install.sh ? (j'ai dû la créer à la main !!)
198 1 Etienne Pallier
199 407 Etienne Pallier
Actions:
200 416 Etienne Pallier
- install/update_plugins.sh => ameliorer en ajoutant tous les chmod necessaires pour les dossier phpqrcode et autres... (recup de install/installation.sh)
201 414 Etienne Pallier
- install from scratch ou update ??? tout ca n'est pas très clair et ne marche pas bien !
202 415 Etienne Pallier
- install/installation.sh : remplacer setfacl pour mac os
203 412 Etienne Pallier
- ref de cakephp sur github : https://github.com/cakephp/cakephp
204 412 Etienne Pallier
- ref de app sur github : https://github.com/cakephp/app
205 411 Etienne Pallier
- remettre en place les CSS de base de cakephp (https://github.com/cakephp/app/tree/master/webroot/css) dans default.php : base.css, cake.css, et home.css
206 409 Etienne Pallier
- ajouter cette liste à la roadmap
207 407 Etienne Pallier
- git push dev-LATMOS + git pull + corriger erreurs + merge, etc.
208 1 Etienne Pallier
- remplacer XAMPP par une installation propre avec macport de chaque composant : httpd (apache), mysql (mariadb), et 2 versions de php (5.6 et 7.x), ou alors installer la version XAMPP-VM pour mac
209 1 Etienne Pallier
- faire une version docker pour éviter d'avoir à gérer différents OS : Mac (avec XAMPP), CentOS, Ubuntu, Fedora, etc.
210 408 Etienne Pallier
- lire page cakephp TESTING pour mieux faire les tests (https://book.cakephp.org/3.0/en/development/testing.html)
211 408 Etienne Pallier
- refaire les tests en suivant la nouvelle logique décrite sur cette page
212 413 Etienne Pallier
- improve plugins : à la suite de l'installation des plugins, j'ai les messages suivants :
213 413 Etienne Pallier
<pre>
214 413 Etienne Pallier
cakephp/cakephp suggests installing lib-ICU (The intl PHP library, to use Text::transliterate() or Text::slug())
215 413 Etienne Pallier
symfony/console suggests installing symfony/event-dispatcher ()
216 413 Etienne Pallier
cakephp/debug_kit suggests installing ext-sqlite (DebugKit needs to store panel data in a database. SQLite is simple and easy to use.)
217 413 Etienne Pallier
symfony/var-dumper suggests installing ext-symfony_debug ()
218 413 Etienne Pallier
psy/psysh suggests installing ext-readline (Enables support for arrow-key history navigation, and showing and manipulating command history.)
219 413 Etienne Pallier
psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.)
220 413 Etienne Pallier
psy/psysh suggests installing hoa/console (A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit.)
221 413 Etienne Pallier
sebastian/global-state suggests installing ext-uopz (*)
222 413 Etienne Pallier
phpunit/php-code-coverage suggests installing ext-xdebug (^2.5.3)
223 413 Etienne Pallier
phpunit/phpunit suggests installing phpunit/php-invoker (^1.1)
224 413 Etienne Pallier
phpunit/phpunit suggests installing ext-xdebug (*)
225 413 Etienne Pallier
</pre>
226 407 Etienne Pallier
227 407 Etienne Pallier
Ajouts:
228 407 Etienne Pallier
- orange si proche de fin de garantie
229 407 Etienne Pallier
- boolean "empruntable" pour materiel qu'on peut emprunter => permet recherche des matériels empruntables et voir disponibilité + rouge quand matériel déjà emprunté (et donc non dispo)
230 393 Etienne Pallier
- matos/add : date enlever un chiffre à année => plante sur DateTime
231 393 Etienne Pallier
- matos/view : éviter d'afficher "€" quand pas de prix
232 393 Etienne Pallier
- matos/add : il faut pouvoir changer le proprio (resp+)
233 393 Etienne Pallier
- delete suivi : ramener sur le materiel et non pas sur la liste des suivis
234 409 Etienne Pallier
- héritage templates : ok + cancel pour tous les forms (recup vue materiels/add.ctp ligne 50)
235 405 Etienne Pallier
- ameliorer pagination : 
236 405 Etienne Pallier
237 410 Etienne Pallier
 * ameliorer la css inventirap.css
238 410 Etienne Pallier
 * remettre en place la css cake.css (elle devrait être là par défaut, et ensuite, on construit par dessus, ça évitera des soucis à l'avenir, par ex, cakephp3.4 a changé la présentation de la pagination par défaut, et ça ne marchait plus sur inventirap...)
239 405 Etienne Pallier
 * http://www.sanisoft.com/blog/2014/07/28/change-markup-for-pagination-cakephp3/
240 405 Etienne Pallier
 * https://book.cakephp.org/3.0/en/views/helpers/paginator.html
241 405 Etienne Pallier
 * https://book.cakephp.org/3.0/en/controllers/components/pagination.html#using-the-paginator-directly
242 405 Etienne Pallier
243 393 Etienne Pallier
- bug find 
244 393 Etienne Pallier
	technique ET administratif = technique seulement
245 393 Etienne Pallier
	administratif seulement = administratif
246 393 Etienne Pallier
247 394 Etienne Pallier
- materiels/find : chercher labo : on en trouve seulement 100 alors qu'il y en a plus
248 393 Etienne Pallier
- expliquer soucis avec cake.css : comment a-t-elle été désactivée ?
249 185 Etienne Pallier
250 364 Etienne Pallier
*La liste des demandes à jour se trouve ici* : https://projects.irap.omp.eu/projects/inventirap/issues?query_id=222_
251 364 Etienne Pallier
252 185 Etienne Pallier
*_NB: Cette liste est OBSOLÈTE (ici à titre indicatif, pour se souvenir des retours de réunion)_*
253 185 Etienne Pallier
254 185 Etienne Pallier
*Demandes des utilisateurs (transmises par D. Rambaud le 19/12/16) :*
255 204 Etienne Pallier
256 204 Etienne Pallier
* Ca serait bien que le proprio de la fiche reçoive un email quand l'étiquette est imprimée, ou encore quand la fiche est validée => dans le but qu'il vérifie et complète cette fiche
257 204 Etienne Pallier
* Ca serait bien aussi que le proprio puisse modifier sa fiche, une fois créée, mais aussi même après qu'elle ait été validée. Attention, la modification post-validation ne peut porter que sur les renseignements techniques complémentaires.
258 204 Etienne Pallier
259 204 Etienne Pallier
260 204 Etienne Pallier
*Suite à réunion du 27/10/16 avec le LATMOS, constat des modifs nécessaires:*
261 204 Etienne Pallier
262 185 Etienne Pallier
* L'étiqueteuse semble ne plus fonctionner alors qu'elle fonctionnait avant...
263 185 Etienne Pallier
* Ajouter un champ "Titre du mail" dans la liste des emails envoyés, pour qu'on puisse configurer le titre du mail envoyé (ex: [LABINVENT])
264 185 Etienne Pallier
* Check Date achat <= Date Livraison !!!
265 185 Etienne Pallier
* Ajouter un statut : ajouter un statut « désinventorié «  ou «amorti ? » (à réfléchir)
266 185 Etienne Pallier
* Ajouter colonne statut « hors service » dans la vue "liste des matériels"
267 192 Etienne Pallier
* N° série : à remettre dans la section informations (pour que tout le monde le voie)
268 1 Etienne Pallier
* Empêcher duplication d'une fiche matériel si même numéro de série
269 121 Alexandre Cases
* Importation depuis Excel
270 120 Alexandre Cases
* Le champ "Local de stockage" a-t-il disparu ??? => à remettre
271 120 Alexandre Cases
* Site : champ optionnel
272 120 Alexandre Cases
* Champs optionnels: de manière générale, il faudrait pouvoir configurer quelques champs comme optionnels (certains champs doivent bien sûr absolument rester obligatoires)
273 120 Alexandre Cases
* (temporairement, on peut se contenter de CACHER certains champs, comme par exemple le champ "Site")
274 120 Alexandre Cases
* Suivis par fournisseur: ajouter la colonne "fournisseur" dans Suivi pour pouvoir trier la vue par fournisseur
275 1 Etienne Pallier
* Suivis relance : trouver un moyen de relancer automatiquement les suivis périodiques (ou bien avec une date programmée)
276 120 Alexandre Cases
* Emprunt dates: afficher les dates d'emprunt et de retour (date emprunt doit être obligatoire)
277 120 Alexandre Cases
* Matériel gestionnaire: obliger la personne qui crée une fiche matériel à choisir un gestionnaire (via une liste) (et avertir automatiquement ce gestionnaire par mail)
278 192 Etienne Pallier
* supprimer profil AdminPlus, inutile
279 120 Alexandre Cases
280 120 Alexandre Cases
281 120 Alexandre Cases
282 120 Alexandre Cases
*Suite à l'installation à l'IRAP du 21/01/2016*:
283 120 Alexandre Cases
284 120 Alexandre Cases
- Si elle existe, supprimer table "fichiers"
285 120 Alexandre Cases
- Sauvegarder les utilisateurs
286 120 Alexandre Cases
- Transformer table "utilisateurs" en "users"
287 120 Alexandre Cases
- Ajout table "configuration"
288 120 Alexandre Cases
- Ajout clé étrangère emprunts (site_id)/suivis (type_suivi_id)
289 120 Alexandre Cases
- Transformation des données correspondantes
290 120 Alexandre Cases
- Suppression ancien champ emprunt (e_lieu_stockage), suivis (type_intervention)
291 1 Etienne Pallier
292 1 Etienne Pallier
293 101 Etienne Pallier
*Suite à l'installation à l'IAS du 09/03/2015*
294 9 Etienne Pallier
295 9 Etienne Pallier
- Ajout table "organismes", "type_suivis", "sites"
296 180 Etienne Pallier
- Ajout clé correspondante dans table "matériels"
297 9 Etienne Pallier
- Transformation des données correspondantes
298 174 Etienne Pallier
- Suppression anciens champs
299 174 Etienne Pallier
- Ajout table "documents"
300 174 Etienne Pallier
- Sauvegarder les utilisateurs
301 174 Etienne Pallier
- Transformer table "utilisateurs" en "users"
302 174 Etienne Pallier
- Ajout table "configuration"
303 174 Etienne Pallier
- Ajout clé étrangère emprunts (site_id)/suivis (type_suivi_id)
304 209 Thibaud Ajas
- Transformation des données correspondantes
305 210 Thibaud Ajas
- Suppression ancien champ emprunt (e_lieu_stockage), suivis (type_intervention)
306 1 Etienne Pallier
---
307 210 Thibaud Ajas
308 418 Etienne Pallier
h2. A propose de Composer
309 418 Etienne Pallier
310 418 Etienne Pallier
https://getcomposer.org/doc/01-basic-usage.md#installing-without-composer-lock
311 418 Etienne Pallier
312 420 Etienne Pallier
*Installation des dépendances* :
313 419 Etienne Pallier
Si composer.lock est absent, il sera créé avec les toutes dernières versions disponibles des plugins.
314 419 Etienne Pallier
S'il est déjà présent, composer installera exactement les versions précisées dans ce fichier.
315 419 Etienne Pallier
On est ainsi sûr d'avoir tous les mêmes versions de plugins.
316 419 Etienne Pallier
C'est pourquoi composer.lock doit être inclus dans le dépot git.
317 419 Etienne Pallier
<pre>
318 419 Etienne Pallier
php composer.phar install
319 419 Etienne Pallier
</pre>
320 419 Etienne Pallier
321 419 Etienne Pallier
322 420 Etienne Pallier
*Mise à jour des dépendances* :
323 419 Etienne Pallier
Ne tient pas compte de composer.lock, composer essaie donc de récupérer les dernières versions disponibles des plugins...
324 419 Etienne Pallier
<pre>
325 419 Etienne Pallier
php composer.phar update
326 419 Etienne Pallier
</pre>
327 418 Etienne Pallier
328 386 Etienne Pallier
h2. Modèle de données (Data model)
329 1 Etienne Pallier
330 356 Etienne Pallier
331 386 Etienne Pallier
h3. Schéma de la base de données (v2.6)
332 1 Etienne Pallier
333 386 Etienne Pallier
{{thumbnail(BDD_schema.png, size=2000, title=Labinvent data model 2.6)}}
334 356 Etienne Pallier
335 389 Etienne Pallier
h3. Schéma de la base de données (v2.0)
336 388 Etienne Pallier
337 388 Etienne Pallier
338 388 Etienne Pallier
{{thumbnail(BDD_IRAP.png, size=2000, title=Labinvent data model 2.0)}}
339 388 Etienne Pallier
340 388 Etienne Pallier
341 388 Etienne Pallier
342 388 Etienne Pallier
343 388 Etienne Pallier
344 388 Etienne Pallier
345 388 Etienne Pallier
---
346 388 Etienne Pallier
347 174 Etienne Pallier
h2. Cycle de vie du Matériel
348 174 Etienne Pallier
349 174 Etienne Pallier
350 9 Etienne Pallier
---
351 9 Etienne Pallier
352 181 Etienne Pallier
h3. Diagramme d'états-transitions
353 181 Etienne Pallier
354 184 Etienne Pallier
{{thumbnail(equipment_status_state_diagram.png, size=2000, title=Cycle de vie du matériel)}}
355 183 Etienne Pallier
356 183 Etienne Pallier
357 181 Etienne Pallier
---
358 181 Etienne Pallier
359 181 Etienne Pallier
h3. Diagramme de séquences
360 12 Etienne Pallier
361 12 Etienne Pallier
{{thumbnail(equipment_interactions_sequence_diagram.png, size=1500, title=Cycle de vie du matériel)}}
362 76 Etienne Pallier
363 15 Etienne Pallier
364 1 Etienne Pallier
365 12 Etienne Pallier
---
366 17 Etienne Pallier
367 17 Etienne Pallier
h2. ACL - Gestion des droits selon le profil
368 66 Etienne Pallier
369 278 Etienne Pallier
Document Google doc (à jour) : https://docs.google.com/document/d/1-OhEeoi96j6ueUl5NQCQ9ZsTfbJTFw3ZVaWU2iYly_o/edit?usp=sharing 
370 277 Etienne Pallier
371 279 Etienne Pallier
Ancien document (n'est plus à jour et est incomplet) : {{thumbnail(ACLs Droits selon les Roles.pdf, size=1500, title=Cycle de vie du matériel)}}
372 84 Etienne Pallier
373 392 Etienne Pallier
---
374 392 Etienne Pallier
375 395 Etienne Pallier
---
376 395 Etienne Pallier
377 395 Etienne Pallier
h2. Deux environnements de dev pour avoir php5.6 et php7.X
378 395 Etienne Pallier
379 395 Etienne Pallier
Avec XAMPP : https://magazine.joomla.org/issues/issue-mar-2014/item/1797-practical-development-2-working-environment
380 395 Etienne Pallier
381 395 Etienne Pallier
382 395 Etienne Pallier
---
383 395 Etienne Pallier
384 392 Etienne Pallier
h2. Utilisation du serveur web de dev de CakePHP (à la place de apache)
385 392 Etienne Pallier
386 392 Etienne Pallier
/!\ Votre serveur MySQL doit être lancé !!!
387 392 Etienne Pallier
388 392 Etienne Pallier
* Se placer à la racine du projet.
389 392 Etienne Pallier
390 392 Etienne Pallier
* Lancer la commande suivante :
391 392 Etienne Pallier
392 392 Etienne Pallier
 <pre> bin/cake server </pre>
393 392 Etienne Pallier
394 392 Etienne Pallier
* Rendez-vous sur http://localhost:8765/
395 86 Etienne Pallier
396 84 Etienne Pallier
397 86 Etienne Pallier
---
398 154 Alexandre Cases
399 154 Alexandre Cases
h2. ROADMAP - Plan de développement
400 107 Alexandre Cases
401 274 Etienne Pallier
*Stage de Thibault :* il se déroule du 10 avril au 30 juin 2017, soit sur 12 semaines (S1 à S12)
402 154 Alexandre Cases
_*(Ne pas oublier de rédiger le rapport de stage au fur et à mesure)*_
403 154 Alexandre Cases
404 138 Etienne Pallier
405 154 Alexandre Cases
Voir le détail de la roadmap: https://projects.irap.omp.eu/projects/inventirap/roadmap
406 1 Etienne Pallier
407 275 Etienne Pallier
* S01-SO2 : "version 2.5.x - Amélioraiton installation, pagination":https://projects.irap.omp.eu/versions/160
408 275 Etienne Pallier
* S03-SO5 : "version 2.6.x - Emails, Etiquettes, bugfix...":https://projects.irap.omp.eu/versions/161
409 275 Etienne Pallier
* S06-SO7 : "version 2.7.x - Synchronization avec LATMOS, ACLs ok partout":https://projects.irap.omp.eu/versions/162
410 275 Etienne Pallier
* S08-S10 : "version 2.8.x - ACLs configurables via BDD, ...":https://projects.irap.omp.eu/versions/163
411 275 Etienne Pallier
* S11-S12 : "version 2.9.x - upgrade Cakephp3, passage à Php7":https://projects.irap.omp.eu/versions/164
412 271 Etienne Pallier
413 271 Etienne Pallier
414 276 Etienne Pallier
*Stage de Alexandre Cases (avril à juin 2016) :*
415 271 Etienne Pallier
416 271 Etienne Pallier
417 160 Alexandre Cases
|                    |   |_.Prévu |_.Réalisé |
418 90 Etienne Pallier
|/2=.S01 (11/4-15/4) |.1|/5=<."version 2.00 - Cakephp3 + Php5 (version de base from bake)":https://projects.irap.omp.eu/versions/105|/6=<.version 2.00|
419 161 Etienne Pallier
                     |.2|
420 90 Etienne Pallier
|/2=.S02 (18/4-22/4) |.1|
421 161 Etienne Pallier
                     |.2|
422 90 Etienne Pallier
|/2=.S03 (25/4-29/4) |.1|
423 154 Alexandre Cases
                     |.2|/4=<."version 2.01 - Implémentation complète du CRUD":https://projects.irap.omp.eu/versions/101|
424 154 Alexandre Cases
|/2=.S04 (02/5-06/5) |.1|/4=<.version 2.01|
425 154 Alexandre Cases
                     |.2|
426 154 Alexandre Cases
|/2=.S05 (09/5-13/5) |.1|
427 99 Etienne Pallier
                     |.2|/3=<."version 2.02 - Implémentation de toutes les autres actions":https://projects.irap.omp.eu/versions/106|
428 1 Etienne Pallier
|/2=.S06 (16/5-20/5) |.1|/2=<.version 2.02|
429 1 Etienne Pallier
                     |.2|
430 151 Etienne Pallier
|/2=.S07 (23/5-27/5) |.1|/2=<."version 2.03 - Implémentation du LDAP (vrai et fake)":https://projects.irap.omp.eu/versions/108|/2=<.version 2.03|
431 102 Etienne Pallier
                     |.2|
432 100 Etienne Pallier
|/2=.S08 (30/5-03/6) |.1|/2=<."version 2.04 - Implémentation des ACL (droits)":https://projects.irap.omp.eu/versions/107|_/10=<.version 2.04 (en cours)|
433 98 Etienne Pallier
                     |.2|
434 100 Etienne Pallier
|/2=.S09 (06/6-10/6) |.1|/2=<."version 2.05 - Documents attaches aux materiels (+ photos)":https://projects.irap.omp.eu/versions/99|
435 98 Etienne Pallier
                     |.2|
436 100 Etienne Pallier
|_/2=.S10 (13/6-17/6) |.1|/2=<."version 2.06 - Evolutions prévues dans 1.3 et 1.4":https://projects.irap.omp.eu/versions/110|
437 98 Etienne Pallier
                     |.2|
438 98 Etienne Pallier
|/2=.S11 (20/6-24/6) |.1|/1=<."version 2.07 - Corrections/Evolutions demandées par l'IAS":https://projects.irap.omp.eu/versions/124|
439 98 Etienne Pallier
                     |.2|/2=<."version 2.08 - Cakephp3 + Php7 (compatible Php5)":https://projects.irap.omp.eu/versions/98|
440 98 Etienne Pallier
|/2=.S12 (27/6-30/6) |.1|
441 98 Etienne Pallier
                     |.2|/1=<."version 2.10 - Autres ajouts (+ fin rédaction rapport de stage)":https://projects.irap.omp.eu/versions/100|
442 98 Etienne Pallier
443 98 Etienne Pallier
---
444 98 Etienne Pallier
445 281 Etienne Pallier
h2. COMMIT : Procédure à suivre à chaque commit
446 98 Etienne Pallier
447 268 Etienne Pallier
NB: _cette procédure est détaillée davantage dans la section HOWTO de cette page (partie "CYCLE DE DEVELOPPEMENT A SUIVRE")_
448 267 Etienne Pallier
449 98 Etienne Pallier
Voici les différentes étapes à respecter au moment de chaque commit:
450 1 Etienne Pallier
451 283 Etienne Pallier
*1) S'assurer que tous les tests passent toujours !*
452 1 Etienne Pallier
453 286 Etienne Pallier
Cela permet de se prémunir contre toute régression (ce qui fonctionnait avant doit continuer de fonctionner)
454 285 Etienne Pallier
455 301 Etienne Pallier
*2) Optionnel : Incrementer la version et la date du projet*
456 282 Etienne Pallier
457 280 Etienne Pallier
A la fin du fichier src/Template/Layout/default.ctp
458 1 Etienne Pallier
459 265 Etienne Pallier
*3) Mettre à jour le fichier README-LABINVENT (ceci est un exemple, un template)*
460 265 Etienne Pallier
461 151 Etienne Pallier
Date: 11/05/2016
462 1 Etienne Pallier
Version: 2.1.9
463 151 Etienne Pallier
Mise à jour doc install
464 151 Etienne Pallier
(Attention, changement structure BDD)
465 260 Etienne Pallier
Demande(s) réalisée(s) : https://projects.irap.omp.eu/issues/3542
466 151 Etienne Pallier
Version majeure en cours (2.1): https://projects.irap.omp.eu/versions/101
467 151 Etienne Pallier
468 100 Etienne Pallier
Remarques:
469 100 Etienne Pallier
=> Version: 2.1.9 = 9ème commit sur la version 2.1
470 100 Etienne Pallier
=> préciser "(bugfix)" si c'est le cas
471 1 Etienne Pallier
=> ajouter "(Attention, changement structure BDD)" s'il y a eu une modif de la BDD
472 100 Etienne Pallier
=> "Demande (terminée)" ou "Demande (en cours)", ou pas de demande du tout (exceptionnellement)
473 151 Etienne Pallier
=> ces infos permettront de savoir quelle version (et date) exacte du projet on a actuellement sur son disque
474 1 Etienne Pallier
475 1 Etienne Pallier
476 303 Etienne Pallier
*4) S'il y a eu un changement de structure de la BD*
477 98 Etienne Pallier
478 1 Etienne Pallier
* Copier la requête sql de modif dans un script db-update-AAAA-MM-JJ.sh du dossier database/update/
479 291 Etienne Pallier
* Mettre à jour le script sql complet de création de la BD database/labinvent_2.1_12-05-16.sql (et les autres scripts sql associés si besoin, insert_users...)
480 291 Etienne Pallier
* Mettre à jour le schéma (image png) de la BD (avec Mysql Workbench) dans le projet et sur le wiki (page "Documentation technique")
481 1 Etienne Pallier
* Avertir dans le README (Attention, changement de structure de la BDD, il faut exécuter le script de mise à jour database/update/xxx ...)
482 151 Etienne Pallier
483 1 Etienne Pallier
484 303 Etienne Pallier
*5) Si c'est la fin d'une version majeure (2.0, 2.1, 2.2, ...)*
485 1 Etienne Pallier
486 304 Etienne Pallier
487 304 Etienne Pallier
* On doit normalement avoir écrit quelques nouveaux tests pour cette version, n'est-ce pas ??? (sinon, c'est po bien) !!!
488 98 Etienne Pallier
* Ajouter cette version en tête de la section "MAIN CHANGES (MILESTONES)" dans le fichier README
489 1 Etienne Pallier
* Mettre à jour la doc install/INSTALLATION à partir du wiki (si nécessaire)
490 261 Etienne Pallier
* (On peut aussi tester une installation du logiciel from scratch)
491 98 Etienne Pallier
492 151 Etienne Pallier
493 284 Etienne Pallier
*6) PULL*
494 100 Etienne Pallier
495 100 Etienne Pallier
(au cas où quelqu'un d'autre aurait fait un push)
496 98 Etienne Pallier
497 104 Etienne Pallier
498 284 Etienne Pallier
*7) COMMIT*
499 104 Etienne Pallier
500 7 Etienne Pallier
Dans le message de commit, faire un simple copier/coller des infos du fichier README (sauf date):
501 1 Etienne Pallier
502 1 Etienne Pallier
Version: 2.1.9
503 1 Etienne Pallier
Mise à jour doc install (bugfix)
504 302 Etienne Pallier
(Attention, changement structure BDD)
505 1 Etienne Pallier
Demande (terminée): https://projects.irap.omp.eu/issues/3542
506 1 Etienne Pallier
Version majeure en cours (2.1): https://projects.irap.omp.eu/versions/101
507 1 Etienne Pallier
508 304 Etienne Pallier
*5) Si c'est la fin d'une version majeure (2.0, 2.1, 2.2, ...)*
509 1 Etienne Pallier
510 304 Etienne Pallier
* On doit normalement avoir écrit quelques nouveaux tests pour cette version, n'est-ce pas ??? (sinon, c'est po bien) !!!
511 304 Etienne Pallier
* Ajouter cette version en tête de la section "MAIN CHANGES (MILESTONES)" dans le fichier README
512 304 Etienne Pallier
* Mettre à jour la doc install/INSTALLATION à partir du wiki (si nécessaire)
513 304 Etienne Pallier
* (On peut aussi tester une installation du logiciel from scratch)
514 304 Etienne Pallier
* Voir aussi étape 9
515 304 Etienne Pallier
516 304 Etienne Pallier
517 302 Etienne Pallier
*8) Optionnel : PUSH*
518 1 Etienne Pallier
519 1 Etienne Pallier
(seulement si le commit est important/urgent, ou suite à un ensemble de commits sur un même thème)
520 304 Etienne Pallier
521 304 Etienne Pallier
522 304 Etienne Pallier
*9) Si c'est la fin d'une version majeure (2.0, 2.1, 2.2, ...), TAGUER la version*
523 304 Etienne Pallier
524 304 Etienne Pallier
Exemple:
525 304 Etienne Pallier
<pre>
526 304 Etienne Pallier
git tag 2.8 1b2e1d63ff
527 304 Etienne Pallier
</pre>
528 304 Etienne Pallier
529 304 Etienne Pallier
The 1b2e1d63ff stands for the first 10 characters of the commit id you want to reference with your tag. 
530 304 Etienne Pallier
You can get the commit id by looking at the log :
531 304 Etienne Pallier
532 304 Etienne Pallier
<pre>
533 304 Etienne Pallier
git log
534 304 Etienne Pallier
</pre>
535 304 Etienne Pallier
536 304 Etienne Pallier
537 304 Etienne Pallier
538 1 Etienne Pallier
539 1 Etienne Pallier
540 1 Etienne Pallier
---
541 203 Thibaud Ajas
542 288 Etienne Pallier
h2. Procédure à suivre pour MERGER le code entre 2 labos
543 288 Etienne Pallier
544 290 Etienne Pallier
*0) Etat initial :*
545 288 Etienne Pallier
- dev-LATMOS : état ok (tests passés & push fait)
546 288 Etienne Pallier
- dev-IRAP : état ok (tests passés & push fait)
547 288 Etienne Pallier
548 290 Etienne Pallier
*A faire à l'IRAP :*
549 288 Etienne Pallier
550 290 Etienne Pallier
*1) Merger dev-IRAP => dev*
551 289 Etienne Pallier
git checkout dev-IRAP
552 289 Etienne Pallier
(dev-IRAP) Incrémenter date + version + commit/push
553 288 Etienne Pallier
git checkout dev
554 313 Etienne Pallier
*git merge --no-ff dev-IRAP*
555 289 Etienne Pallier
Tests ok
556 305 Etienne Pallier
git push [origin dev]
557 288 Etienne Pallier
558 290 Etienne Pallier
*2) Merger dev-LATMOS => dev*
559 289 Etienne Pallier
git checkout dev-LATMOS
560 289 Etienne Pallier
(dev-LATMOS) Tests ok
561 289 Etienne Pallier
git checkout dev
562 313 Etienne Pallier
*git merge --no-ff dev-LATMOS*
563 307 Etienne Pallier
Si besoin, résoudre les conflits + add/commit/push
564 289 Etienne Pallier
Si besoin, exécuter le(s) script(s) db-update.sh
565 308 Etienne Pallier
si besoin, adapter le(s) script(s) db-update.sh
566 1 Etienne Pallier
Tests ok
567 311 Etienne Pallier
Faire un seul script db-update fusionnant toutes les modifs IRAP
568 308 Etienne Pallier
Update le script de création général de la BD (en fonction du contenu de db-update.sh) + add/commit/push
569 307 Etienne Pallier
Incrémenter date + version + add/commit/push
570 288 Etienne Pallier
571 312 Etienne Pallier
*3) Merger dev => dev-IRAP et dev-LATMOS*
572 312 Etienne Pallier
git checkout dev-IRAP
573 313 Etienne Pallier
*git merge --no-ff dev*
574 312 Etienne Pallier
Tests ok
575 312 Etienne Pallier
git push
576 1 Etienne Pallier
577 312 Etienne Pallier
git checkout dev-LATMOS
578 313 Etienne Pallier
*git merge --no-ff dev*
579 312 Etienne Pallier
Tests ok
580 306 Etienne Pallier
git push
581 289 Etienne Pallier
582 312 Etienne Pallier
Si besoin : Prévenir LATMOS que db-update à faire (venant de dev-IRAP) ?
583 288 Etienne Pallier
584 1 Etienne Pallier
h2. Installation from scratch (Sous UBuntu)
585 1 Etienne Pallier
586 1 Etienne Pallier
h3. Création projet avec Composer
587 1 Etienne Pallier
588 1 Etienne Pallier
* Télécharger composer.phar : 
589 1 Etienne Pallier
"curl -s https://getcomposer.org/installer | php"
590 1 Etienne Pallier
591 1 Etienne Pallier
* Avec le Composer créer un nouveau projet : 
592 1 Etienne Pallier
"php composer.phar create-project --prefer-dist cakephp/app labinvent_2.0"
593 1 Etienne Pallier
594 1 Etienne Pallier
> Voir structure projet : http://book.cakephp.org/3.0/fr/intro/cakephp-folder-structure.html
595 22 Alexandre Cases
596 22 Alexandre Cases
* On rempli la base de données avec le fichier sql
597 1 Etienne Pallier
598 1 Etienne Pallier
* On indique la BD utiliser à CakePHP dans le fichier config/app.php, propriété "Datasources".
599 1 Etienne Pallier
600 22 Alexandre Cases
* On se place à la racine du projet
601 22 Alexandre Cases
602 22 Alexandre Cases
* On génère le code Scaffold : 
603 1 Etienne Pallier
"bin/cake bake all nom_table" --> ça génére les modeles, les vues, et les controlleurs.
604 153 Etienne Pallier
605 1 Etienne Pallier
> Commande (en une fois) :
606 21 Alexandre Cases
> > bin/cake bake all categories && bin/cake bake all emprunts && bin/cake bake all groupes_metiers && bin/cake bake all groupes_thematiques && bin/cake bake all organismes && bin/cake bake all sites && bin/cake bake all sous_categories && bin/cake bake all suivis && bin/cake bake all sur_categories && bin/cake bake all type_suivis && bin/cake bake all documents && bin/cake bake all users && bin/cake bake all materiels
607 1 Etienne Pallier
608 1 Etienne Pallier
h3. Modification de la base de données 
609 1 Etienne Pallier
> Une version du sql corrigée au fur et à mesure est disponible dans le git :
610 1 Etienne Pallier
611 131 Alexandre Cases
> > Dans database/, le fichier labinvent_2.1_09-05-16 correspond à la création de la base.
612 1 Etienne Pallier
> > Dans database/, le fichier labinvent_2.0_insert-irap_19-04-16 correspond aux insertions propre à l'IRAP, fichier insertion uniquement pour les dévellopeurs.
613 1 Etienne Pallier
614 1 Etienne Pallier
* Création table "config"
615 21 Alexandre Cases
616 1 Etienne Pallier
> > Mise à jour dans le fichier de création de base
617 21 Alexandre Cases
> > Mise à jour à part : db-update-2016-05-09.sql
618 21 Alexandre Cases
619 21 Alexandre Cases
h3. Autres remarques lors du développement
620 21 Alexandre Cases
621 21 Alexandre Cases
* Suivre les conventions de CakePHP est le top pour ne pas avoir à refaire de la config (bidouiller), il faudrait vérifier réguliérement que c'est le cas (outil "cakephp-codesniffer")...
622 21 Alexandre Cases
> Voir : http://book.cakephp.org/3.0/fr/contributing/cakephp-coding-conventions.html
623 21 Alexandre Cases
624 21 Alexandre Cases
* La solution pour insérer un utilisateur directement dans la base et pouvoir se connecter avec dans l'application est de l'insérer avec un mot de passe haché de la méme façon.
625 20 Alexandre Cases
Le mot de passe "login" = "$2y$10$LZzpws3oDidBcqO/Fy1RTedLLk3ENTmplny5J7bZ6R1PqFoGOw3Ma".
626 24 Alexandre Cases
Le mot de passe vide "" = "$2y$10$nBQMNstgN.sgad1ZANznY.pbJI.ZG/.Q5qX4gC8SXCFQnDIZC8rcW".
627 25 Alexandre Cases
628 91 Alexandre Cases
* Vérifier que la migration vers la prochaine version de cakephp3 (3.3 ?) sera facile... (décrire la procédure à suivre)
629 130 Alexandre Cases
--> Une migration vers une version mineur 3.2 => 3.3, se réalise avec la mise à jour de CakePHP à l'aide de Composer
630 91 Alexandre Cases
--> Puis il faut regarder les changements dans la page migration correspondant à la version voulu et adapter les changements au code.
631 91 Alexandre Cases
> Voir : http://book.cakephp.org/3.0/fr/appendices/3-2-migration-guide.html
632 31 Alexandre Cases
633 106 Alexandre Cases
* Outil (plugin) "DebugKit" de CakePHP3 : 
634 106 Alexandre Cases
--> DebugKit est un plugin qui fournit une toolbar pour aider à debugger les applications CakePHP plus facilement.
635 106 Alexandre Cases
--> Par défaut il est installé avec le squelette de l'application, pour l'activer, il faut se placer à la racine.
636 1 Etienne Pallier
--> Puis il faut éxécuter la ligne suivante : bin/cake plugin load DebugKit .
637 129 Alexandre Cases
--> La commande va aller modifier le fichier config bootstrap.php.
638 122 Alexandre Cases
--> Le fichier bootstrap.php actuel de l'application sur le git, est configuré pour charger le plugin lorsque l'application est en mode debug de CakePHP, je ne pense pas que exécuter la commande précédente soit utile vu la configuration de ce fichier dans notre application.
639 129 Alexandre Cases
--> Le plugin nécessite l'extension php5-sqlite par défaut (il supporte l'équivalent avec de la config).
640 128 Alexandre Cases
> Voir : http://book.cakephp.org/3.0/fr/debug-kit.html
641 128 Alexandre Cases
642 157 Alexandre Cases
643 157 Alexandre Cases
* Mode debug personnaliser : 
644 157 Alexandre Cases
> 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é.
645 125 Alexandre Cases
646 125 Alexandre Cases
> Voir : http://book.cakephp.org/3.0/fr/development/testing.html
647 156 Etienne Pallier
648 156 Etienne Pallier
* Pour charger une librairie (ex : phpqrcode, ...)
649 156 Etienne Pallier
> Voir : http://book.cakephp.org/3.0/fr/core-libraries/app.html#charger-les-fichiers-de-vendor
650 156 Etienne Pallier
651 156 Etienne Pallier
* Pour créer les fichiers pdf d'entrée et de sortie, on utilise fpdf 1.8.1, on pourrait utiliser le plugin développer pour CakePHP3.
652 156 Etienne Pallier
> Voir : https://github.com/FriendsOfCake/CakePdf
653 156 Etienne Pallier
654 156 Etienne Pallier
* Pour le JavaScript, le JS Helper a été retiré 
655 156 Etienne Pallier
> Voir : http://book.cakephp.org/3.0/fr/appendices/3-0-migration-guide.html#jshelper
656 156 Etienne Pallier
657 156 Etienne Pallier
* Pour pouvoir éxécuter les tests depuis eclipse : 
658 156 Etienne Pallier
> Voir : http://blog.loftdigital.com/running-phpunit-tests-in-eclipse-pdt
659 156 Etienne Pallier
660 156 Etienne Pallier
* Avant de déployer l'application sur le serveur de production, optimiser les performances
661 156 Etienne Pallier
> Voir : http://book.cakephp.org/3.0/fr/deployment.html#ameliorer-les-performances-de-votre-application
662 156 Etienne Pallier
663 156 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}Installation sur Mac (retour des pb)%
664 156 Etienne Pallier
665 156 Etienne Pallier
1) install.sh
666 156 Etienne Pallier
=> 
667 156 Etienne Pallier
chmod: Unable to change file mode on ./webroot/img//gqbee0pkerrl8h2rbekaa3t8j1.png: Operation not permitted
668 156 Etienne Pallier
chmod: Unable to change file mode on ./tmp//cache/models/myapp_cake_model_default_configurations: Operation not permitted
669 156 Etienne Pallier
chmod: Unable to change file mode on ./tmp//cache/models/myapp_cake_model_default_documents: Operation not permitted
670 156 Etienne Pallier
chmod: Unable to change file mode on ./tmp//cache/persistent/myapp_cake_core_translations_cake_fr__f_r: Operation not permitted
671 156 Etienne Pallier
chmod: Unable to change file mode on ./tmp//cache/persistent/myapp_cake_core_translations_debug_kit_fr__f_r: Operation not permitted
672 156 Etienne Pallier
chmod: Unable to change file mode on ./tmp//cache/persistent/myapp_cake_core_translations_default_fr__f_r: Operation not permitted
673 156 Etienne Pallier
674 156 Etienne Pallier
675 156 Etienne Pallier
=> sudo chmod -R 777 ../webroot/img
676 163 Alexandre Cases
=> sudo chmod -R 777 ../tmp/
677 156 Etienne Pallier
(=> sudo chmod -R 777 ../vendor)
678 163 Alexandre Cases
679 156 Etienne Pallier
680 165 Etienne Pallier
2) connexion au site
681 1 Etienne Pallier
=> mauvais affichage pourri
682 164 Alexandre Cases
=> il faut configurer la BD dans app.php
683 164 Alexandre Cases
            'username' => 'labinvent2user',
684 164 Alexandre Cases
            'password' => 'labinvent2user',
685 164 Alexandre Cases
            'database' => 'labinvent2',
686 164 Alexandre Cases
687 164 Alexandre Cases
3) login
688 164 Alexandre Cases
=> epallier/login
689 164 Alexandre Cases
690 164 Alexandre Cases
691 164 Alexandre Cases
---
692 172 Alexandre Cases
693 172 Alexandre Cases
h2. Pour mettre à jour CakePHP
694 156 Etienne Pallier
695 156 Etienne Pallier
* Utiliser le composer : "php composer.phar update" à la racine de l'application
696 156 Etienne Pallier
> Voir : http://book.cakephp.org/3.0/fr/installation.html#rester-a-jour-avec-les-derniers-changements-de-cakephp
697 222 Thibaud Ajas
698 1 Etienne Pallier
* Puis il faut modifier le fichier : ./vendor/cakephp/cakephp/src/View/Helper/PaginatorHelper.php
699 222 Thibaud Ajas
  Ce fichier contient le template de l'helper "paginator" et il faut modifier le tableau "$_defaultConfig" et remplacer les balise "li" par des balises "span".
700 222 Thibaud Ajas
  Enfin dans le même tableau, il faut remplacer la ligne suivante : 
701 222 Thibaud Ajas
> 'current' => '<span class="active"><a href="">{{text}}</a></span>',
702 222 Thibaud Ajas
703 222 Thibaud Ajas
           Par : 
704 222 Thibaud Ajas
705 222 Thibaud Ajas
> 'current' => '<span class="current">{{text}}</span>',
706 222 Thibaud Ajas
707 222 Thibaud Ajas
* Puis il faut vider le cache de l'application (et du navigateur) pour que debug_kit fonctionne.
708 222 Thibaud Ajas
709 222 Thibaud Ajas
710 222 Thibaud Ajas
---
711 222 Thibaud Ajas
712 385 Thibaud Ajas
h2. Pour utiliser php5.6 ET php7.0 sur le même OS (Fonctionne avec Ubuntu 14.04.5 - le 02/05/2017)
713 222 Thibaud Ajas
714 385 Thibaud Ajas
*Installation de php 5.6 et de php 7.0 :*
715 222 Thibaud Ajas
716 222 Thibaud Ajas
<pre>
717 222 Thibaud Ajas
sudo add-apt-repository ppa:ondrej/php
718 222 Thibaud Ajas
sudo apt-get update
719 385 Thibaud Ajas
sudo apt-get install php7.0 php5.6 php5.6-mysql php-gettext php5.6-mbstring php-mbstring php7.0-mbstring php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0
720 222 Thibaud Ajas
</pre>
721 222 Thibaud Ajas
722 221 Thibaud Ajas
*Comment changer de version :*
723 221 Thibaud Ajas
724 385 Thibaud Ajas
_*Depuis php5.6 vers php7.0 :*_
725 167 Alexandre Cases
726 167 Alexandre Cases
<pre>
727 385 Thibaud Ajas
sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart
728 385 Thibaud Ajas
sudo update-alternatives --set php /usr/bin/php7.0
729 169 Alexandre Cases
</pre>
730 169 Alexandre Cases
731 385 Thibaud Ajas
_*Depuis php7.0 vers php5.6 :*_
732 169 Alexandre Cases
733 169 Alexandre Cases
<pre>
734 385 Thibaud Ajas
sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart
735 1 Etienne Pallier
sudo update-alternatives --set php /usr/bin/php5.6
736 173 Alexandre Cases
</pre>
737 173 Alexandre Cases
738 173 Alexandre Cases
---
739 173 Alexandre Cases
740 1 Etienne Pallier
h2. Rappel d'intervention par mail
741 170 Alexandre Cases
742 170 Alexandre Cases
* Il faut définir un attribut *"rappel" de type "int"* dans la table suivis.
743 170 Alexandre Cases
Cet attribut peut avoir *4 valeurs* : 
744 167 Alexandre Cases
<pre>
745 167 Alexandre Cases
0 ==> Pas d'envoi de rappel programmé
746 167 Alexandre Cases
1 ==> Rappel programmé 1 mois avant
747 201 Thibaud Ajas
2 ==> Rappel programmé 15 jours avant
748 1 Etienne Pallier
3 ==> Rappel programmé 2 jours avant
749 211 Thibaud Ajas
</pre>
750 1 Etienne Pallier
751 211 Thibaud Ajas
* Dans *l'AppController*, il faut définir une fonction "rappelIntervention()" qui :
752 211 Thibaud Ajas
- Parcourt tous les suivis et garde ceux qui ont une date inferieur à 1 mois de la date du jour et qui ont un attribut "rappel" à "0".
753 211 Thibaud Ajas
- Met cette attribut à 1
754 211 Thibaud Ajas
- 
755 211 Thibaud Ajas
756 211 Thibaud Ajas
...........................
757 211 Thibaud Ajas
758 211 Thibaud Ajas
* Dans *l'UsersController*, il faut executer la fonction précédente une fois que l'utilisateur est connecté (dans fonction login()).
759 211 Thibaud Ajas
760 211 Thibaud Ajas
---
761 211 Thibaud Ajas
762 263 Etienne Pallier
---
763 263 Etienne Pallier
764 328 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}AMELIORATIONS A VENIR (TODO)%
765 1 Etienne Pallier
766 336 Etienne Pallier
h3. *1) POUR LE CODE SOURCE*
767 1 Etienne Pallier
768 341 Etienne Pallier
Bien maîtriser les 4 étapes qui s'enchainent lors de l'appel d'une action :
769 1 Etienne Pallier
770 1 Etienne Pallier
771 343 Etienne Pallier
*a) Avant l'appel d'une action d'un controleur*
772 1 Etienne Pallier
773 331 Etienne Pallier
Ex: src/MaterielsController/isAuthorized()
774 331 Etienne Pallier
775 376 Etienne Pallier
(NB: Au plus haut niveau, c'est vendor/cakephp/src/Controller/Component/AuthComponent.php::isAuthorized())
776 376 Etienne Pallier
777 328 Etienne Pallier
Définir qui a droit à quoi dans src/<Model>Controller/isAuthorized(),
778 329 Etienne Pallier
action par action, et à l'intérieur d'une action, role par role
779 328 Etienne Pallier
780 330 Etienne Pallier
Respecter cette structure de code :
781 330 Etienne Pallier
<pre>
782 330 Etienne Pallier
switch ($action) {
783 329 Etienne Pallier
784 330 Etienne Pallier
   case 'action1':
785 330 Etienne Pallier
      switch ($role) :
786 330 Etienne Pallier
         case USER:
787 330 Etienne Pallier
         case RESP:
788 330 Etienne Pallier
         case ADMIN:
789 330 Etienne Pallier
         ...
790 330 Etienne Pallier
791 330 Etienne Pallier
   case 'action2':
792 330 Etienne Pallier
      switch ($role) :
793 330 Etienne Pallier
794 1 Etienne Pallier
   ...
795 1 Etienne Pallier
</pre>
796 1 Etienne Pallier
797 330 Etienne Pallier
798 343 Etienne Pallier
*b) Dans le traitement de l'action, avant la vue*
799 336 Etienne Pallier
800 331 Etienne Pallier
Ex: src/MaterielsController/add()
801 331 Etienne Pallier
802 1 Etienne Pallier
Définir TOUTES les données dont la vue aura besoin, dans src/<Model>Controller/<action()>
803 1 Etienne Pallier
La vue ne doit faire AUCUN traitement, elle doit se contenter d'afficher les données qu'on lui passe.
804 331 Etienne Pallier
805 333 Etienne Pallier
En particulier, selon le role (profil) actif, positionner ces tableaux (listes de champs pour dire à quels champs ce role à accès et dans quelles conditions (lecture seule, obligatoire, ...) :
806 1 Etienne Pallier
807 333 Etienne Pallier
 * $hiddenFields = [ fields list ]
808 333 Etienne Pallier
 * $readonlyFields = [ fields list ]
809 327 Etienne Pallier
 * $mandatoryFields = [ fields list ]
810 1 Etienne Pallier
 * $defaultValueForFields = [ field1 => value1, field2 => value2, ..., fieldN => valueN ]
811 1 Etienne Pallier
812 333 Etienne Pallier
Passer ensuite ces listes à la vue avec set()
813 1 Etienne Pallier
814 343 Etienne Pallier
*c) Dans la vue correspondant à l'action*
815 1 Etienne Pallier
816 331 Etienne Pallier
Ex: dans src/Template/Materiels/add.ctp
817 331 Etienne Pallier
818 328 Etienne Pallier
Dans src/Template/<Model>/<action.ctp>
819 1 Etienne Pallier
820 1 Etienne Pallier
Afficher les données passées par le controleur pour cette action
821 1 Etienne Pallier
822 1 Etienne Pallier
(faire le moins de traitements possibles, seulement de l'affichage)
823 1 Etienne Pallier
824 337 Etienne Pallier
En particulier, la vue affichera les champs (fields) un par un, en utilisant une fonction displayField() qui tiendra compte automatiquement des listes définies à l'étape précédente :
825 337 Etienne Pallier
$hiddenFields, $readonlyFields, $mandatoryFields, et $defaultValueForField
826 335 Etienne Pallier
827 340 Etienne Pallier
828 343 Etienne Pallier
*d) (TODO) 4ème étape à envisager : ce qui se passe APRES que l'action a été exécutée*
829 340 Etienne Pallier
830 341 Etienne Pallier
* La sauvegarde dans la BD (voir aussi beforeSave())
831 340 Etienne Pallier
* Quelle redirection vers quelle vue ?
832 340 Etienne Pallier
833 336 Etienne Pallier
h3. *2) POUR LES TESTS*
834 336 Etienne Pallier
835 379 Etienne Pallier
(https://book.cakephp.org/3.0/en/development/testing.html)
836 379 Etienne Pallier
837 338 Etienne Pallier
Les tests sont dans tests/TestCase/
838 338 Etienne Pallier
839 338 Etienne Pallier
Ils sont organisés par type :
840 338 Etienne Pallier
841 338 Etienne Pallier
* Controller/
842 338 Etienne Pallier
* Model/
843 338 Etienne Pallier
* View/
844 338 Etienne Pallier
845 339 Etienne Pallier
La plupart des tests sont dans Controller, mais il faudra aussi faire quelques tests de Model et de View...
846 338 Etienne Pallier
847 338 Etienne Pallier
Concernant les tests liés aux controleurs (dans Controller/), ils sont organisés par controleur :
848 338 Etienne Pallier
849 338 Etienne Pallier
* EmpruntsControllerTest.php
850 338 Etienne Pallier
* MaterielsControllerTest.php
851 338 Etienne Pallier
* PagesControllerTest.php
852 338 Etienne Pallier
* SuivisControllerTest.php
853 338 Etienne Pallier
* UsersControllerTest.php
854 338 Etienne Pallier
855 359 Etienne Pallier
(on prendra plutôt l'exemple des tests du controleur de Materiels, MaterielsControllerTest.php)
856 339 Etienne Pallier
857 359 Etienne Pallier
Il y a 2 manières de procéder :
858 1 Etienne Pallier
859 360 Etienne Pallier
*La manière intuitive, moins exhaustive, mais PLUS LISIBLE car plus naturelle, et de plus haut niveau sémantique :*
860 1 Etienne Pallier
861 359 Etienne Pallier
On organise les tests à la façon BDD (Behaviour Driven Dev) avec le GIVEN WHEN THEN :
862 359 Etienne Pallier
863 359 Etienne Pallier
"GIVEN a context, As a ADMIN, WHEN I do an ACTION, THEN I get this result"
864 359 Etienne Pallier
865 359 Etienne Pallier
Les tests sont organisés non pas par controleur, ni par action, mais par ROLE ("AS a ADMIN"), puis à l'intérieur de ce rôle, par ACTION
866 359 Etienne Pallier
867 359 Etienne Pallier
ex: 
868 359 Etienne Pallier
869 360 Etienne Pallier
test_as_Unauthenticated_i_can_goto_APROPOS_page_and_HOME_page_and_LOGIN()
870 1 Etienne Pallier
871 360 Etienne Pallier
test_as_Authenticated_i_can_LOGOUT_and_LOGIN_again()
872 360 Etienne Pallier
873 1 Etienne Pallier
test_as_USER_i_can_ADD_a_MATERIEL_then_DELETE_it()
874 1 Etienne Pallier
875 360 Etienne Pallier
test_as_USER_i_can_ADD_a_MATERIEL_then_EDIT_it()
876 1 Etienne Pallier
877 360 Etienne Pallier
test_as_USER_i_cannot_EDIT_a_MATERIEL_that_is_not_mine()
878 1 Etienne Pallier
879 360 Etienne Pallier
test_as_USER_i_can_EDIT_a_MATERIEL_that_is_mine_even_if_VALIDATED()
880 360 Etienne Pallier
881 360 Etienne Pallier
test_as_ADMIN_i_can_VALIDATE_a_MATERIEL_that_is_CREATED()
882 360 Etienne Pallier
883 361 Etienne Pallier
On peut aussi avoir des tests qui permettent de vérifier les Règles de Gestion :
884 361 Etienne Pallier
885 361 Etienne Pallier
test_MATERIEL_date_reception_superieure_ou_egale_a_date_commande
886 361 Etienne Pallier
887 361 Etienne Pallier
test_MATERIEL_ne_doit_pas_etre_ni_technique_ni_inventoriable
888 360 Etienne Pallier
889 360 Etienne Pallier
890 360 Etienne Pallier
891 360 Etienne Pallier
*La manière systématique, exhaustive, pour ne rien oublier, mais PEU LISIBLE (donc on préfèrera la manière précédente) :*
892 360 Etienne Pallier
893 359 Etienne Pallier
On organise les tests pour un controleur donné (ex: MaterielsController) +par ACTION+, et +pour chaque action tester les droits des différents ROLES+.
894 359 Etienne Pallier
895 359 Etienne Pallier
CHAQUE TEST devrait dans l'idéal comporter 3 ou 4 parties correspondant aux 4 étapes présentées au point "1) POUR LE CODE SOURCE" ci-dessus :
896 359 Etienne Pallier
897 345 Etienne Pallier
*a) Avant l'appel d'une action d'un controleur :* 
898 1 Etienne Pallier
899 346 Etienne Pallier
Tester qui a le droit de faire quoi
900 1 Etienne Pallier
901 345 Etienne Pallier
*b+c) Dans la vue correspondant à l'action :*
902 344 Etienne Pallier
903 346 Etienne Pallier
Tester que la vue a bien été générée comme il faut pour cette action, et que les listes $readonlyFields, $mandatoryFields, ... sont bien remplies comme il faut
904 1 Etienne Pallier
905 1 Etienne Pallier
*d) Après la réalisation de l'action :*
906 1 Etienne Pallier
907 346 Etienne Pallier
Tester que l'action attendue a bien été réalisée et qu'on est bien sur la vue de redirection prévue
908 346 Etienne Pallier
909 346 Etienne Pallier
Exemples :
910 346 Etienne Pallier
911 346 Etienne Pallier
912 346 Etienne Pallier
testUnauthenticatedUserCanLogin() : tester qu'un user non logué peut appeler l'action "login", et se trouve bien ensuite sur la page accueil
913 346 Etienne Pallier
914 346 Etienne Pallier
testUnauthenticatedUserCanViewAboutPage() : tester qu'un user non logué peut voir la page "about"
915 346 Etienne Pallier
916 346 Etienne Pallier
testUnauthenticatedUserCannotDoAnythingElse() : tester qu'un user non logué ne peut voir que les pages "accueil" et "about", et rien d'autre
917 346 Etienne Pallier
918 346 Etienne Pallier
testAuthenticatedUserCanLogout() : tester qu'un user logué peut se déloguer et atteint bien la page de login
919 346 Etienne Pallier
920 346 Etienne Pallier
921 348 Etienne Pallier
*Tests spécifiques pour le controleur Materiels (les tests doivent être organisés PAR ACTION) :*
922 348 Etienne Pallier
923 346 Etienne Pallier
testOnMaterielsActionViewCanBeDoneByAll() : tester que tout le monde peut voir un matériel
924 1 Etienne Pallier
925 348 Etienne Pallier
testOnMaterielsActionAddCanBeDoneByAll() : tester que tout le monde peut créer un matériel, sans toutefois voir les mêmes champs (et pas dans les mêmes conditions), et vérifier que l'ajout d'un matériel a bien été fait et qu'on arrive sur la vue détaillée du matériel (oui, tout ça doit être testé, les 4 étapes citées plus haut, et cela pour tous les profils)
926 1 Etienne Pallier
927 349 Etienne Pallier
testOnMaterielsActionEditCanBeDoneByXXXWithConditions() : tester que selon les profils, on ne peut pas éditer les mêmes matériels (USER doit être owner, RESP doit appartenir au même groupe thématique ou métier, ...)
928 349 Etienne Pallier
929 349 Etienne Pallier
Pour chaque test, on peut imaginer des SOUS-TESTS de ce type (on prend ici l'exemple du test précédent) :
930 1 Etienne Pallier
931 1 Etienne Pallier
* testOnMaterielsInViewEditXXXCanSeeOnlyTheseFields (fields list) : test des hidden fields
932 349 Etienne Pallier
* testOnMaterielsInViewEditXXXCannotChangeTheseFields (fields list) : test des readonly fields
933 359 Etienne Pallier
* testOnMaterielsInViewEditXXXMustFillTheseFields (fields list) : test des mandatory fields
934 359 Etienne Pallier
* testOnMaterielsInViewEditXXXTheseFieldsHaveDefaultValues (fields list with default values) : test des default value fields
935 349 Etienne Pallier
936 423 Etienne Pallier
---
937 423 Etienne Pallier
938 348 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}HOWTO (nouvelle version avec CakePhp3)%
939 1 Etienne Pallier
940 429 Etienne Pallier
h3. +1) AUTHentication (authentification = connexion avec login) : Chemin parcouru lors d'une connexion au site web+
941 378 Etienne Pallier
942 378 Etienne Pallier
(https://book.cakephp.org/3.0/en/controllers/components/authentication.html)
943 378 Etienne Pallier
944 438 Etienne Pallier
*ATTENTION*: voir aussi src/Model/Table/LdapConnectionsTable.php
945 438 Etienne Pallier
946 351 Etienne Pallier
Ce chemin est parcouru dans l'ordre :
947 351 Etienne Pallier
<pre>
948 351 Etienne Pallier
webroot/index.php 
949 355 Etienne Pallier
950 350 Etienne Pallier
config/bootstrap.php => lit config/app.php
951 355 Etienne Pallier
952 350 Etienne Pallier
src/Controller/PagesController/display()
953 355 Etienne Pallier
954 350 Etienne Pallier
src/Controller/UsersController/login() sans POST
955 355 Etienne Pallier
956 350 Etienne Pallier
src/Template/Users/login.ctp => formulaire de login => POST
957 355 Etienne Pallier
958 350 Etienne Pallier
src/Controller/UsersController/login() avec POST
959 1 Etienne Pallier
960 351 Etienne Pallier
   user = $this->LdapAuth->connection();
961 351 Etienne Pallier
962 351 Etienne Pallier
     src/Controller/Component/LdapAuthComponent/connection()
963 351 Etienne Pallier
    
964 352 Etienne Pallier
        $resp = TableRegistry::get('LdapConnections')->ldapAuthentication($login, $password);
965 352 Etienne Pallier
966 352 Etienne Pallier
        src/Model/Table/LdapConnectionsTable.php::ldapAuthentication()
967 352 Etienne Pallier
968 352 Etienne Pallier
		if ($this->USE_LDAP) {
969 352 Etienne Pallier
			$ldapConnection = ldap_connect($this->host, $this->port);
970 352 Etienne Pallier
       		        if (@ldap_bind($ldapConnection, $this->authenticationType . '=' . $login . ',' . $this->baseDn, $password)) {
971 352 Etienne Pallier
		            return $this->getUserAttributes($login)[0];
972 352 Etienne Pallier
		}
973 352 Etienne Pallier
		else {
974 352 Etienne Pallier
		        $user = $this->getFakeLdapUser($login);
975 352 Etienne Pallier
			if ($user != false && (new DefaultPasswordHasher)->check($password, $user['userpassword'][0]))
976 352 Etienne Pallier
			    return $user;
977 352 Etienne Pallier
                }
978 352 Etienne Pallier
                return FALSE
979 351 Etienne Pallier
			
980 351 Etienne Pallier
   if ($user != FALSE) {
981 351 Etienne Pallier
      $this->LdapAuth->setUser($user);
982 351 Etienne Pallier
      return $this->redirect($this->LdapAuth->redirectUrl());
983 327 Etienne Pallier
</pre>
984 350 Etienne Pallier
Pour info, si ça bogue (par exemple, à une époque on retournait "YOLO" au lieu de FALSE en cas d'échec de connection ldap), c'est *src/Template/Error/error400.ctp* qui prend le relais...
985 1 Etienne Pallier
986 429 Etienne Pallier
h3. *+2) AUTHorization (ACL, Autorisations, roles, profils des utilisateurs connectés)+*
987 1 Etienne Pallier
988 440 Etienne Pallier
C'est géré par la fonction isAuthorized()
989 440 Etienne Pallier
990 440 Etienne Pallier
a) beforeFilter() autorise les actions SANS connexion (pour les utilisateurs NON authentifiés)
991 440 Etienne Pallier
b) puis, isAuthorized() autorise les actions APRES connexion (pour les utilisateurs authentifiés)
992 440 Etienne Pallier
993 433 Etienne Pallier
 * Comment définir qui a droit de faire quelles actions (c'est à dire qui a le droit d'accéder à quelles vues) ?
994 431 Etienne Pallier
995 432 Etienne Pallier
=> a) Régles générales par défaut pour tous les controleurs : AppController.isAuthorized()
996 432 Etienne Pallier
src/Controller/AppController.php/isAuthorized()
997 1 Etienne Pallier
(héritage de Cake\Controller\Component\AuthComponent::isAuthorized(), c'est à dire vendor/cakephp/src/Controller/Component/AuthComponent.php::isAuthorized())
998 1 Etienne Pallier
999 1 Etienne Pallier
(cf https://book.cakephp.org/3.0/fr/controllers/components/authentication.html et https://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html)
1000 1 Etienne Pallier
1001 432 Etienne Pallier
=> b) Régles pour un controleur donné (ex: MaterielsController) : MaterielsController.isAuthorized()
1002 432 Etienne Pallier
src/Controller/MaterielsController.php/isAuthorized()
1003 431 Etienne Pallier
1004 433 Etienne Pallier
 * Une fois qu'on est dans une vue, comment définir qui a droit de voir quels éléments de la vue ?
1005 317 Etienne Pallier
=> src/Template/<Model>/nom_de_la_vue.ctp
1006 1 Etienne Pallier
ex : src/Template/Materiels/edit.ctp pour les règles concernant la vue "edit" des materiels
1007 1 Etienne Pallier
1008 430 Etienne Pallier
h3. *+3) Ajouter une nouvelle action sur un controleur+*
1009 1 Etienne Pallier
1010 1 Etienne Pallier
Ex: ajout de l'action statusCreated() dans le controleur Materiel
1011 1 Etienne Pallier
1012 1 Etienne Pallier
Il faut l'ajouter à 2 endroits dans MaterielsController.php :
1013 1 Etienne Pallier
1014 429 Etienne Pallier
a) ajouter une methode statusCreated() :
1015 1 Etienne Pallier
<pre>
1016 1 Etienne Pallier
public function statusCreated($id = null, $from = 'index') { ... }
1017 1 Etienne Pallier
</pre>
1018 1 Etienne Pallier
1019 1 Etienne Pallier
1020 429 Etienne Pallier
b) ajouter un cas 'statusCreated' dans la methode isAuthorized() qui doit retourner true pour autoriser cette action :
1021 429 Etienne Pallier
<pre>
1022 429 Etienne Pallier
case 'statusCreated': ... return true; ...
1023 429 Etienne Pallier
</pre>
1024 434 Etienne Pallier
La voici en détail :
1025 434 Etienne Pallier
<pre>
1026 436 Etienne Pallier
	case 'statusCreated': // de-validation d'un materiel (repasse à CREATED)
1027 436 Etienne Pallier
			    $id = (int) $this->request->getParam('pass.0');
1028 437 Etienne Pallier
			    // Admin + ok
1029 437 Etienne Pallier
			    if ($this->USER_IS_ADMIN_AT_LEAST()) return true;
1030 437 Etienne Pallier
			    // Resp ok if same group
1031 1 Etienne Pallier
			    if ($this->USER_IS_RESP() && $this->isRespGroup($id, $user[$ldapAuthType])) return true;
1032 437 Etienne Pallier
			    // User not ok
1033 429 Etienne Pallier
			    break;
1034 434 Etienne Pallier
</pre>
1035 430 Etienne Pallier
1036 429 Etienne Pallier
h3. *+4) Champ facultatif/obligatoire : Comment rendre facultatif ou obligatoire un champ, et définir les vérifications à faire sur ce champ ?+*
1037 428 Etienne Pallier
1038 428 Etienne Pallier
=> src/Model/Table/<Model>Table.php
1039 1 Etienne Pallier
ex : src/Model/Table/MaterielsTable.php pour définir les règles sur les champs de la table "materiels"
1040 424 Etienne Pallier
1041 425 Etienne Pallier
* Où définir les éléments passés à une vue (c'est à dire à une action) ?
1042 424 Etienne Pallier
=> src/Controller/<Model>Controller/nom_de_la_vue_ou_action()
1043 314 Etienne Pallier
ex : src/Controller/MaterielsController/edit() pour définir (avec set()) les éléments passés à la vue "edit" des materiels
1044 315 Etienne Pallier
1045 263 Etienne Pallier
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}HOWTO (ancienne version LabInvent 1.3 avec CakePhp2)%
1046 263 Etienne Pallier
1047 263 Etienne Pallier
*_Attention, ce howto est sans doute obsolète car il concerne l'ancienne version LabInvent 1.3 avec CakePhp2, mais il contient sûrement des conseils encore bien utiles_*
1048 264 Etienne Pallier
1049 264 Etienne Pallier
Ce document est un HOWTO, c'est à dire un guide pour savoir "comment faire quoi".
1050 263 Etienne Pallier
Il donne des solutions à différents types de besoins ou problèmes, et explique aussi "où trouver quoi".
1051 263 Etienne Pallier
1052 264 Etienne Pallier
1053 263 Etienne Pallier
* *VERSION DE CAKEPHP*
1054 263 Etienne Pallier
1055 263 Etienne Pallier
Version de cakephp ?
1056 263 Etienne Pallier
Configure::version(); // 2.1.3
1057 263 Etienne Pallier
Et aussi : fichier cakephp/lib/Cake/VERSION.txt
1058 263 Etienne Pallier
1059 264 Etienne Pallier
1060 263 Etienne Pallier
* *CYCLE DE DEVELOPPEMENT A SUIVRE (11 commandements)*
1061 263 Etienne Pallier
1062 263 Etienne Pallier
Je veux apporter un changement (correction ou evolution) au projet, comment dois-je faire ?
1063 263 Etienne Pallier
1064 263 Etienne Pallier
1) Incrementer la version du projet, a la fin du fichier cakephp/app/View/Layouts/default.ctp, et mettre à jour la date
1065 263 Etienne Pallier
1066 263 Etienne Pallier
2) Selectionner le changement a apporter (une demande) dans le Redmine du projet (https://projects.irap.omp.eu/projects/inventirap) :
1067 263 Etienne Pallier
- soit depuis la liste des demandes : onglet Demandes
1068 263 Etienne Pallier
- soit depuis la roadmap : onglet Roadmap, cocher la case "Anomalie", cliquer sur Appliquer, puis "version 1.3" (la version en cours depuis fin 2012)
1069 263 Etienne Pallier
Commencer de préférence par les "anomalies" parmi celles qui ont la plus haute priorité (et faire les "évolutions" dans un 2ème temps).
1070 263 Etienne Pallier
Choisir une demande et cliquer dessus pour aller sur sa fiche detaillee et voir le travail a faire.
1071 263 Etienne Pallier
Cliquer sur "mettre a jour", selectionner le statut "En cours", modifier eventuellement d'autres champs..., puis cliquer sur "Soumettre".
1072 263 Etienne Pallier
Noter l'URL de cette fiche (par exemple : https://projects.irap.omp.eu/issues/1050)
1073 263 Etienne Pallier
NB : Si la demande n'existe pas encore, la creer :
1074 263 Etienne Pallier
- cliquer sur l'onglet "Nouvelle demande"
1075 263 Etienne Pallier
- Selectionner "Anomalie" ou "Evolution"
1076 263 Etienne Pallier
- Positionner le statut a "En cours" si on veut travailler aussitot dessus (sinon, laisser a "Nouveau")
1077 263 Etienne Pallier
- Completer le reste de la fiche de demande (mettre "Assigne a" a "<<moi>>", choisir la version cible "version 1.3" ou "version 1.4", ...)
1078 263 Etienne Pallier
- cliquer sur le bouton "Creer"
1079 263 Etienne Pallier
1080 263 Etienne Pallier
3) Verifier que cette nouvelle demande apparait bien dans la roadmap (cliquer sur onglet "Roadmap", ..., puis version 1.3)
1081 263 Etienne Pallier
1082 263 Etienne Pallier
ÉTAPE OPTIONNELLE MAIS FORTEMENT CONSEILLÉE :
1083 263 Etienne Pallier
4) Ecrire un test qui vérifie que cette fonctionnalité ne marche pas encore (bug) ou bien n'est pas encore implémentée
1084 263 Etienne Pallier
On utilise ici l'approche TDD (Test Driven Development)
1085 263 Etienne Pallier
Ce test ne devrait pas passer (il est au rouge) ; il passera plus tard, quand on aura écrit le code nécessaire.
1086 263 Etienne Pallier
Bien sur, c'est dans la mesure du possible, car on ne peut pas TOUT tester.
1087 263 Etienne Pallier
Dans tous les cas, il faut ecrire un test qui s'approche le plus possible de la réalité à tester.
1088 263 Etienne Pallier
Voir pour cela la section "TESTS" (à la fin de ce document)
1089 263 Etienne Pallier
1090 263 Etienne Pallier
5) Faire les changements necessaires dans le code Php
1091 263 Etienne Pallier
Si ce changement implique aussi un changement dans la base de donnees,
1092 263 Etienne Pallier
copier le script SQL correspondant à ce changement dans un fichier database/update/db-update-YYYY-MM-DD.sql
1093 263 Etienne Pallier
portant la date du jour (voir des exemples dans database/update/old/).
1094 263 Etienne Pallier
Plus tard, il faudra penser à intégrer ce changement dans le script general de creation de la BDD database/BDD_IRAP.sql
1095 263 Etienne Pallier
(et/ou éventuellement les fichiers Insert_TablesFunct.sql, Insert_Users.sql, et Upd_TableConstraints.sql)
1096 263 Etienne Pallier
et donc deplacer le script de modification database/update/db-update-YYYY-MM-DD.sql dans database/update/old/db-update-YYYY-MM-DD.sql
1097 263 Etienne Pallier
1098 263 Etienne Pallier
6) Tester manuellement ce changement jusqu'a ce qu'il soit totalement OK
1099 263 Etienne Pallier
a) faire quelques tests manuels
1100 263 Etienne Pallier
b) Le test écrit à l'étape (4) doit maintenant passer (il est au vert).
1101 263 Etienne Pallier
Il doit être inclus dans l'ensemble des tests accessibles par le lien "AllTests".
1102 263 Etienne Pallier
c) Test de non régression : afin de s'assurer que cette modification du code n'entraîne aucune régression sur le reste du code, 
1103 263 Etienne Pallier
tous les autres tests écrits avant doivent aussi passer (vert) : pour cela, exécuter l'url /test.php?case=AllTests
1104 263 Etienne Pallier
1105 263 Etienne Pallier
7) Compléter le fichier /README.txt, section HISTORIQUE DES VERSIONS (fichier situé à la racine du projet)
1106 263 Etienne Pallier
Y mettre le même commentaire que ce que tu mettras lors du commit
1107 263 Etienne Pallier
1108 1 Etienne Pallier
8) Mettre a jour TON code (en mode console, "svn update" depuis la racine du projet, ou bien depuis Eclipse, clic droit sur le projet, "Team/Update") 
1109 1 Etienne Pallier
C'est important, au cas ou quelqu'un d'autre aurait fait des modifs (avant ou en meme temps que toi), et pour etre bien sur d'avoir la derniere version
1110 263 Etienne Pallier
1111 263 Etienne Pallier
9) Faire un "commit" du code, en collant dans le commentaire l'URL de la demande realisee (exemple : https://projects.irap.omp.eu/issues/1050)
1112 263 Etienne Pallier
1113 263 Etienne Pallier
10) Fermer la demande sur redmine
1114 263 Etienne Pallier
Sur la fiche detaillee, cliquer sur "Mettre a jour", changer le statut a "ferme", changer "% realise" a 100%, (copier l'URL de la fiche), cliquer sur Soumettre
1115 263 Etienne Pallier
1116 263 Etienne Pallier
11) Si c'est un changement important, le répercuter sur le site officiel 
1117 263 Etienne Pallier
Le changement est important si c'est une anomalie ou bien si c'est une évolution attendue.
1118 263 Etienne Pallier
Demander alors au service informatique de le répercuter sur l'installation officielle (faire un "svn update", mail à loic.jahan@irap.omp.eu).  
1119 263 Etienne Pallier
Si ce changement implique aussi la base de données, donner la directive que le fichier database/update/db-update-YYYY-MM-DD.sql doit être exécuté sur leur BDD.
1120 263 Etienne Pallier
Si ce changement impliquer une modification du fichier de configuration labinvent.php, donner la procédure à suivre dans le mail.
1121 263 Etienne Pallier
1122 263 Etienne Pallier
1123 1 Etienne Pallier
1124 264 Etienne Pallier
1125 264 Etienne Pallier
* *CORRIGER UNE ERREUR, RESOUDER UN PROBLEME, COMMENT DEBOGUER (DEBUG)*
1126 263 Etienne Pallier
1127 263 Etienne Pallier
Cakephp vous affiche une erreur, mais vous ne savez pas d'ou vient le probleme.
1128 263 Etienne Pallier
Don't panic.
1129 263 Etienne Pallier
En general, un bon moyen de le savoir est de lire le fichier de log des erreurs
1130 263 Etienne Pallier
dans cakephp/app/tmp/logs/error.log
1131 263 Etienne Pallier
1132 263 Etienne Pallier
Dans le dossier logs, vous trouverez d'autres logs utiles :
1133 263 Etienne Pallier
- labinvent.log
1134 263 Etienne Pallier
- debug.log (pas sur que ce fichier soit encore utilisé...)
1135 263 Etienne Pallier
1136 263 Etienne Pallier
Remarque :
1137 263 Etienne Pallier
$this->log('Something broke');
1138 263 Etienne Pallier
==> écrit dans cakephp/app/tmp/logs/ :
1139 263 Etienne Pallier
- error.log
1140 263 Etienne Pallier
- inventirap.log
1141 263 Etienne Pallier
1142 263 Etienne Pallier
1143 264 Etienne Pallier
1144 263 Etienne Pallier
* *OU EST QUOI (WHERE IS WHAT) ?*
1145 263 Etienne Pallier
1146 263 Etienne Pallier
- OU mettre a jour la VERSION du soft (AVANT CHAQUE COMMIT) ?
1147 263 Etienne Pallier
En attendant mieux, on fait cela a la fin du fichier cakephp/app/View/Layouts/default.ctp
1148 263 Etienne Pallier
1149 263 Etienne Pallier
- OU EST LA PAGE GENERALE (qui contient tous les elements) ? : cakephp/app/View/Layouts/default.ctp
1150 263 Etienne Pallier
1151 263 Etienne Pallier
- OU EST LA PAGE D'ACCUEIL ? : app/View/Pages/home.ctp
1152 263 Etienne Pallier
1153 263 Etienne Pallier
- OU SONT LES MENUS ? : app/View/Elements/
1154 263 Etienne Pallier
	- menu general + Recherche generale : menu.ctp
1155 263 Etienne Pallier
	- sous le menu general, et sous le champ "Recherche", titre du modele a ajouter : menu_index.ctp
1156 263 Etienne Pallier
1157 263 Etienne Pallier
- OU EST LA FEUILLE DE STYLE CSS ? : cakephp/app/webroot/css/inventirap.css
1158 263 Etienne Pallier
1159 263 Etienne Pallier
- OU EST DEFINIE LA PAGINATION ?
1160 263 Etienne Pallier
Dans le Controleur
1161 263 Etienne Pallier
Ex : la pagination des materiels est definie dans app/Controller/MaterielsController.php 
1162 263 Etienne Pallier
	public $paginate = array(
1163 263 Etienne Pallier
		'limit' => 50,
1164 263 Etienne Pallier
		'order' => array('Materiel.id' => 'desc'));
1165 263 Etienne Pallier
1166 263 Etienne Pallier
- OU SONT LES INFOS CONCERNANT UNE ENTITE quelconque (Materiel, Emprunt, Suivi, Utilisateur) ?
1167 263 Etienne Pallier
par exemple, ou trouver les infos sur l'entite "Materiel" ? : Aller dans cakephp/app/
1168 263 Etienne Pallier
- le Modele : Model/Materiel.php
1169 1 Etienne Pallier
- le Controleur : Controller/MaterielsController.php
1170 1 Etienne Pallier
- les Vues (templates) : View/Materiels
1171 263 Etienne Pallier
	- Vue de consultation : scaffold.view.ctp
1172 263 Etienne Pallier
	- Vue d'ajout (add) et edition (edit) : scaffold.form.ctp
1173 263 Etienne Pallier
	- vue de liste : index.ctp
1174 263 Etienne Pallier
1175 263 Etienne Pallier
- OU SONT DEFINIS LES ROLES (ACL) ?
1176 263 Etienne Pallier
Dans app/Model/Utilisateur.php :
1177 263 Etienne Pallier
	private $acceptedRoles = array ('Utilisateur', 'Responsable', 'Administration', 'Super Administrateur');
1178 263 Etienne Pallier
	public function getAuthenticationLevelFromRole($role) {
1179 263 Etienne Pallier
		if ($role == 'Utilisateur')
1180 263 Etienne Pallier
			return 1;
1181 263 Etienne Pallier
		elseif ($role == 'Responsable')
1182 263 Etienne Pallier
			return 2;
1183 263 Etienne Pallier
		elseif ($role == 'Administration')
1184 263 Etienne Pallier
			return 3;
1185 263 Etienne Pallier
		elseif ($role == 'Super Administrateur')
1186 263 Etienne Pallier
			return 4;
1187 263 Etienne Pallier
		return 0;
1188 263 Etienne Pallier
	}
1189 263 Etienne Pallier
1190 263 Etienne Pallier
1191 264 Etienne Pallier
1192 264 Etienne Pallier
* *WORKFLOW des materiels*
1193 263 Etienne Pallier
1194 263 Etienne Pallier
Le statut d'un materiel change selon le workflow suivant :
1195 263 Etienne Pallier
1) Un utilisateur lambda le cree (n'importe qui du labo) --> CREATED
1196 263 Etienne Pallier
2) L'Administration le valide (apres avoir eventuellement complete la fiche) --> VALIDATED
1197 263 Etienne Pallier
3) Un utilisateur lambda demande a l'archiver --> TOBEARCHIVED
1198 263 Etienne Pallier
4) L'Administration le sort de l'inventaire --> ARCHIVED
1199 263 Etienne Pallier
1200 263 Etienne Pallier
Notes : 
1201 263 Etienne Pallier
- Dans l'ideal, le materiel est premierement cree par l'utilisateur concerne,
1202 263 Etienne Pallier
puis mis a jour par l'administration au moment de la commande (puis validé)
1203 263 Etienne Pallier
- L'administration peut toujours retrograder le statut d'un materiel (ce qui revient a annuler un changement de statut) 
1204 263 Etienne Pallier
1205 263 Etienne Pallier
1206 264 Etienne Pallier
1207 264 Etienne Pallier
* *STRUCTURE GENERALE D'UNE PAGE WEB (TEMPLATE) = default.ctp*
1208 263 Etienne Pallier
1209 263 Etienne Pallier
app/View/Layouts/default.ctp contient la structure suivante :
1210 1 Etienne Pallier
1211 1 Etienne Pallier
	<div id="container">
1212 263 Etienne Pallier
		<div id="header">
1213 263 Etienne Pallier
			LE HEADER AVEC SON LOGO
1214 263 Etienne Pallier
			<div class="user">
1215 263 Etienne Pallier
				BIENVENUE $userName (ou invité)
1216 263 Etienne Pallier
			</div>
1217 263 Etienne Pallier
		</div>
1218 263 Etienne Pallier
		<div id="content">
1219 1 Etienne Pallier
			<?php echo $this->Session->flash(); ?>
1220 1 Etienne Pallier
			<?php echo $this->fetch('content'); ?>
1221 263 Etienne Pallier
		</div>
1222 263 Etienne Pallier
		<div id="footer">
1223 263 Etienne Pallier
			LE FOOTER
1224 263 Etienne Pallier
		</div>
1225 263 Etienne Pallier
	</div>
1226 263 Etienne Pallier
1227 263 Etienne Pallier
La DIV "content" insère 2 contenus :
1228 1 Etienne Pallier
	- le message flash éventuel (qui dit si une opération demandée s'est bien passée ou pas...)
1229 1 Etienne Pallier
	- la section "content", qui n'est autre que le coeur de la page
1230 263 Etienne Pallier
	
1231 263 Etienne Pallier
La page d'ACCUEIL n'est qu'un "content" parmi d'autres.
1232 263 Etienne Pallier
Elle se trouve dans app/View/Pages/home.ctp
1233 263 Etienne Pallier
(elle est affichée par le controleur de pages nommé PagesController)
1234 263 Etienne Pallier
1235 263 Etienne Pallier
1236 264 Etienne Pallier
1237 264 Etienne Pallier
* *COMMENT VOIR LES REQUETES SQL FAITES PAR CAKEPHP ?*
1238 263 Etienne Pallier
1239 263 Etienne Pallier
Dans le layout general (cakephp/app/View/Layouts/default.php), ajouter cette ligne :
1240 263 Etienne Pallier
	<?php echo $this->element('SQL_DUMP'); ?>
1241 263 Etienne Pallier
Vous devez aussi vous assurer que vous etes bien en mode DEBUG=2 (et non pas 0 ou 1)
1242 263 Etienne Pallier
dans le fichier de configuration Config/labinvent.php (ou bien dans le fichier Config/core.php)
1243 263 Etienne Pallier
1244 263 Etienne Pallier
1245 264 Etienne Pallier
1246 264 Etienne Pallier
* *OU EST FAIT LE CHARGEMENT DU FICHIER CONFIG database.php ?*
1247 263 Etienne Pallier
1248 263 Etienne Pallier
lib/Cake/Model/ConnectionManager.php (fonction _init())
1249 263 Etienne Pallier
Ce fichier fait partie de la librairie standard de CakePhp. Il ne faut donc pas y toucher.
1250 263 Etienne Pallier
A l'origine, j'avais (EP) changé ici le nom du fichier config "database.php" en "config.php",
1251 263 Etienne Pallier
ce qui marchait très très bien...
1252 263 Etienne Pallier
MAIS il ne vaut mieux pas modifier le comportement par défaut de cakephp,
1253 263 Etienne Pallier
car si un jour on change de version de cakephp, ça ne marchera plus.
1254 263 Etienne Pallier
1255 263 Etienne Pallier
1256 264 Etienne Pallier
1257 264 Etienne Pallier
* *CREATION ET GESTION DU NOUVEAU FICHIER DE CONFIG labinvent.php*
1258 263 Etienne Pallier
1259 263 Etienne Pallier
(cf http://book.cakephp.org/2.0/fr/development/configuration.html#loading-configuration-files)
1260 263 Etienne Pallier
1261 263 Etienne Pallier
1) J'ai créé le nouveau fichier de config dans app/Config/ (par exemple labinvent.php)
1262 263 Etienne Pallier
Ce fichier doit au minimum contenir un tableau nommé $config :
1263 263 Etienne Pallier
	$config = array(
1264 263 Etienne Pallier
			'labName' => 'IRAP',
1265 263 Etienne Pallier
			...
1266 263 Etienne Pallier
	);
1267 263 Etienne Pallier
 
1268 263 Etienne Pallier
2) Charger ce nouveau fichier de config au démarrage
1269 263 Etienne Pallier
Pour cela, ajouter cette ligne dans app/Config/bootstrap.php :
1270 263 Etienne Pallier
	Configure::load('labinvent');
1271 263 Etienne Pallier
1272 263 Etienne Pallier
3) Lire (ou même modifier) les paramètres de ce fichier de config, depuis N'IMPORTE OU (controleur, modèle, vue) :
1273 1 Etienne Pallier
		debug(Configure::version()); // pour afficher la version de Cakephp
1274 1 Etienne Pallier
		debug(Configure::read()); // tout lire
1275 263 Etienne Pallier
		debug(Configure::read('localisation')); // le tableau $localisation
1276 263 Etienne Pallier
		$labName = strtoupper(Configure::read('localisation.labNameShort'));
1277 263 Etienne Pallier
		debug(Configure::read('localisation.labName'));
1278 263 Etienne Pallier
		if (Configure::read('USE_LDAP')) ...
1279 263 Etienne Pallier
		if (Configure::read('debug') > 0 ) ...
1280 263 Etienne Pallier
On peut même modifier la valeur d'un paramètre dynamiquement comme ceci :
1281 263 Etienne Pallier
		Configure::write('debug',2)
1282 263 Etienne Pallier
C'est d'ailleurs ce qui est fait dans app/Config/core.php
1283 263 Etienne Pallier
1284 263 Etienne Pallier
1285 1 Etienne Pallier
4) Penser à modifier le script d'installation install/installation.sh pour qu'il prenne en compte ce nouveau fichier
1286 263 Etienne Pallier
1287 263 Etienne Pallier
1288 263 Etienne Pallier
1289 264 Etienne Pallier
1290 263 Etienne Pallier
* *LOCALISATION (adapatation du logiciel à l'entité locale)*
1291 263 Etienne Pallier
1292 263 Etienne Pallier
Vues (Pages) impactées :
1293 263 Etienne Pallier
- app/View/Layouts/default.ctp (template)
1294 263 Etienne Pallier
- app/View/Pages/home.ctp (Accueil)
1295 263 Etienne Pallier
- app/View/Pages/about.ctp (A propos)
1296 263 Etienne Pallier
1297 263 Etienne Pallier
Controleurs impactés :
1298 1 Etienne Pallier
- MaterielsController.php (fonction getLabNumber())
1299 1 Etienne Pallier
1300 263 Etienne Pallier
Documents impactés :
1301 263 Etienne Pallier
- Etiquette
1302 263 Etienne Pallier
- app/View/Documents/admission.ctp (Document d'admission)
1303 263 Etienne Pallier
- app/View/Documents/admission_cnrs.ctp (Document d'admission CNRS)
1304 1 Etienne Pallier
- app/View/Documents/admission_ups.ctp (Document d'admission UPS)
1305 263 Etienne Pallier
1306 263 Etienne Pallier
1307 264 Etienne Pallier
1308 264 Etienne Pallier
* *AJOUTER UNE NOUVELLE PAGE WEB*
1309 263 Etienne Pallier
1310 263 Etienne Pallier
Par exemple, voici ce que j'ai fait pour ajouter la page "about", qui est accessible via l'url https://inventirap.irap.omp.eu/pages/about
1311 263 Etienne Pallier
1) Aller dans app/View/Pages/
1312 263 Etienne Pallier
1) Faire un copier/coller d'une page existante, par exemple infos.ctp, et l'appeler about.ctp
1313 263 Etienne Pallier
2) Remplir cette page avec le contenu souhaité
1314 263 Etienne Pallier
3) Tester que cette page est bien accessible via l'url http://.../pages/about
1315 263 Etienne Pallier
4) Ajouter un lien vers cette page, soit dans le menu outils (app/View/Pages/tools.ctp), soit dans le menu général (app/View/Elements/menu.ctp)
1316 263 Etienne Pallier
5) Si cette page ne doit pas être accessible a tout le monde, définir le profil minimum exigé dans app/Controller/PagesController.php, en ajoutant une ligne dans le tableau $minProfileAllowedForPage
1317 263 Etienne Pallier
1318 263 Etienne Pallier
1319 264 Etienne Pallier
1320 263 Etienne Pallier
* *LOGIN workflow*
1321 263 Etienne Pallier
1322 263 Etienne Pallier
Controller/UtilisateursController/login() : 
1323 263 Etienne Pallier
; cherche l'utilisateur dans la table utilisateurs pour voir si c'est un user SPECIAL ou bien un user quelconque
1324 263 Etienne Pallier
; appelle Controller/Component/LdapAuthComponent/connection() et getUserName($ldapAuthentication)
1325 263 Etienne Pallier
1326 263 Etienne Pallier
Controller/Component/LdapAuthComponent : contient les 2 méthodes 
1327 263 Etienne Pallier
	- connection() : appelle Model/LdapConnection/ldapAuthentication($login, $password)
1328 263 Etienne Pallier
	- getUserName() : appelle Model/LdapConnection/getUserAttributes($ldapAuthentication)
1329 263 Etienne Pallier
1330 263 Etienne Pallier
Page d'accueil = View/Pages/home.ctp
1331 263 Etienne Pallier
(Controleur des pages simples = Controller/PagesController.php)
1332 263 Etienne Pallier
1333 263 Etienne Pallier
1334 264 Etienne Pallier
1335 264 Etienne Pallier
* *LOG*
1336 263 Etienne Pallier
1337 263 Etienne Pallier
$this->log('Something broke');
1338 263 Etienne Pallier
==> écrit dans cakephp/app/tmp/logs/ :
1339 263 Etienne Pallier
- error.log
1340 263 Etienne Pallier
- inventirap.log
1341 263 Etienne Pallier
1342 263 Etienne Pallier
1343 264 Etienne Pallier
1344 263 Etienne Pallier
* *GOOGLE ANALYTICS INTEGRATION*
1345 263 Etienne Pallier
1346 1 Etienne Pallier
adapté de http://blog.janjonas.net/2010-01-31/cakephp-google-analytics-integration
1347 263 Etienne Pallier
1348 263 Etienne Pallier
1) Copier ce code dans app/View/Elements/google-analytics.ctp :
1349 263 Etienne Pallier
<?php
1350 263 Etienne Pallier
$gaCode = Configure::read('google-analytics.tracker-code');
1351 263 Etienne Pallier
if ($gaCode) {
1352 263 Etienne Pallier
$googleAnalytics = <<<EOD
1353 263 Etienne Pallier
<script type="text/javascript">
1354 263 Etienne Pallier
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
1355 263 Etienne Pallier
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
1356 263 Etienne Pallier
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
1357 263 Etienne Pallier
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
1358 263 Etienne Pallier
1359 263 Etienne Pallier
  ga('create', 'UA-45668893-3', 'omp.eu');
1360 263 Etienne Pallier
  ga('send', 'pageview');
1361 263 Etienne Pallier
1362 263 Etienne Pallier
</script>
1363 263 Etienne Pallier
EOD;
1364 263 Etienne Pallier
echo $googleAnalytics;
1365 263 Etienne Pallier
}
1366 263 Etienne Pallier
?>
1367 263 Etienne Pallier
1368 263 Etienne Pallier
/* ANCIEN CODE JAVASCRIPT :
1369 263 Etienne Pallier
<script type="text/javascript">
1370 263 Etienne Pallier
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
1371 263 Etienne Pallier
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
1372 263 Etienne Pallier
</script>
1373 263 Etienne Pallier
<script type="text/javascript">
1374 1 Etienne Pallier
try {
1375 1 Etienne Pallier
var pageTracker = _gat._getTracker("$gaCode");
1376 263 Etienne Pallier
pageTracker._trackPageview();
1377 263 Etienne Pallier
} catch(err) {}</script>
1378 263 Etienne Pallier
*/
1379 263 Etienne Pallier
1380 263 Etienne Pallier
1381 263 Etienne Pallier
1382 263 Etienne Pallier
2) Inclure le view element dans app/View/Layouts/default.ctp (juste avant </body>):
1383 1 Etienne Pallier
<?php echo $this->element('google-analytics'); ?>
1384 1 Etienne Pallier
1385 263 Etienne Pallier
3) Définir le tracker code dans la configuration (/app/Config/core.php):
1386 263 Etienne Pallier
Configure::write('google-analytics.tracker-code', false); // disables Google Analytics
1387 263 Etienne Pallier
Configure::write('google-analytics.tracker-code', 'YOUR-TRACKING-CODE'); // enables Google Analytics
1388 263 Etienne Pallier
1389 264 Etienne Pallier
1390 263 Etienne Pallier
* *GENERALITES*
1391 263 Etienne Pallier
1392 263 Etienne Pallier
- URL : http://localhost/inventirapsvn/cakephp/
1393 263 Etienne Pallier
1394 263 Etienne Pallier
- BD admin : http://localhost/phpmyadmin
1395 263 Etienne Pallier
1396 263 Etienne Pallier
- LOG : cakephp/app/tmp/logs/inventirap.log
1397 263 Etienne Pallier
1398 263 Etienne Pallier
- (UPDATE : cd Inventirap/ ; chmod -R 777 ./cakephp/app/tmp/)
1399 263 Etienne Pallier
1400 263 Etienne Pallier
- (SORTIE INVENTAIRE a faire : pc portable DELL (ex Nicolas Andre) - sept 2012 CNES 4017 (carte mere hs))
1401 263 Etienne Pallier
1402 263 Etienne Pallier
- Eclipse config :
1403 263 Etienne Pallier
Setup syntax highlighting for .ctp files:
1404 263 Etienne Pallier
Window > Preferences > General > Appearance > content Types > Text > PHP Content type > Add.. , then put in *.ctp.
1405 263 Etienne Pallier
1406 263 Etienne Pallier
- Cakephp config : cakephp/app/Config/
1407 263 Etienne Pallier
Mode debug ON (pour voir les erreurs et pour vider le cache en cas de changement sur la BD) 
1408 263 Etienne Pallier
core.php : 	Configure::write('debug', 1);
1409 263 Etienne Pallier
1410 263 Etienne Pallier
- Fichier de demarrage :
1411 263 Etienne Pallier
cakephp/index.php (qui pointe sur cakephp/app/webroot/index.php)
1412 263 Etienne Pallier
(Attention, il y a aussi un fichier cakephp/app/index.php qui pointe sur webroot/index.php)
1413 263 Etienne Pallier
(ROOT doit pointer sur le dossier cakephp/)
1414 263 Etienne Pallier
Le fichier execute ensuite est cakephp/lib/Cake/bootstrap.php qui lance ./Core/App.php
1415 263 Etienne Pallier
and so on...
1416 263 Etienne Pallier
1417 263 Etienne Pallier
1418 263 Etienne Pallier
1419 264 Etienne Pallier
1420 264 Etienne Pallier
* *RECHERCHE de materiels*
1421 263 Etienne Pallier
1422 263 Etienne Pallier
3 methodes :
1423 1 Etienne Pallier
- recherche generale (sous le menu general) : cakephp/app/View/Elements/menu.ctp
1424 1 Etienne Pallier
- VUE de recherche : cakephp/app/View/Materiels/find.ctp
1425 263 Etienne Pallier
- ACTION de recherche : cakephp/app/Controller/MaterielsController (methode find())
1426 263 Etienne Pallier
1427 263 Etienne Pallier
1428 264 Etienne Pallier
1429 264 Etienne Pallier
* *ACL (Controle d'acces aux ressources)*
1430 263 Etienne Pallier
1431 263 Etienne Pallier
NB: Cette section n'est sans doute plus très à jour ; sur ce sujet, il est préférable de lire le document docs/userguide/ACL.doc (ou .pdf)
1432 263 Etienne Pallier
1433 263 Etienne Pallier
Synthese sur les droits selon le profil
1434 1 Etienne Pallier
1435 1 Etienne Pallier
Profils (roles), dans le sens du pouvoir croissant :
1436 263 Etienne Pallier
Qq = Utilisateur Quelconque (lambda)
1437 263 Etienne Pallier
Rp = Responsable
1438 263 Etienne Pallier
Ad = Administration
1439 263 Etienne Pallier
Sa = Superadmin
1440 263 Etienne Pallier
1441 263 Etienne Pallier
Actions :
1442 263 Etienne Pallier
C = Create
1443 263 Etienne Pallier
R = Read (voir, consulter)
1444 263 Etienne Pallier
U = Update (mettre a jour)
1445 263 Etienne Pallier
D = Delete (supprimer)
1446 263 Etienne Pallier
V = Valider un materiel CREATED --> passe alors en statut VALIDATED
1447 263 Etienne Pallier
A = Demander l'Archivage d'un materiel VALIDATED --> passe alors en statut TOBEARCHIVED 
1448 263 Etienne Pallier
S = Sortir de l'inventaire (Valider une demande d'archivage d'un materiel TOBEARCHIVED) --> passe alors en statut ARCHIVED 
1449 263 Etienne Pallier
E = Exporter
1450 263 Etienne Pallier
1451 263 Etienne Pallier
Par defaut, le superadmin a acces a TOUT 
1452 263 Etienne Pallier
1453 263 Etienne Pallier
Materiels :
1454 263 Etienne Pallier
- Qq a les droits C, R (sauf champs admin), U (si createur et sauf champs admin), A, D (si CREATED et owner)
1455 263 Etienne Pallier
- Rp a les droits C, R (sauf champs admin), U (sauf champs admin), D (si CREATED), V, A, E
1456 263 Etienne Pallier
- Ad a les droits C, R, U (ssi NOT ARCHIVED), D (si CREATED), V, (A mais inutile car fait directement S sans passer par A), S, E
1457 263 Etienne Pallier
1458 263 Etienne Pallier
Suivis et Emprunts :
1459 263 Etienne Pallier
- Dans tous les cas, on ne doit pas pouvoir emprunter ou suivre un materiel non valide (CREATED)
1460 263 Etienne Pallier
- Qq a les droits C, R, U (si createur), D (si createur)
1461 263 Etienne Pallier
- Rp a les droits C, R, U, D
1462 263 Etienne Pallier
- Ad a les memes droits que Rp
1463 263 Etienne Pallier
1464 263 Etienne Pallier
VUES specifiques :
1465 263 Etienne Pallier
- Acces aux Outils : reserve a Rp et Ad (vue contenant des liens vers differentes ressources telles que utilisateurs, materiels, categories...)
1466 263 Etienne Pallier
- L'administration a une vue resumee sur la page d'accueil (liens directs vers actions a faire)
1467 263 Etienne Pallier
- L'administration a une vue enrichie de la liste des materiels :
1468 263 Etienne Pallier
	- filtres (y-compris sur ARCHIVED)
1469 263 Etienne Pallier
	- export en CSV (pour tableur Excel)
1470 263 Etienne Pallier
	- upgrade du statut (validation et sortie)
1471 263 Etienne Pallier
1472 264 Etienne Pallier
Autres regles (de gestion) importantes :
1473 264 Etienne Pallier
- un materiel non valide (CREATED) peut etre supprime uniquement par le createur de la fiche, le responsable (Roger), et l'administration
1474 263 Etienne Pallier
Idem pour la mise a jour de cette fiche
1475 263 Etienne Pallier
- un materiel valide (VALIDATED) n'est pas supprimable
1476 263 Etienne Pallier
- les champs ADMINISTRATIFS d'un materiel ne sont visibles et modifiables que par l'administration
1477 263 Etienne Pallier
- par defaut, la liste des materiels affiche tous les materiels SAUF ceux qui sont sortis de l'inventaire (ARCHIVED) qui sont donc masques.
1478 263 Etienne Pallier
Il est de toutes facons toujours possible (pour l'administration seulement) de les voir, grace au nouveau filtre "Archives" present sur la liste des materiels
1479 263 Etienne Pallier
- la recherche doit s'effectuer dans TOUS les materiels (y-compris ARCHIVED)
1480 263 Etienne Pallier
1481 263 Etienne Pallier
1482 263 Etienne Pallier
1483 264 Etienne Pallier
1484 264 Etienne Pallier
* *COMMENT CONTOURNER LE LDAP officiel*
1485 263 Etienne Pallier
1486 263 Etienne Pallier
(ATTENTION: CONTENU OBSOLETE A METTRE A JOUR (EP))
1487 263 Etienne Pallier
1488 263 Etienne Pallier
(cf Controller/UtilisateursController.php :	methode login())
1489 263 Etienne Pallier
1490 263 Etienne Pallier
1) Si on veut tester le LDAP, on peut utiliser le LDAP de la Virtual Machine Upsilon (CentOS 6)
1491 263 Etienne Pallier
Dans ce cas, il faut ajouter dans la BD les utilisateurs specifiques suivants :
1492 263 Etienne Pallier
# Ajout d'utilisateurs de TEST (LDAP upsilon)
1493 263 Etienne Pallier
INSERT INTO utilisateurs (nom, login, email, role, groupes_metier_id) VALUES
1494 263 Etienne Pallier
 	('Hillembrand Cedric', 'Cedric', 'Cedric.Hillembrand@irap.omp.eu', 'Super Administrateur', 1),
1495 263 Etienne Pallier
 	('Turner Daniel', 'Daniel', 'Daniel.Turner@irap.omp.eu', 'Administration', 1),
1496 263 Etienne Pallier
 	('Sky Gin', 'Gin', 'Gin.Sky@irap.omp.eu', 'Responsable', 1),
1497 263 Etienne Pallier
 	('Robert Henri', 'Henri', 'Henri.Robert', 'Utilisateur', 1);
1498 263 Etienne Pallier
1499 263 Etienne Pallier
2) Sinon, le plus simple est d'utiliser un FAUX (fake) LDAP interne a l'application
1500 263 Etienne Pallier
Dans ce cas, il faut decommenter la variable $fakeLDAP dans le fichier config.php et ajouter dans la BD les utilisateurs specifiques suivants :
1501 263 Etienne Pallier
# Ajout d'utilisateurs de TEST (hors LDAP)
1502 263 Etienne Pallier
INSERT INTO utilisateurs (nom, login, email, role, groupes_metier_id) VALUES
1503 263 Etienne Pallier
 	('Hubert SuperAdmin', 'superadmin', 'hubert.superadmin@irap.omp.eu', 'Super Administrateur', 1),
1504 263 Etienne Pallier
 	('Pierre Responsable', 'responsable', 'pierre.resp@irap.omp.eu', 'Responsable', 2),
1505 263 Etienne Pallier
 	('Jean Administration', 'admin', 'Jean.Administration@irap.omp.eu', 'Administration', 5),
1506 263 Etienne Pallier
 	('Jacques Utilisateur', 'user', 'Jacques.Utilisateur@irap.omp.eu', 'Utilisateur', 7);
1507 263 Etienne Pallier
1508 263 Etienne Pallier
Informations sur le LDAP :
1509 263 Etienne Pallier
1510 263 Etienne Pallier
Classe LdapAuthComponent (extends AuthComponent), definie dans : app/Controller/Component/LdapAuthComponent.php 
1511 263 Etienne Pallier
1512 263 Etienne Pallier
Definition des roles (ACL) : app/Model/Utilisateur.php :
1513 263 Etienne Pallier
	private $acceptedRoles = array ('Utilisateur', 'Responsable', 'Administration', 'Super Administrateur');
1514 263 Etienne Pallier
	public function getAuthenticationLevelFromRole($role) {
1515 263 Etienne Pallier
		if ($role == 'Utilisateur')
1516 263 Etienne Pallier
			return 1;
1517 263 Etienne Pallier
		elseif ($role == 'Responsable')
1518 263 Etienne Pallier
			return 2;
1519 263 Etienne Pallier
		elseif ($role == 'Administration')
1520 263 Etienne Pallier
			return 3;
1521 263 Etienne Pallier
		elseif ($role == 'Super Administrateur')
1522 263 Etienne Pallier
			return 4;
1523 263 Etienne Pallier
		return 0;
1524 263 Etienne Pallier
	}
1525 263 Etienne Pallier
1526 263 Etienne Pallier
Lecture du fichier de config : app/Model/LdapConnection.php :
1527 263 Etienne Pallier
		private function checkConfiguration()
1528 263 Etienne Pallier
1529 263 Etienne Pallier
Workflow du LDAP :
1530 263 Etienne Pallier
1) Page d'accueil : j'entre mon login et pwd
1531 263 Etienne Pallier
2) clic sur bouton "Se Connecter" --> execute l'action Utilisateurs/login (dans app/Controller/UtilisateursController.php)
1532 263 Etienne Pallier
1533 263 Etienne Pallier
1534 263 Etienne Pallier
1535 263 Etienne Pallier
1536 264 Etienne Pallier
1537 263 Etienne Pallier
* *COMMENT AJOUTER UNE NOUVELLE TABLE DANS LA BD*
1538 263 Etienne Pallier
1539 263 Etienne Pallier
On explique ici ce qu'il faut faire quand on veut ajouter une nouvelle table dans la base de données, 
1540 263 Etienne Pallier
table qui doit être prise en compte dans l'application.
1541 263 Etienne Pallier
Cette explication est donnée avec 2 exemples.
1542 263 Etienne Pallier
1543 263 Etienne Pallier
1) Premier exemple : ajout de la table sur-categorie (EP)
1544 263 Etienne Pallier
1545 263 Etienne Pallier
Avant cet ajout, il n'y avait que la table categorie et la table sous-categorie.
1546 263 Etienne Pallier
Vous trouverez plus de détails sur ce sujet dans la section suivante nommée "COMMENT J'AI FAIT POUR AJOUTER UN 3eme niveau de categorie appele sur_categorie (ou domaine)"
1547 263 Etienne Pallier
1548 263 Etienne Pallier
a) impact sur la BD
1549 263 Etienne Pallier
- ajout d'une nouvelle table sur_categories(id,nom) :
1550 263 Etienne Pallier
CREATE TABLE IF NOT EXISTS sur_categories (
1551 263 Etienne Pallier
  id int(11) NOT NULL AUTO_INCREMENT,
1552 263 Etienne Pallier
  nom varchar(45) DEFAULT NULL,
1553 263 Etienne Pallier
  PRIMARY KEY (id),
1554 263 Etienne Pallier
  UNIQUE KEY nom_UNIQUE (nom)
1555 263 Etienne Pallier
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
1556 263 Etienne Pallier
1557 263 Etienne Pallier
- ajout dans la table categories d'une cle etrangere sur_categorie_id :
1558 263 Etienne Pallier
ALTER TABLE categories 
1559 263 Etienne Pallier
	ADD sur_categorie_id INT( 11 ) NULL DEFAULT NULL,
1560 263 Etienne Pallier
  	ADD CONSTRAINT fk_sur_categorie_id FOREIGN KEY (sur_categorie_id) REFERENCES sur_categories (id) ON DELETE NO ACTION ON UPDATE NO ACTION;
1561 263 Etienne Pallier
1562 263 Etienne Pallier
- ajout dans la table materiels d'une cle etrangere sur_categorie_id :
1563 263 Etienne Pallier
ALTER TABLE materiels 
1564 263 Etienne Pallier
	ADD sur_categorie_id INT( 11 ) NOT NULL after designation,
1565 263 Etienne Pallier
	ADD CONSTRAINT fk_materiels_sur_categorie_id FOREIGN KEY (sur_categorie_id) REFERENCES sur_categories (id) ON DELETE NO ACTION ON UPDATE NO ACTION;
1566 263 Etienne Pallier
1567 263 Etienne Pallier
(attention, il faut d'abord vider les lignes des tables suivis, emprunts, et materiels)
1568 263 Etienne Pallier
delete from suivis;
1569 263 Etienne Pallier
delete from emprunts;
1570 1 Etienne Pallier
delete from materiels;
1571 263 Etienne Pallier
1572 263 Etienne Pallier
Il faut aussi ajouter des sur-categories :
1573 263 Etienne Pallier
# Ajout de quelques sur-categories
1574 263 Etienne Pallier
insert into sur_categories (id,nom) values 
1575 263 Etienne Pallier
(1,'Electronique'), 
1576 263 Etienne Pallier
(2,'Informatique'), 
1577 263 Etienne Pallier
(3,'Instrumentation')
1578 263 Etienne Pallier
(4, 'Logistique'),
1579 263 Etienne Pallier
(5, 'Mecanique'),
1580 263 Etienne Pallier
(6, 'Optique')
1581 263 Etienne Pallier
;
1582 263 Etienne Pallier
1583 263 Etienne Pallier
# Relier toutes les categories a une sur-categorie (la 1)
1584 263 Etienne Pallier
update categories set sur_categorie_id=1 where id<10; 
1585 263 Etienne Pallier
update categories set sur_categorie_id=2 where id>=10 and id<20; 
1586 263 Etienne Pallier
update categories set sur_categorie_id=3 where id>=20;
1587 263 Etienne Pallier
1588 263 Etienne Pallier
1589 263 Etienne Pallier
b) impact sur les modeles (cakephp/app/Model)
1590 263 Etienne Pallier
- Ajout du nouveau modèle SurCategorie.php : copie de Categorie.php avec "hasMany categorie"
1591 263 Etienne Pallier
- Modif du modèle Categorie.php : + belongsTo="SurCategorie"
1592 263 Etienne Pallier
1593 263 Etienne Pallier
c) impact sur les controleurs (cakephp/app/Controller)
1594 1 Etienne Pallier
- Ajout du nouveau controleur SurCategoriesController.php : minimaliste (comme CategoriesController)
1595 263 Etienne Pallier
- Modif du controleur CategoriesController.php : +getBySurCategorie()
1596 263 Etienne Pallier
1597 263 Etienne Pallier
d) impact sur les vues (cakephp/app/View)
1598 263 Etienne Pallier
- SurCategorie : no view (scaffold ?)
1599 263 Etienne Pallier
- Categorie : actuellement no view (scaffold ?) 
1600 263 Etienne Pallier
--> creer une vue (comme SousCategorie) 
1601 263 Etienne Pallier
+ get_by_surcategorie.ctp
1602 263 Etienne Pallier
+ scaffold.form.ctp
1603 263 Etienne Pallier
1604 263 Etienne Pallier
e) View/Pages/tools.ctp : ajouter une entree au menu pour les Sur-Categories
1605 263 Etienne Pallier
1606 263 Etienne Pallier
f) impact sur TOUTES les vues de Materiel
1607 263 Etienne Pallier
add/edit/view/index
1608 263 Etienne Pallier
dans la vue index, remplacer la categorie par la sur-categorie
1609 263 Etienne Pallier
GROS BOULOT sur la vue ADD/EDIT (+ javascript)
1610 263 Etienne Pallier
1611 263 Etienne Pallier
1612 263 Etienne Pallier
2) Deuxième exemple : ajout de la table type_suivis (VM)
1613 263 Etienne Pallier
1614 263 Etienne Pallier
Un peu plus haut est expliqué comment créer une table, je vais ici expliquer comment créer et remplir tout ce qui est basiquement 
1615 263 Etienne Pallier
nécessaire pour l'utiliser, en prenant pour exemple la table type_suivis.
1616 263 Etienne Pallier
1617 263 Etienne Pallier
Après avoir créé la table, on lui crée :
1618 263 Etienne Pallier
- Un controller : Héritant de AppController, avec une variable $scaffold sui se chargera de presque tout et une variable $name avec son nom.
1619 263 Etienne Pallier
- Un model : Avec la même variable $name et une variable $displayField qui correspond a la designation dans la BDD (ex: "nom");
1620 263 Etienne Pallier
	Il doit contenir la fonction typeSuiviNameIsUnik($name) {} (qu'on retrouve dans sites ou organisme) ainsi que le $validate comprenant les validations necessaires. 
1621 263 Etienne Pallier
- Une vue, selon l'utilité, n'est pas forcément nécessaire grâce au scaffold.
1622 263 Etienne Pallier
Par la suite, pour lister son contenu via un lien dans "outils" par exemple, il suffit de créer le chemin dans view/pages/tools.ctp.
1623 263 Etienne Pallier
1624 263 Etienne Pallier
1625 264 Etienne Pallier
1626 263 Etienne Pallier
* *CREER UN CHAMP DATE (VM)*
1627 263 Etienne Pallier
1628 263 Etienne Pallier
Pour expliquer comment créer un champ date fonctionnel, je vais prendre l'exemple de la Date de reception.
1629 263 Etienne Pallier
Une fois vôtre colonne créé dans la table marteriel, vous devrez faire des modifications dans : 
1630 263 Etienne Pallier
1631 263 Etienne Pallier
MaterielController : //Passer la date au format français	
1632 263 Etienne Pallier
1633 263 Etienne Pallier
		if(isset($this->request->data['Materiel']['date_reception'])){
1634 263 Etienne Pallier
		$this->request->data['Materiel']['date_reception'] = date("d-m-Y", strtotime($this->request->data['Materiel']['date_reception'])); }
1635 263 Etienne Pallier
1636 263 Etienne Pallier
le Model Materiel : Créer un champ de validation adapté à la date, avec un regex. Et surtout remplir le formatage de date à l'américaine :
1637 263 Etienne Pallier
1638 263 Etienne Pallier
		if (isset($this->data['Materiel']['date_reception'])) {
1639 263 Etienne Pallier
			$originalDate = $this->data['Materiel']['date_reception'];
1640 263 Etienne Pallier
			$this->data['Materiel']['date_reception'] = date("Y-m-d", strtotime($originalDate));
1641 263 Etienne Pallier
		}
1642 263 Etienne Pallier
1643 263 Etienne Pallier
La vue Materiel : - Scaffold.view : Repasser la date en français et l'afficher.
1644 263 Etienne Pallier
				  - Scaffold.form : Créer le champ date du formulaire
1645 263 Etienne Pallier
1646 263 Etienne Pallier
Puis il faut adapter le champ date reception presque partout ou il y a le champ date acquisition.
1647 263 Etienne Pallier
1648 263 Etienne Pallier
1649 263 Etienne Pallier
1650 263 Etienne Pallier
1651 264 Etienne Pallier
1652 263 Etienne Pallier
* *COMMENT J'AI FAIT POUR AJOUTER UN 3eme niveau de categorie appele sur_categorie (ou domaine) (EP) ?*
1653 263 Etienne Pallier
1654 263 Etienne Pallier
je me rends compte d'une incoherence de stockage dans la table Materiels.
1655 263 Etienne Pallier
En effet, quand on saisit un materiel, on doit choisir une categorie ET une sous-categorie.
1656 263 Etienne Pallier
Du coup, les 2 id (categorie + sous-categorie) sont stockes dans la table Materiels...
1657 263 Etienne Pallier
Or, c'est inutile car la sous-categorie suffit a determiner la categorie...
1658 263 Etienne Pallier
Cette redondance pourrait meme amener des incoherences dans la table Materiels si par exemple on fait des modifications 
1659 263 Etienne Pallier
dans les tables categories et sous_categories sans les repercuter dans la table materiels !!
1660 263 Etienne Pallier
Je suppose que c'est un choix de facilite qui a ete fait par upsilon.
1661 263 Etienne Pallier
1662 263 Etienne Pallier
Donc, si vous etes ok, et a moins que Upsilon me dise qu'il y avait une bonne raison de faire ce choix (j'en doute),
1663 263 Etienne Pallier
je propose de modifier le code pour que seule la sous-categorie soit stockee (on ne stocke plus la categorie).
1664 263 Etienne Pallier
1665 263 Etienne Pallier
En plus, cela simplifiera l'ajout du 3eme niveau "sur-categorie" puisque lui-meme n'aura pas besoin d'etre stocke etant donne qu'il est automatiquement determine par la categorie.
1666 263 Etienne Pallier
On aura alors :
1667 263 Etienne Pallier
sous_categorie_id -> categorie_id -> sur_categorie_id
1668 263 Etienne Pallier
Avec seulement la sous_categorie, on pourra determiner la categorie, et donc la sur_categorie. 
1669 263 Etienne Pallier
1670 263 Etienne Pallier
Du coup, si je fais cette modif, on pourrait meme se permettre de demarrer officiellement INVENTIRAP rapidement.
1671 263 Etienne Pallier
En effet, l'ajout de la sur-categorie ne change rien au contenu des tables "administratives" (materiels, emprunts, suivis), 
1672 263 Etienne Pallier
et donc on pourra le faire plus tard, meme apres que l'administration ait commence a remplir la BD. 
1673 263 Etienne Pallier
Ca sera totalement transparent.
1674 263 Etienne Pallier
1675 263 Etienne Pallier
1) suppression de la redondance (categorie_id) dans la table materiels
1676 263 Etienne Pallier
1677 263 Etienne Pallier
a) impact sur la vue index de Materiel
1678 263 Etienne Pallier
add/edit/view/index
1679 263 Etienne Pallier
1680 263 Etienne Pallier
2) ajout d'une sur-categorie
1681 263 Etienne Pallier
1682 263 Etienne Pallier
a) impact sur la BD
1683 263 Etienne Pallier
- ajout d'une nouvelle table sur_categories(id,nom) :
1684 263 Etienne Pallier
CREATE TABLE IF NOT EXISTS sur_categories (
1685 263 Etienne Pallier
  id int(11) NOT NULL AUTO_INCREMENT,
1686 263 Etienne Pallier
  nom varchar(45) DEFAULT NULL,
1687 263 Etienne Pallier
  PRIMARY KEY (id),
1688 1 Etienne Pallier
  UNIQUE KEY nom_UNIQUE (nom)
1689 263 Etienne Pallier
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
1690 263 Etienne Pallier
1691 263 Etienne Pallier
- ajout dans la table categories d'une cle etrangere sur_categorie_id :
1692 263 Etienne Pallier
ALTER TABLE categories 
1693 263 Etienne Pallier
	ADD sur_categorie_id INT( 11 ) NULL DEFAULT NULL,
1694 263 Etienne Pallier
  	ADD CONSTRAINT fk_sur_categorie_id FOREIGN KEY (sur_categorie_id) REFERENCES sur_categories (id) ON DELETE NO ACTION ON UPDATE NO ACTION;
1695 263 Etienne Pallier
1696 263 Etienne Pallier
- ajout dans la table materiels d'une cle etrangere sur_categorie_id :
1697 263 Etienne Pallier
ALTER TABLE materiels 
1698 263 Etienne Pallier
	ADD sur_categorie_id INT( 11 ) NOT NULL after designation,
1699 263 Etienne Pallier
	ADD CONSTRAINT fk_materiels_sur_categorie_id FOREIGN KEY (sur_categorie_id) REFERENCES sur_categories (id) ON DELETE NO ACTION ON UPDATE NO ACTION;
1700 263 Etienne Pallier
1701 263 Etienne Pallier
(attention, il faut d'abord vider les lignes des tables suivis, emprunts, et materiels)
1702 263 Etienne Pallier
delete from suivis;
1703 263 Etienne Pallier
delete from emprunts;
1704 263 Etienne Pallier
delete from materiels;
1705 263 Etienne Pallier
1706 263 Etienne Pallier
Il faut aussi ajouter des sur-categories :
1707 263 Etienne Pallier
# Ajout de quelques sur-categories
1708 263 Etienne Pallier
insert into sur_categories (id,nom) values 
1709 263 Etienne Pallier
(1,'Electronique'), 
1710 263 Etienne Pallier
(2,'Informatique'), 
1711 263 Etienne Pallier
(3,'Instrumentation')
1712 263 Etienne Pallier
(4, 'Logistique'),
1713 263 Etienne Pallier
(5, 'Mecanique'),
1714 263 Etienne Pallier
(6, 'Optique')
1715 263 Etienne Pallier
;
1716 263 Etienne Pallier
1717 263 Etienne Pallier
# Relier toutes les categories a une sur-categorie (la 1)
1718 263 Etienne Pallier
update categories set sur_categorie_id=1 where id<10; 
1719 263 Etienne Pallier
update categories set sur_categorie_id=2 where id>=10 and id<20; 
1720 263 Etienne Pallier
update categories set sur_categorie_id=3 where id>=20;
1721 263 Etienne Pallier
1722 263 Etienne Pallier
1723 263 Etienne Pallier
b) impact sur les modeles (cakephp/app/Model)
1724 263 Etienne Pallier
- SurCategorie.php : copie de Categorie.php avec "hasMany categorie"
1725 263 Etienne Pallier
- Categorie.php : + belongsTo="SurCategorie"
1726 263 Etienne Pallier
1727 263 Etienne Pallier
c) impact sur les controleurs (cakephp/app/Controller)
1728 263 Etienne Pallier
- SurCategoriesController.php : minimaliste (comme CategoriesController)
1729 263 Etienne Pallier
- CategoriesController.php : +getBySurCategorie()
1730 263 Etienne Pallier
1731 263 Etienne Pallier
d) impact sur les vues (cakephp/app/View)
1732 263 Etienne Pallier
- SurCategorie : no view (scaffold ?)
1733 263 Etienne Pallier
- Categorie : actuellement no view (scaffold ?) 
1734 263 Etienne Pallier
--> creer une vue (comme SousCategorie) 
1735 263 Etienne Pallier
+ get_by_surcategorie.ctp
1736 263 Etienne Pallier
+ scaffold.form.ctp
1737 263 Etienne Pallier
1738 263 Etienne Pallier
e) View/Pages/tools.ctp : ajouter une entree au menu pour les Sur-Categories
1739 263 Etienne Pallier
1740 263 Etienne Pallier
f) impact sur TOUTES les vues de Materiel
1741 263 Etienne Pallier
add/edit/view/index
1742 263 Etienne Pallier
dans la vue index, remplacer la categorie par la sur-categorie
1743 263 Etienne Pallier
GROS BOULOT sur la vue ADD/EDIT (+ javascript)
1744 263 Etienne Pallier
1745 263 Etienne Pallier
1746 263 Etienne Pallier
1747 264 Etienne Pallier
1748 263 Etienne Pallier
* *TESTS*
1749 263 Etienne Pallier
1750 263 Etienne Pallier
A - EXECUTION
1751 263 Etienne Pallier
1752 263 Etienne Pallier
Prérequis : PHPUNIT 3 doit être déjà installé et accessible depuis la console (phpunit -version) via le fichier php.ini
1753 263 Etienne Pallier
(ATTENTION : cakephp 2.x n'est pas compatible avec PhpUnit 4)
1754 263 Etienne Pallier
1755 263 Etienne Pallier
Avec XAMPP (conseillé) : PhpUnit 3 est déjà inclus
1756 263 Etienne Pallier
Avec MAMP (+ difficile) : pour installer PhpUnit, suivre cette documentation : http://www.dolinaj.net/software-installation/mac/how-to-install-phpunit-with-mamp-on-mac/
1757 263 Etienne Pallier
1758 263 Etienne Pallier
Procédure à suivre pour pouvoir exécuter les tests unitaires et fonctionnels livrés avec le logiciel :
1759 263 Etienne Pallier
1760 263 Etienne Pallier
1) Ajouter une nouvelle configuration de base de données dans votre fichier app/Config/database.php pour la BD de test
1761 263 Etienne Pallier
 
1762 263 Etienne Pallier
 Exemple de configuration :
1763 263 Etienne Pallier
 
1764 263 Etienne Pallier
	public $test = array(
1765 263 Etienne Pallier
		'datasource' => 'Database/Mysql',
1766 263 Etienne Pallier
		'persistent' => false,
1767 263 Etienne Pallier
		'host' => 'localhost',
1768 263 Etienne Pallier
		'database' => 'test_labinvent',
1769 263 Etienne Pallier
		'login' => 'root',
1770 263 Etienne Pallier
		'password' => '',
1771 263 Etienne Pallier
	);
1772 263 Etienne Pallier
1773 263 Etienne Pallier
1774 263 Etienne Pallier
2) Créer la BD de test (vide)
1775 263 Etienne Pallier
A l'aide de phpmyadmin ou bien avec un client mysql quelconque,
1776 263 Etienne Pallier
créer une BD de test vide que vous nommerez avec le même nom que celui donné dans la configuration ci-dessus,
1777 263 Etienne Pallier
soit pour l'exemple, "test_labinvent"
1778 263 Etienne Pallier
Syntaxe SQL : "create database test_labinvent"
1779 263 Etienne Pallier
1780 263 Etienne Pallier
3) Passer en mode "debug" 
1781 263 Etienne Pallier
Dans votre fichier de configuration labinvent.php, mettez votre paramètre "debug" à 1 ou 2 (mais pas à 0) :
1782 263 Etienne Pallier
		'debug' => 2,
1783 263 Etienne Pallier
1784 263 Etienne Pallier
4) Se connecter à l'application
1785 263 Etienne Pallier
Les test ne passeront pas si vous n'êtes pas connectés 
1786 263 Etienne Pallier
 
1787 263 Etienne Pallier
5) Exécuter les tests
1788 263 Etienne Pallier
1789 263 Etienne Pallier
a) Exécution depuis l'application (conseillé) :
1790 263 Etienne Pallier
ATTENTION : vous devez être logué pour que les tests passent !!!
1791 263 Etienne Pallier
Il suffit d'aller à l'URL /test.php de votre installation du logiciel LabInvent
1792 263 Etienne Pallier
(vous pouvez aussi essayer l'URL "/app/webroot/test.php", ou encore "/cakephp/test.php")
1793 263 Etienne Pallier
Cette page de tests se trouve dans cakephp/app/webroot/
1794 263 Etienne Pallier
Vous avez alors accès à 2 types de tests :
1795 263 Etienne Pallier
- App : Tests ==> les tests écris pour tester l'application Labinvent
1796 263 Etienne Pallier
- Core : Tests ==> les tests fournis avec cakephp pour tester le framework
1797 263 Etienne Pallier
Pour exécuter tous les tests liés à l'application Labinvent (à faire systématiquement avant de commiter tout changement) :
1798 263 Etienne Pallier
cliquer sur "Tests" sous "App", puis sur "AllTests"
1799 263 Etienne Pallier
("AllController" exécute tous les tests de controleurs ; "AllModel" exécute tous les tests de modèles)
1800 263 Etienne Pallier
1801 263 Etienne Pallier
b) Execution depuis la console :
1802 263 Etienne Pallier
Aller dans le repertoire app/
1803 263 Etienne Pallier
Pour tester le controleur MaterielsController :
1804 263 Etienne Pallier
./Console/cake test app Controller/MaterielsController
1805 263 Etienne Pallier
1806 263 Etienne Pallier
1807 263 Etienne Pallier
B - ECRITURE DE NOUVEAUX TESTS
1808 263 Etienne Pallier
1809 263 Etienne Pallier
cf http://book.cakephp.org/2.0/en/development/testing.html
1810 263 Etienne Pallier
1811 263 Etienne Pallier
Aller dans app/Test/
1812 263 Etienne Pallier
1813 263 Etienne Pallier
Ce dossier contient l'arborescence suivante :
1814 263 Etienne Pallier
1815 263 Etienne Pallier
- Case/ : les tests
1816 263 Etienne Pallier
	- Controller/ : les tests de controleurs
1817 263 Etienne Pallier
	- Model/ : les tests de modèles
1818 263 Etienne Pallier
	- View/ (peu ou pas utilisé) : les tests de vues (ou de helpers)
1819 263 Etienne Pallier
	- AllControllerTest.php : exécution de tous les tests de controleurs
1820 263 Etienne Pallier
	- AllModelTest.php : exécution de tous les tests de modèles
1821 263 Etienne Pallier
	- AllTestsTest.php : éxécution de TOUS les tests
1822 263 Etienne Pallier
	
1823 263 Etienne Pallier
- Fixture/ : les différentes initialisations nécessaires dans la BD de test pour pouvoir executer les tests
1824 263 Etienne Pallier
Ces "fixtures" sont automatiquement executees AU DEBUT de chaque test.
1825 263 Etienne Pallier
Ce dossier contient un fichier pour chaque table pour laquelle on a besoin d'une "fixture".
1826 263 Etienne Pallier
1827 263 Etienne Pallier
1) Les "fixtures"
1828 263 Etienne Pallier
1829 263 Etienne Pallier
La façon la plus basique de creer une fixture pour une table donnee est de la realiser automatiquement a partir d'une copie de la table de la vraie BD.
1830 263 Etienne Pallier
Par exemple, pour que la table "categories" de la BD de test contienne la meme chose que la table de la vraie BD, il suffit de creer un fichier CategorieFixture.php contenant ceci :
1831 263 Etienne Pallier
1832 263 Etienne Pallier
class CategorieFixture extends CakeTestFixture {
1833 263 Etienne Pallier
	public $import = array('model' => 'Categorie', 'records' => true);
1834 263 Etienne Pallier
}
1835 263 Etienne Pallier
1836 263 Etienne Pallier
Au demarrage des tests, cette table sera chargee automatiquement avec les vraies donnees.
1837 263 Etienne Pallier
A la fin des tests, cette table sera vidée.
1838 263 Etienne Pallier
	
1839 263 Etienne Pallier
Dans le cas particulier de la table "materiels", on prefere l'initialiser nous-memes avec des valeurs choisies.
1840 263 Etienne Pallier
Exemple d'une fixture avec 2 materiels (dans le fichier MaterielFixture.php) :
1841 263 Etienne Pallier
1842 263 Etienne Pallier
class MaterielFixture extends CakeTestFixture {
1843 263 Etienne Pallier
1844 263 Etienne Pallier
	public $import = 'Materiel'; // import only structure, no record
1845 263 Etienne Pallier
	
1846 263 Etienne Pallier
	public $records = array(
1847 263 Etienne Pallier
			array(
1848 263 Etienne Pallier
					'designation' => 'matos1', 
1849 263 Etienne Pallier
					'sur_categorie_id' => 1, 
1850 263 Etienne Pallier
					'categorie_id' => 11, 
1851 263 Etienne Pallier
					'materiel_administratif' => 0, 
1852 263 Etienne Pallier
					'materiel_technique' => 1, 
1853 263 Etienne Pallier
					'status' => 'CREATED', 
1854 263 Etienne Pallier
					'nom_createur' => 'Pallier Etienne', 
1855 263 Etienne Pallier
					'nom_modificateur' => 'Jean Administration', 
1856 263 Etienne Pallier
					'nom_responsable' => 'Jacques Utilisateur', 
1857 263 Etienne Pallier
					'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu', 
1858 263 Etienne Pallier
			),
1859 263 Etienne Pallier
			array(
1860 263 Etienne Pallier
					'designation' => 'matos2',
1861 1 Etienne Pallier
					'sur_categorie_id' => 1,
1862 263 Etienne Pallier
					'categorie_id' => 11,
1863 263 Etienne Pallier
					'materiel_administratif' => 0,
1864 263 Etienne Pallier
					'materiel_technique' => 1,
1865 263 Etienne Pallier
					'status' => 'CREATED',
1866 263 Etienne Pallier
					'nom_createur' => 'Pallier Etienne',
1867 263 Etienne Pallier
					'nom_modificateur' => 'Jean Administration',
1868 263 Etienne Pallier
					'nom_responsable' => 'Jacques Utilisateur',
1869 263 Etienne Pallier
					'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu',
1870 263 Etienne Pallier
			),
1871 263 Etienne Pallier
	);
1872 263 Etienne Pallier
} 
1873 263 Etienne Pallier
1874 263 Etienne Pallier
1875 263 Etienne Pallier
2) Les tests
1876 263 Etienne Pallier
1877 263 Etienne Pallier
Prenons l'exemple des tests ecrits pour le controleur des materiels (MaterielsController). Il devra s'appeler MaterielsControllerTest et aura la structure suivante :
1878 263 Etienne Pallier
1879 263 Etienne Pallier
class MaterielsControllerTest extends ControllerTestCase {
1880 263 Etienne Pallier
1881 263 Etienne Pallier
	// Liste des fixtures à charger avant l'execution des tests
1882 263 Etienne Pallier
	public $fixtures = array('app.materiel', 'app.sur_categorie', 'app.categorie', 'app.sous_categorie', 
1883 263 Etienne Pallier
			'app.groupes_thematique', 'app.groupes_metier', 'app.suivi', 'app.emprunt'
1884 263 Etienne Pallier
	);
1885 263 Etienne Pallier
	
1886 263 Etienne Pallier
	// Initialisations diverses a faire avant chaque test
1887 263 Etienne Pallier
	public function setUp() {
1888 263 Etienne Pallier
		parent::setUp();
1889 263 Etienne Pallier
	}
1890 263 Etienne Pallier
	
1891 263 Etienne Pallier
	// un 1er test	
1892 263 Etienne Pallier
	public function testMonPremier() {
1893 263 Etienne Pallier
		$result = $this->testAction(...);
1894 263 Etienne Pallier
		$this->assert...('resultat attendu', $result);
1895 263 Etienne Pallier
	}
1896 263 Etienne Pallier
1897 263 Etienne Pallier
	// un 2eme test
1898 263 Etienne Pallier
	public function testMonDeuxieme() {
1899 263 Etienne Pallier
		$result = $this->testAction(...);
1900 263 Etienne Pallier
		$this->assert...('resultat attendu', $result);
1901 263 Etienne Pallier
	}
1902 263 Etienne Pallier
1903 263 Etienne Pallier
	...
1904 263 Etienne Pallier
1905 263 Etienne Pallier
}	
1906 263 Etienne Pallier
	
1907 263 Etienne Pallier
Voir le vrai fichier Test/Case/Controller/MaterielsControllerTest.php
1908 263 Etienne Pallier
1909 263 Etienne Pallier
1910 263 Etienne Pallier
3) Execution
1911 263 Etienne Pallier
1912 263 Etienne Pallier
Exemple avec l'execution du test MaterielsControllerTest
1913 263 Etienne Pallier
1914 263 Etienne Pallier
a) Execution depuis le site web : 
1915 263 Etienne Pallier
/test.php?case=Controller%2FMaterielsController
1916 263 Etienne Pallier
Ajouter &debug=1 à l'url pour voir tous les messages de debug
1917 263 Etienne Pallier
1918 263 Etienne Pallier
b) Execution depuis la console :
1919 263 Etienne Pallier
Dans le repertoire app : ./Console/cake test app Controller/MaterielsController
1920 263 Etienne Pallier
Ajouter --debug pour voir tous les messages de debug
1921 263 Etienne Pallier
1922 263 Etienne Pallier
1923 263 Etienne Pallier
1924 264 Etienne Pallier
1925 263 Etienne Pallier
* *DATE PICKERS*
1926 263 Etienne Pallier
1927 263 Etienne Pallier
Pour fontionner, le datePicker fait appel dans la page "View/Layout/default" à 3 scripts (jquery-1.5.2.js, jquery-1.8.12.js, DatepickerConfig.js)
1928 263 Etienne Pallier
présents dans le repertoire "webroot/js/" et à un fichier "Theme" (smoothness.css) présent dans le repertoire "webroot/css/"
1929 263 Etienne Pallier
1930 263 Etienne Pallier
Le thème global peut très facilement être changé en téléchargeant le fichier css de son choix, à cette adresse: "http://jqueryui.com/themeroller/"
1931 263 Etienne Pallier
et en remplaçant celui se trouvant dans "webroot/css/"
1932 263 Etienne Pallier
1933 263 Etienne Pallier
Les options du datePicker sont modifiables dans le fichier "webroot/js/DatepickerConfig.js" et sont assez explicites.
1934 263 Etienne Pallier
Malgré cela, pour plus de précisions, la doc est facilement consultable à cette adresse: "http://jqueryui.com/datepicker/"
1935 263 Etienne Pallier
1936 263 Etienne Pallier
1937 263 Etienne Pallier
1938 263 Etienne Pallier
1939 263 Etienne Pallier
---
1940 211 Thibaud Ajas
1941 211 Thibaud Ajas
h2. %{margin-left:0px; font-weight:bold; font-size:25px;  display:block; color:red;}A L'ATTENTION DES UTILISATEURS D'ECLIPSE%
1942 1 Etienne Pallier
1943 1 Etienne Pallier
*+0) Installer Eclipse (Si nécessaire), voire Java+*
1944 211 Thibaud Ajas
1945 211 Thibaud Ajas
En effet, même si la version que vous allez installer est une version pour PHP, Eclipse à besoin de Java pour pouvoir s'exécuter.
1946 211 Thibaud Ajas
Vérifiez que Java soit bien installé sur votre système :
1947 211 Thibaud Ajas
<pre>
1948 1 Etienne Pallier
java -version
1949 211 Thibaud Ajas
</pre>
1950 211 Thibaud Ajas
Si ce n'est pas le cas, exécutez les lignes suivantes :
1951 211 Thibaud Ajas
<pre>
1952 211 Thibaud Ajas
sudo apt-add-repository ppa:webupd8team/java
1953 212 Etienne Pallier
sudo apt-get update
1954 211 Thibaud Ajas
sudo apt-get install oracle-java8-installer
1955 211 Thibaud Ajas
</pre>
1956 211 Thibaud Ajas
1957 211 Thibaud Ajas
Pour installer Eclipse, allez sur : http://www.eclipse.org/downloads/packages/release/Neon/3
1958 211 Thibaud Ajas
Selectionnez la version que vous désirez (Neon, Oxygen, Mars ...) puis sélectionnez "Eclipse for PHP Developers".
1959 211 Thibaud Ajas
Téléchargez la version correspondant à votre système d'exploitation.
1960 211 Thibaud Ajas
Placez-vous dans le dossier ou vou voulez installer Eclipse avec l'archive précédement téléchargée (renommez-la en eclipse.tar.gz), puis exécutez la commande suivante :
1961 211 Thibaud Ajas
<pre>
1962 211 Thibaud Ajas
tar -zxvf eclipse.tar.gz
1963 211 Thibaud Ajas
</pre>
1964 211 Thibaud Ajas
1965 211 Thibaud Ajas
Si vous voulez Eclipse dans le menu des applications sous Ubuntu, il vous faudra crééer le fichier eclipse.desktop :
1966 211 Thibaud Ajas
<pre>
1967 211 Thibaud Ajas
gksudo gedit /usr/share/applications/eclipse.desktop
1968 211 Thibaud Ajas
</pre>
1969 211 Thibaud Ajas
puis collez-y ce qui suit, en modifiant le chemin des lignes Exec et Icon au besoin :
1970 211 Thibaud Ajas
<pre>
1971 1 Etienne Pallier
[Desktop Entry]
1972 202 Thibaud Ajas
Name=Eclipse 
1973 1 Etienne Pallier
Type=Application
1974 1 Etienne Pallier
Exec=/opt/eclipse/eclipse
1975 1 Etienne Pallier
Terminal=false
1976 1 Etienne Pallier
Icon=/opt/eclipse/icon.xpm
1977 1 Etienne Pallier
Comment=Integrated Development Environment
1978 1 Etienne Pallier
NoDisplay=false
1979 202 Thibaud Ajas
Categories=Development;IDE
1980 1 Etienne Pallier
Name[en]=eclipse.desktop
1981 200 Thibaud Ajas
</pre>
1982 200 Thibaud Ajas
1983 1 Etienne Pallier
Puis donnez les droits à tous les utilisateurs sur ce fichier :
1984 1 Etienne Pallier
<pre>
1985 1 Etienne Pallier
sudo chmod a+r /usr/share/applications/eclipse.desktop
1986 1 Etienne Pallier
</pre>
1987 1 Etienne Pallier
1988 1 Etienne Pallier
*+1) Désactiver la vérification du certificat+*
1989 1 Etienne Pallier
1990 1 Etienne Pallier
Window -> Preferences -> Team -> git -> configuration -> Add entry
1991 1 Etienne Pallier
1992 1 Etienne Pallier
Key = http.sslVerify
1993 1 Etienne Pallier
Value = false
1994 1 Etienne Pallier
1995 1 Etienne Pallier
*+2) Récupérer le projet+*
1996 1 Etienne Pallier
1997 1 Etienne Pallier
*(Si le projet git n'existe pas déjà sur votre machine)*
1998 1 Etienne Pallier
1999 1 Etienne Pallier
File/Import project from git
2000 1 Etienne Pallier
2001 200 Thibaud Ajas
Select repository source: Clone URI: https://gitlab.irap.omp.eu/epallier/labinvent.git
2002 1 Etienne Pallier
2003 200 Thibaud Ajas
Directory: 
2004 200 Thibaud Ajas
- par défaut, il propose : /Users/epallier/git/labinvent
2005 200 Thibaud Ajas
- mais on peut le mettre n'importe où ailleurs, 
2006 1 Etienne Pallier
par exemple, on pourrait le mettre directement dans le repertoire web de Apache:
2007 200 Thibaud Ajas
/Applications/XAMPP/xamppfiles/htdocs 
2008 1 Etienne Pallier
(si on veut que le projet s'execute directement dans le dossier web apache htdocs, mais ca n'est pas obligatoire...)
2009 200 Thibaud Ajas
2010 200 Thibaud Ajas
initial branch: master
2011 1 Etienne Pallier
remote name: origin
2012 200 Thibaud Ajas
2013 200 Thibaud Ajas
Import as general project
2014 200 Thibaud Ajas
2015 200 Thibaud Ajas
Project name: LABINVENT
2016 202 Thibaud Ajas
2017 200 Thibaud Ajas
*(si le projet git existe déjà sur votre machine)*
2018 1 Etienne Pallier
2019 1 Etienne Pallier
File/Import project from git
2020 1 Etienne Pallier
    
2021 1 Etienne Pallier
Existing local repository
2022 1 Etienne Pallier
2023 1 Etienne Pallier
Directory
2024 1 Etienne Pallier
2025 1 Etienne Pallier
ADD => Selectionnez le dossier contenant le projet git => Finish => Next
2026 1 Etienne Pallier
2027 1 Etienne Pallier
Import existing Eclipse project
2028 1 Etienne Pallier
2029 1 Etienne Pallier
Selectionner le projet => Search for nested project => finish
2030 1 Etienne Pallier
2031 1 Etienne Pallier
2032 1 Etienne Pallier
*+3) Configurer le projet+*
2033 1 Etienne Pallier
2034 1 Etienne Pallier
a) S'assurer que le projet est bien reconnu comme un projet PHP (il doit y avoir un petit "P" sur le dossier racine du projet)
2035 1 Etienne Pallier
Si ça n'est pas le cas, vérifier que le fichier .project (à la racine) contient bien
2036 1 Etienne Pallier
	<natures>
2037 1 Etienne Pallier
		<nature>org.eclipse.php.core.PHPNature</nature>
2038 1 Etienne Pallier
	</natures>
2039 1 Etienne Pallier
NB : Le fichier .project est normalement versionné et donc le projet labinvent devrait être reconnu automatiquement comme projet PHP
2040 1 Etienne Pallier
2041 1 Etienne Pallier
2042 1 Etienne Pallier
b) S'assurer que les fichiers de vue de cakephp ("*.ctp") sont bien reconnus comme des fichiers PHP.
2043 1 Etienne Pallier
Pour tester cela, ouvrir le fichier de vue cakephp/app/View/Categories/get_all.ctp
2044 1 Etienne Pallier
Si ce fichier s'ouvre comme un simple fichier texte, c'est qu'il n'est pas reconnu par Eclipse comme un fichier Php. 
2045 1 Etienne Pallier
Il faut donc associer l'editeur Php a l'extension de fichier "*.ctp" :
2046 1 Etienne Pallier
- Preferences/General/Content types
2047 1 Etienne Pallier
- Dans la liste "Content types", ouvrir la section "Text", selectionner PHP
2048 1 Etienne Pallier
- Ajouter l'extension "*.ctp"
2049 1 Etienne Pallier
2050 1 Etienne Pallier
c) Vérifier la version de php utilisée (il serait préférable d'utiliser la meme version que celle officiellement utilisée par le logiciel, c'est à dire php 5.6, mais attention, le serveur IRAP utilise toujours une version 5.3 pour inventirap) :
2051 1 Etienne Pallier
- Clic-droit sur le projet, Propriétés
2052 1 Etienne Pallier
- PHP
2053 1 Etienne Pallier
- Interpreter
2054 1 Etienne Pallier
- Enable project specific settings, PHP Version : "PHP 5.6"
2055 1 Etienne Pallier
2056 1 Etienne Pallier
d) S'assurer que le texte est bien encodé en UTF-8 par défaut :
2057 1 Etienne Pallier
clic-droit sur le dossier racine du projet (dans PHP Explorer), Properties, Resource : dans la zone "Text file encoding" cocher "Other" et sélectionner UTF-8
2058 1 Etienne Pallier
(
2059 1 Etienne Pallier
Il faudrait commiter ça mais je ne sais pas trop si c'est risqué ou pas.
2060 1 Etienne Pallier
Les fichiers concernés sont :
2061 219 Thibaud Ajas
- .project (déjà versionné) : car il commence par la ligne "<?xml version="1.0" encoding="UTF-8"?>"
2062 219 Thibaud Ajas
- mais c'est surtout celui-ci qui compte (actuellement ignoré de git) : .settings/org.eclipse.core.resources.prefs : car sa 2eme ligne est "encoding/<project>=UTF-8"
2063 219 Thibaud Ajas
)
2064 1 Etienne Pallier
2065 1 Etienne Pallier
Les éléments suivants sont normalement DEJA ignorés par git, à vérifier :
2066 1 Etienne Pallier
- .settings/
2067 1 Etienne Pallier
- cakephp/app/tmp/ : tout sauf 
2068 1 Etienne Pallier
	- documents/
2069 1 Etienne Pallier
- cakephp/app/Config/ :
2070 1 Etienne Pallier
	- database.php
2071 1 Etienne Pallier
	- labinvent.php
2072 1 Etienne Pallier
2073 1 Etienne Pallier
2074 1 Etienne Pallier
2075 1 Etienne Pallier
2076 1 Etienne Pallier
2077 1 Etienne Pallier
---
2078 1 Etienne Pallier
2079 1 Etienne Pallier
2080 1 Etienne Pallier
<pre>
2081 1 Etienne Pallier
*********************************************************
2082 1 Etienne Pallier
REMARQUES INTERRESSANTES (MAIS VOUS POUVEZ LES IGNORER)
2083 1 Etienne Pallier
2084 1 Etienne Pallier
// DEBUT DES REMARQUES
2085 1 Etienne Pallier
2086 1 Etienne Pallier
A la racine du projet, j'ai plusieurs éléments cachés de configuration Eclipse :
2087 1 Etienne Pallier
2088 1 Etienne Pallier
1) fichier .buildpath 
2089 1 Etienne Pallier
Il est versionné puisque "svn status .buildpath" (depuis la console) ne donne rien
2090 1 Etienne Pallier
Il contient :
2091 1 Etienne Pallier
2092 1 Etienne Pallier
<?xml version="1.0" encoding="UTF-8"?>
2093 1 Etienne Pallier
<buildpath>
2094 1 Etienne Pallier
        <buildpathentry kind="con" path="org.eclipse.php.core.LANGUAGE"/>
2095 1 Etienne Pallier
        <buildpathentry kind="lib" path="docs/mockup/mockup_html.zip"/>
2096 1 Etienne Pallier
        <buildpathentry kind="src" path="cakephp"/>
2097 1 Etienne Pallier
</buildpath>
2098 1 Etienne Pallier
2099 1 Etienne Pallier
2) fichier .project
2100 1 Etienne Pallier
Il est déjà versionné
2101 1 Etienne Pallier
Il contient :
2102 1 Etienne Pallier
<?xml version="1.0" encoding="UTF-8"?>
2103 1 Etienne Pallier
<projectDescription>
2104 1 Etienne Pallier
        <name>invirap</name>
2105 1 Etienne Pallier
        <comment></comment>
2106 1 Etienne Pallier
        <projects>
2107 1 Etienne Pallier
        </projects>
2108 1 Etienne Pallier
        <buildSpec>
2109 1 Etienne Pallier
                <buildCommand>
2110 1 Etienne Pallier
                        <name>org.eclipse.wst.common.project.facet.core.builder</name>
2111 1 Etienne Pallier
                        <arguments>
2112 1 Etienne Pallier
                        </arguments>
2113 1 Etienne Pallier
                </buildCommand>
2114 1 Etienne Pallier
                <buildCommand>
2115 1 Etienne Pallier
                        <name>org.eclipse.wst.validation.validationbuilder</name>
2116 1 Etienne Pallier
                        <arguments>
2117 1 Etienne Pallier
                        </arguments>
2118 1 Etienne Pallier
                </buildCommand>
2119 1 Etienne Pallier
                <buildCommand>
2120 1 Etienne Pallier
                        <name>org.eclipse.dltk.core.scriptbuilder</name>
2121 1 Etienne Pallier
                        <arguments>
2122 1 Etienne Pallier
                        </arguments>
2123 1 Etienne Pallier
                </buildCommand>
2124 1 Etienne Pallier
        </buildSpec>
2125 1 Etienne Pallier
        <natures>
2126 1 Etienne Pallier
                <nature>org.eclipse.php.core.PHPNature</nature>
2127 1 Etienne Pallier
                <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
2128 1 Etienne Pallier
        </natures>
2129 1 Etienne Pallier
</projectDescription>
2130 1 Etienne Pallier
2131 1 Etienne Pallier
3) dossier .settings/ (exclus de svn)
2132 1 Etienne Pallier
Il contient 3 fichiers :
2133 1 Etienne Pallier
2134 1 Etienne Pallier
- org.eclipse.core.resources.prefs : bizarrement, il ne contient que quelques références seulement :
2135 1 Etienne Pallier
eclipse.preferences.version=1
2136 1 Etienne Pallier
encoding//cakephp/app/Controller/MaterielsController.php=UTF-8
2137 1 Etienne Pallier
encoding//cakephp/app/View/Elements/menu_view.ctp=UTF-8
2138 1 Etienne Pallier
encoding//cakephp/app/View/Layouts/default.ctp=UTF-8
2139 1 Etienne Pallier
encoding//cakephp/app/View/Materiels/index.ctp=UTF-8
2140 1 Etienne Pallier
encoding//cakephp/app/View/Materiels/scaffold.view.ctp=UTF-8
2141 1 Etienne Pallier
encoding//database/Upd_TableConstraints.sql=UTF-8
2142 1 Etienne Pallier
encoding//database/update/README.txt=UTF-8
2143 1 Etienne Pallier
encoding//docs/HOWTO.txt=UTF-8
2144 1 Etienne Pallier
encoding//install/HOWTO.txt=UTF-8
2145 1 Etienne Pallier
encoding/<project>=UTF-8
2146 1 Etienne Pallier
2147 1 Etienne Pallier
- org.eclipse.php.core.prefs
2148 200 Thibaud Ajas
eclipse.preferences.version=1
2149 1 Etienne Pallier
include_path=0;/invirap\u00051;/invirap/docs/mockup/mockup_html.zip
2150 1 Etienne Pallier
2151 1 Etienne Pallier
- org.eclipse.wst.common.project.facet.core.xml : sans doute inutile ? (lié à "Faceted Project Validation Builder" dans Properties/Builders)
2152 1 Etienne Pallier
<?xml version="1.0" encoding="UTF-8"?>
2153 200 Thibaud Ajas
<faceted-project>
2154 200 Thibaud Ajas
  <fixed facet="php.core.component"/>
2155 200 Thibaud Ajas
  <fixed facet="php.component"/>
2156 1 Etienne Pallier
  <installed facet="php.core.component" version="1"/>
2157 1 Etienne Pallier
  <installed facet="php.component" version="5.4"/>
2158 1 Etienne Pallier
</faceted-project>
2159 1 Etienne Pallier
2160 1 Etienne Pallier
// FIN DES REMARQUES
2161 1 Etienne Pallier
*********************************************************
2162 200 Thibaud Ajas
</pre>
2163 1 Etienne Pallier
2164 1 Etienne Pallier
*+4) (TODO:) Set Code style+*
2165 200 Thibaud Ajas
2166 1 Etienne Pallier
Window/Preferences : PHP / Editor
2167 1 Etienne Pallier
...
2168 1 Etienne Pallier
2169 1 Etienne Pallier
*+5) (TODO:) virtualenv+*
2170 1 Etienne Pallier
2171 1 Etienne Pallier
Now, once the PHP5 virtual environment is installed (see above),
2172 1 Etienne Pallier
set it in Eclipse as the project interpreter:
2173 1 Etienne Pallier
2174 1 Etienne Pallier
(cf http://virtphp.org)
2175 1 Etienne Pallier
2176 1 Etienne Pallier
...
2177 1 Etienne Pallier
2178 1 Etienne Pallier
*+6) (TODO:) Test+*
2179 1 Etienne Pallier
2180 1 Etienne Pallier
2181 1 Etienne Pallier
*+7) (TODO:) Run+*
2182 1 Etienne Pallier
2183 292 Thibaud Ajas
check http://localhost:8080/
2184 292 Thibaud Ajas
2185 292 Thibaud Ajas
2186 292 Thibaud Ajas
---
2187 292 Thibaud Ajas
2188 293 Thibaud Ajas
h2. Installer un serveur LDAP et un serveur web sur deux VMs différentes
2189 298 Etienne Pallier
2190 293 Thibaud Ajas
Si vous êtes là c'est que vous avez déjà une VM avec votre serveur web, sinon je vous renvoie à la page d'installation du serveur web :
2191 293 Thibaud Ajas
> https://projects.irap.omp.eu/projects/inventirap/wiki/Installation
2192 293 Thibaud Ajas
2193 293 Thibaud Ajas
Ceci est une VM LDAP déjà installée et configurée (si vous en avez pas déjà) :
2194 293 Thibaud Ajas
> https://www.turnkeylinux.org/openldap
2195 293 Thibaud Ajas
2196 293 Thibaud Ajas
Après avoir installer vos deux VMs, on va les configurer.
2197 299 Thibaud Ajas
2198 293 Thibaud Ajas
Par la suite, j'utiliserais ces termes pour éviter de tout réécrire à chaque fois :
2199 293 Thibaud Ajas
> Machine hôte = Machine physique avec laquelle vous travaillez
2200 293 Thibaud Ajas
> VM_1 = Machine virtuelle qui héberge votre serveur Web/Apache/MySQL ...
2201 293 Thibaud Ajas
> VM_2 = Machine virtuelle qui héberge votre serveur LDAP
2202 293 Thibaud Ajas
2203 293 Thibaud Ajas
La configuration qui a servi a réaliser ce tutoriel :
2204 293 Thibaud Ajas
> Machine hôte : Windows 7 Pro 64bits
2205 293 Thibaud Ajas
> VM_1 : Ubuntu 14.04.5 32bits
2206 293 Thibaud Ajas
> VM_2 : TURNKEY OPENLDAP 64bits
2207 293 Thibaud Ajas
2208 293 Thibaud Ajas
*A faire sur la machine hôte :*
2209 293 Thibaud Ajas
2210 293 Thibaud Ajas
Configuration des 2 cartes réseau de la VM_1 :
2211 293 Thibaud Ajas
2212 293 Thibaud Ajas
_Carte n°1 :_
2213 293 Thibaud Ajas
2214 293 Thibaud Ajas
> Activer la carte réseau
2215 293 Thibaud Ajas
> Mode d'accès : NAT
2216 293 Thibaud Ajas
> 
2217 293 Thibaud Ajas
> (Si vous voulez pouvoir utiliser votre serveur web depuis votre machine hôte)
2218 293 Thibaud Ajas
> 
2219 293 Thibaud Ajas
> -> Avancé -> Redirection de ports
2220 293 Thibaud Ajas
> 
2221 293 Thibaud Ajas
> Ajoutez une règle de redirection :
2222 293 Thibaud Ajas
> IP hôte : 127.0.0.1
2223 293 Thibaud Ajas
> Port hôte : 8080
2224 293 Thibaud Ajas
> Port invité : 80
2225 293 Thibaud Ajas
> (Le reste n'y touchez pas)
2226 296 Thibaud Ajas
2227 296 Thibaud Ajas
(Un exemple)
2228 296 Thibaud Ajas
!Config_carte1_VM_1.png!
2229 293 Thibaud Ajas
2230 293 Thibaud Ajas
_Carte n°2 :_
2231 293 Thibaud Ajas
2232 293 Thibaud Ajas
> Activer la carte réseau
2233 293 Thibaud Ajas
> Mode d'accès : Réseau interne
2234 293 Thibaud Ajas
> Nom : Connexion_LDAP (ceci est un exemple, mettez ce que vous voulez)
2235 293 Thibaud Ajas
> -> Avancé
2236 293 Thibaud Ajas
> Mode Promiscuité : Tout autoriser
2237 296 Thibaud Ajas
2238 296 Thibaud Ajas
(Un exemple)
2239 296 Thibaud Ajas
!Config_carte2_VM_1.png!
2240 293 Thibaud Ajas
2241 293 Thibaud Ajas
Configuration de la carte réseau de la VM_2 :
2242 293 Thibaud Ajas
2243 293 Thibaud Ajas
_Carte n°1 :_
2244 293 Thibaud Ajas
2245 293 Thibaud Ajas
> Activer la carte réseau
2246 293 Thibaud Ajas
> Mode d'accès : Réseau interne
2247 293 Thibaud Ajas
> Nom : Connexion_LDAP (ceci est un exemple, mettez ce que vous voulez, faut juste que ce soit le même que celui de la carte 2 de la VM_1)
2248 293 Thibaud Ajas
> -> Avancé
2249 296 Thibaud Ajas
> Mode Promiscuité : Tout autoriser
2250 296 Thibaud Ajas
2251 296 Thibaud Ajas
(Un exemple)
2252 293 Thibaud Ajas
!Config_carte1_VM_2.png!
2253 293 Thibaud Ajas
2254 293 Thibaud Ajas
Voila, on est bon pour la machine hôte, maintenant on passe à la configuration des VMs.
2255 293 Thibaud Ajas
2256 293 Thibaud Ajas
*A faire sur la VM_1 :*
2257 293 Thibaud Ajas
2258 293 Thibaud Ajas
Carte réseau n°1 : Adresse IPv4 : Méthode d’obtention : DHCP
2259 293 Thibaud Ajas
2260 293 Thibaud Ajas
Carte réseau n°2 : Adresse IPv4 : Méthode d’obtention : Manuelle :
2261 293 Thibaud Ajas
> Adress (Adresse): 192.168.1.2
2262 293 Thibaud Ajas
> Netmask (Masque de sous-réseau) : 255.255.255.0
2263 293 Thibaud Ajas
> Gateway (Passerelle) : 255.255.255.0
2264 297 Thibaud Ajas
2265 299 Thibaud Ajas
Cela devrait ressembler plus ou moins à ceci :
2266 297 Thibaud Ajas
!Config_cartes_reseau_VM_1.png!
2267 297 Thibaud Ajas
2268 297 Thibaud Ajas
*A faire sur la VM_2 :*
2269 297 Thibaud Ajas
2270 297 Thibaud Ajas
-> Advanced Menu -> Networking -> StaticIP
2271 297 Thibaud Ajas
> IP Adress : 192.168.1.3
2272 297 Thibaud Ajas
> Netmask : 255.255.255.0
2273 297 Thibaud Ajas
> (laissez le reste vide)
2274 297 Thibaud Ajas
-> Apply
2275 297 Thibaud Ajas
2276 297 Thibaud Ajas
Cela devrait ressembler à ça :
2277 297 Thibaud Ajas
!Config_carte_reseau_VM_2.png!
2278 297 Thibaud Ajas
2279 300 Thibaud Ajas
Et voila, maintenant pour accéder à votre site depuis votre machine hôte, rendez-vous à l'adresse 127.0.0.1:8080 dans votre navigateur préféré.
2280 300 Thibaud Ajas
Pour ce qui est du LDAP, les adresses vous sont données en page d'accueil lorsque vous lancez votre VM LDAP. Sachez cependant que votre machine hôte ne pourra en aucun cas communiquer avec la VM LDAP, et vice-versa. Le LDAP, quand à lui, n'aura aucun accès à internet.
2281 297 Thibaud Ajas
2282 297 Thibaud Ajas
2283 1 Etienne Pallier
---