Developpement

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