nyroFwk, Framework PHP - Présentation
par Nyro, Lundi 10 Mai 2010 à 15:11:14 :: Programmation
Ceci est un brouillon d'introducion à la documentation de nyroFwk. Toutes remarques, suggestions ou questions pour l'améliorer est la bienvenue !
Vendredi dernier, j'ai mis en ligne l'API et le svn (user : anon / passe : anon) de nyroFwk.
Bon c'est très bien tout ça, mais qu'est-ce que c'est ?
Pour commencer, petit extrai de wikipedia : Un framework est un kit de composants logiciels structurels, qui définissent les fondations ainsi que les grandes lignes de l'organisation de tout ou partie d'un logiciel.
Oui, mais des frameworks PHP, il en existe des tas, non ?
Oui, on peut signaler symfony, Zend Framework et CakePHP ici. J'ai testé ces 3 là plus ou moins fortement. Chacun a ses avantages et ses inconvénients. Mais aucun ne répondait exactement à mes besoins et habitudes de développements. Alors quand quelque chose ne me convient pas, moi, je le refais, tout simplement (comme nyroModal par exemple)
Alors qu'est-ce que je n'aime pas ou j'aime dans ces frameworks ?
Dans mon framework, chaque objet a sa propre configuration, qui hérite de toutes la configuration de ses parents. Chaque configuration est définie de base par le framework mais est modifiable pour chaque site très simplement. Suivant les besoins, on peut aussi modifier la configuration de chaque classe suivant le controller (front ou admin). Prenons un exemple, plus parlant. La classe response_http_html gère tout ce qui sera envoyé au navigateur lorsque la page demandée est en HTML. Elle hérite de la classe reponse_http, qui elle hérite de la classe reponse_abstract qui hérite de object. La définition de cette classe est dans le fichier nyro/response/http/html.class.php. Sa configuration est dans le fichier nyro/response/http/html.cfg.php est conteint (extrait) :
Cette configuration est là pour définir des éléments par défaut, mais doit bien évidemment être modifié pour chaque site. Pour ce faire, chaque site aura un dossier personnel dans lequel il doit définir ses classes propres aux sites, mais aussi toutes ces configurations. Ce dossier se nomme par défaut my dans nyroFwk et est placé juste à côté du dossier nyro.
Dans ce dossier propre à chaque site, on peut aussi redéfinir chaque classe de nyroFwk. En effet, à la demande de chaque classe, le framework va vérifier si le fichier correspondant à la classe existe dans le dossier my au bon endroit. Sinon, il cherchera dans le dossier de base du framework. Un mécanisme similaire est utilisé pour les configurations. Au lieu de remplacer la configuration, on va fusionner les configurations successives de la classe, en gardant bien sûr le plus spécifique. Par exemple, pour nyrodev.com, le fichier my/response/http/html.cfg.php ressemble à (extrait) :
Les configurations sont un point très important pour nyroFwk. C'est pourquoi il est possible de définir encore plus finement ces configurations. Tout d'abord, on peut spécifier le controller de la configuration si on veut être plus précis. Pour mon site, l'administration porte le nom de controller 'admin' et le site public 'front' (par défaut dans nyroFwk). Pour l'administration, on n'a pas besoin des meta description par exemple. C'est la raison pour laquelle le fichier de configuration du site public ne se nomme pas comme je l'ai indiqué plus haut, mais en réalité my/response/http/html.front.cfg.php. Vous avez remarquer le front en plus qui indique que l'on veut l'affciher que pour le site public. Juste à côté, le fichier my/response/http/html.admin.cfg.php existe pour définir les éléments pour l'administration.
Avec ce système, on a déjà quelque chose de tout à fait souple. Mais ce n'est pas fini ! nyroFwk gère les sites multilangues de base. Son fonctionnement est :
Et n'oubliez pas : les configurations sont successives et n'écrasent pas les autres configurations, aussi bien des classes parentes, mais aussi des configurations du controller et de langue. Ainsi, pour la classe response_http_html, la configuration est le résultat de la fusion des configurations (le plus bas étant le plus prédominant) :
Mais je dois créer un fichier pour chaque classe qui en a besoin ? Au début, c'était le cas oui. Mais je me suis aperçu que cela pouvoit devenir très vite long et fastidieux. Ce mécanisme existe toujours et est toujours utilisé car dans certains cas indispensable, mais il existe un autre moyen. En effet, la configuration de la classe nyro permet de modifier la configuration de n'importe quelle classe dans un seul et même fichier de configuration. Par exemple, on aurait pu définir les éléments montrés précédemment dans le fichier my/nyro.front.cfg.php de cette façon :
Vous avez d'ailleurs remarqué la classe object ? Toutes les classes instanciables héritent de cette classe, ce qui permet une gestion centralisée et uniforme des configurations et de la création des objets.
Bon, voilà déjà pour la configuration.
Pour revenir sur les fonctionnalités du framework, voici une liste (sans doute non exhaustive) de ce que gère pour l'instant nyroFwk :
Vendredi dernier, j'ai mis en ligne l'API et le svn (user : anon / passe : anon) de nyroFwk.
Bon c'est très bien tout ça, mais qu'est-ce que c'est ?
Pour commencer, petit extrai de wikipedia : Un framework est un kit de composants logiciels structurels, qui définissent les fondations ainsi que les grandes lignes de l'organisation de tout ou partie d'un logiciel.
Oui, mais des frameworks PHP, il en existe des tas, non ?
Oui, on peut signaler symfony, Zend Framework et CakePHP ici. J'ai testé ces 3 là plus ou moins fortement. Chacun a ses avantages et ses inconvénients. Mais aucun ne répondait exactement à mes besoins et habitudes de développements. Alors quand quelque chose ne me convient pas, moi, je le refais, tout simplement (comme nyroModal par exemple)
Alors qu'est-ce que je n'aime pas ou j'aime dans ces frameworks ?
- CakePHP : la gestion des bases de données et des objets associés. A l'époque où j'avais testé, on était obligé de modifier les objets lorsqu'on avait des relations entre différents objets. Et puis je n'ai jamais réussi a vraiment faire quelque chose de bien avec. Pas forcément réellement tout testé non plus, je dois bien l'avouer. Là où CakePHP marque des points, c'est dans la génération automatique de l'administration et toutes les fonctionnalités ajax super simple à implémenter.
- Zend Framework : Je ne l'ai jamais concrètement utilisé car il me paraissait trop énorme. Ce framework a absolument tout ce dont on peut rêver. L'organisation des fichiers, de la documentation et de tout ce qui va autour de ce framework est géniale.
- Symfony : c'est celui que j'ai le plus utilisé (et que j'utilsie encore). J'aime bien la génération automatique des objets de base de données, même si je trouve cela dommage de devoir regénérer ça à chaque modification de la base de donnée. J'aime pas le grand nombre de fichiers de configuration et encore moins tous les différents formats possibles. Pourquoi s'embetter et donc ralentire le processus avec des fichiers YAML alors qu'un simple tableau PHP fait très bien l'affaire ? La barre de débuggage peut être très utile. La séparation des classes de chaque controller pose problèmes ; dans certains cas, on est obligé de réécrire le code...
- Gestion simple de formulaire permettant d'ajouter des champs, de vérifier s'il est valide, de le remplir, de récupérer les valeurs, etc...
- Intégration des règles d'opitimisations de yahoo developper simplement et de base
- Gestion des images souples, rapide et efficace
- Intégration d'un éditeur WYSIWYG simple
- Gestion des fichiers envoyés par les utilsiateurs sécurisée (ie : possibilité de restreindre l'affichage de ces fichiers qu'aux utilsiateurs connectés)
- Tout est objet
Dans mon framework, chaque objet a sa propre configuration, qui hérite de toutes la configuration de ses parents. Chaque configuration est définie de base par le framework mais est modifiable pour chaque site très simplement. Suivant les besoins, on peut aussi modifier la configuration de chaque classe suivant le controller (front ou admin). Prenons un exemple, plus parlant. La classe response_http_html gère tout ce qui sera envoyé au navigateur lorsque la page demandée est en HTML. Elle hérite de la classe reponse_http, qui elle hérite de la classe reponse_abstract qui hérite de object. La définition de cette classe est dans le fichier nyro/response/http/html.class.php. Sa configuration est dans le fichier nyro/response/http/html.cfg.php est conteint (extrait) :
$cfg = array(On définit donc les balises meta par défaut de toutes les réponses HTML. A noter que la langue ici est dynamique sera en rapport avec la langue demandée par l'utilisateur (explications plus tard).
'meta'=>array(
'robots'=>'index, follow',
'description'=>'nyro project',
'keywords'=>'nyro, project',
'language'=>request::get('lang'),
),
);
Cette configuration est là pour définir des éléments par défaut, mais doit bien évidemment être modifié pour chaque site. Pour ce faire, chaque site aura un dossier personnel dans lequel il doit définir ses classes propres aux sites, mais aussi toutes ces configurations. Ce dossier se nomme par défaut my dans nyroFwk et est placé juste à côté du dossier nyro.
Dans ce dossier propre à chaque site, on peut aussi redéfinir chaque classe de nyroFwk. En effet, à la demande de chaque classe, le framework va vérifier si le fichier correspondant à la classe existe dans le dossier my au bon endroit. Sinon, il cherchera dans le dossier de base du framework. Un mécanisme similaire est utilisé pour les configurations. Au lieu de remplacer la configuration, on va fusionner les configurations successives de la classe, en gardant bien sûr le plus spécifique. Par exemple, pour nyrodev.com, le fichier my/response/http/html.cfg.php ressemble à (extrait) :
$cfg = array(Je redéfinis les balises meta title et description pour mon site public.
'meta'=>array(
'title'=>'nyroDev, Analyste Développeur Web (PHP, jQuery)',
'description'=>'Cédric Nirousset, nyroDev : Conception, Analyse et Développement de sites web (PHP, jQuery).',
),
);
Les configurations sont un point très important pour nyroFwk. C'est pourquoi il est possible de définir encore plus finement ces configurations. Tout d'abord, on peut spécifier le controller de la configuration si on veut être plus précis. Pour mon site, l'administration porte le nom de controller 'admin' et le site public 'front' (par défaut dans nyroFwk). Pour l'administration, on n'a pas besoin des meta description par exemple. C'est la raison pour laquelle le fichier de configuration du site public ne se nomme pas comme je l'ai indiqué plus haut, mais en réalité my/response/http/html.front.cfg.php. Vous avez remarquer le front en plus qui indique que l'on veut l'affciher que pour le site public. Juste à côté, le fichier my/response/http/html.admin.cfg.php existe pour définir les éléments pour l'administration.
Avec ce système, on a déjà quelque chose de tout à fait souple. Mais ce n'est pas fini ! nyroFwk gère les sites multilangues de base. Son fonctionnement est :
- On définit une langue par défaut
- On définit les langues disponibles
- Si l'URL demandé est du type : monsite.com/LANG/maPage avec LANG une langue définit, alors on passe dans la langue demandée.
$cfg = array(Ce mécanisme est utilisé à plusieurs endroits dans nyroFwk pour définir des messages à l'utilisateurs. Et comme vous l'avez remarques, ces fichiers sont de vrais fichier PHP. Donc rien ne vous empêchera, quand vous serez plus à l'aise avec le framework, d'utiliser des classes avec des fonctions statiques pour faire d'autres choses comme par exemple utiliser la base de donnée pour modifier ces éléments...
'meta'=>array(
'title'=>'nyroDev, Analyst Developper Web (english) (PHP, jQuery)',
'description'=>'Cédric Nirousset, nyroDev: Conception, Analysis and Development of websites (PHP, jQuery).',
),
);
Et n'oubliez pas : les configurations sont successives et n'écrasent pas les autres configurations, aussi bien des classes parentes, mais aussi des configurations du controller et de langue. Ainsi, pour la classe response_http_html, la configuration est le résultat de la fusion des configurations (le plus bas étant le plus prédominant) :
- nyro/object.cfg.php
- nyro/object.fr.cfg.php
- nyro/object.front.cfg.php
- nyro/object.front.fr.cfg.php
- my/object.cfg.php
- my/object.fr.cfg.php
- my/object.front.cfg.php
- my/object.front.fr.cfg.php
- nyro/response_abstract.cfg.php
- nyro/response_abstract.fr.cfg.php
- nyro/response_abstract.front.cfg.php
- nyro/response_abstract.front.fr.cfg.php
- my/response_abstract.cfg.php
- my/response_abstract.fr.cfg.php
- my/response_abstract.front.cfg.php
- my/response_abstract.front.fr.cfg.php
- nyro/response_http.cfg.php
- nyro/response_http.fr.cfg.php
- nyro/response_http.front.cfg.php
- nyro/response_http.front.fr.cfg.php
- my/response_http.cfg.php
- my/response_http.fr.cfg.php
- my/response_http.front.cfg.php
- my/response_http.front.fr.cfg.php
- nyro/response_http_html.cfg.php
- nyro/response_http_html.fr.cfg.php
- nyro/response_http_html.front.cfg.php
- nyro/response_http_html.front.fr.cfg.php
- my/response_http_html.cfg.php
- my/response_http_html.fr.cfg.php
- my/response_http_html.front.cfg.php
- my/response_http_html.front.fr.cfg.php
Mais je dois créer un fichier pour chaque classe qui en a besoin ? Au début, c'était le cas oui. Mais je me suis aperçu que cela pouvoit devenir très vite long et fastidieux. Ce mécanisme existe toujours et est toujours utilisé car dans certains cas indispensable, mais il existe un autre moyen. En effet, la configuration de la classe nyro permet de modifier la configuration de n'importe quelle classe dans un seul et même fichier de configuration. Par exemple, on aurait pu définir les éléments montrés précédemment dans le fichier my/nyro.front.cfg.php de cette façon :
$cfg = array(Cette configuration est utilisé en dernier lieu pour créer la configuration de chaque classe.
'response_http_html'=>array(
'meta'=>array(
'title'=>'nyroDev, Analyst Developper Web (english) (PHP, jQuery)',
'description'=>'Cédric Nirousset, nyroDev: Conception, Analysis and Development of websites (PHP, jQuery).',
),
),
'une_autre_classe'=>array(
'uneAutreConfig'=>'yeah'
),
);
Vous avez d'ailleurs remarqué la classe object ? Toutes les classes instanciables héritent de cette classe, ce qui permet une gestion centralisée et uniforme des configurations et de la création des objets.
Bon, voilà déjà pour la configuration.
Pour revenir sur les fonctionnalités du framework, voici une liste (sans doute non exhaustive) de ce que gère pour l'instant nyroFwk :
- Programmation orientée objet
- Configuration avancée et très souple des classes
- Gestion des sites multilingues
- Gestion des bases de données multilingues avec récupération automatique des données propre à la langue
- Configuration de base de donénes multiples
- Gestion des utilsiateurs et de leur connexion, vérifications des accès, etc...
- Gestion des formulaires avancées et souples : validation, affichage, etc...
- Manipulation des images simplement, avec souplesse et efficacement
- Création de formulaires directement depuis la structure de la base de données (gestion des données liées et en relation)
- Création de l'administration automatique
- Minimisation en un seul fichier compressé des fichiers JavaScript et CSS nécessaire à la page
- Application d'un maximum de règle d'optimisations données par Yahoo
- Barre de débogage
- Editeur WYSIWYG (tinyMce) très simplement intégrable
- jQuery et jQuery UI intégré
- Ajax ready : différents templates s'il s'agit d'une requêtes ajax
- Extensibilité simple et accrue : tout peut être redéfini
- etc...
Commentaires.
1. le Lundi 10 Mai 2010 à 15:39:38, par Screu
2. le Jeudi 27 Mai 2010 à 12:15:20, par Baltos
3. le Mercredi 03 Novembre 2010 à 21:07:23, par tof
4. le Mardi 22 Novembre 2011 à 06:56:12, par Benedita
5. le Jeudi 02 Février 2012 à 10:03:02, par Kizscossy
6. le Jeudi 02 Février 2012 à 10:11:21, par AppeadaAlom
7. le Jeudi 02 Février 2012 à 12:06:10, par KicClaick
8. le Jeudi 02 Février 2012 à 12:39:11, par Lodiurnirrids
9. le Jeudi 02 Février 2012 à 13:31:49, par CerGraisteren
10. le Jeudi 02 Février 2012 à 14:14:43, par Rhisholatwits
11. le Jeudi 02 Février 2012 à 14:32:03, par StessRamnense
12. le Jeudi 02 Février 2012 à 14:47:51, par KeymnsekVes
13. le Jeudi 02 Février 2012 à 15:08:42, par Accireeta
14. le Jeudi 02 Février 2012 à 15:21:13, par innopaygope
15. le Jeudi 02 Février 2012 à 16:42:18, par Drillavieva
16. le Jeudi 02 Février 2012 à 17:05:19, par navbakorit
17. le Jeudi 02 Février 2012 à 17:18:10, par DeennasuegO
18. le Jeudi 02 Février 2012 à 17:52:05, par TOXCRORKAWHOW
19. le Jeudi 02 Février 2012 à 18:25:42, par Unurcegense
20. le Jeudi 02 Février 2012 à 18:44:48, par Inferyexiff
21. le Jeudi 02 Février 2012 à 19:02:33, par immitwobibecy
22. le Jeudi 02 Février 2012 à 19:05:44, par taulsenue
23. le Jeudi 02 Février 2012 à 19:10:56, par Amardiamy
24. le Jeudi 02 Février 2012 à 19:17:37, par Lypepymngag
25. le Jeudi 02 Février 2012 à 19:36:24, par undurnrip
26. le Jeudi 02 Février 2012 à 19:38:29, par FafweectFlele
27. le Jeudi 02 Février 2012 à 19:58:31, par ticsoartrob
28. le Jeudi 02 Février 2012 à 20:10:04, par OccataUplibia
29. le Jeudi 02 Février 2012 à 20:39:04, par Zudkyuoke
30. le Jeudi 02 Février 2012 à 20:46:55, par idiorndoors
31. le Jeudi 02 Février 2012 à 21:20:42, par SegequefedTed
32. le Jeudi 02 Février 2012 à 21:26:31, par LenRexia
33. le Jeudi 02 Février 2012 à 21:54:18, par Wheemokeewile
34. le Jeudi 02 Février 2012 à 22:27:57, par lypejilia
35. le Jeudi 02 Février 2012 à 22:45:51, par Inferyexiff
36. le Jeudi 02 Février 2012 à 23:02:22, par unibleLustilt
37. le Jeudi 02 Février 2012 à 23:52:17, par chegobigh
38. le Vendredi 03 Février 2012 à 00:50:14, par mutselassem
39. le Vendredi 03 Février 2012 à 01:03:23, par Roassarly
40. le Vendredi 03 Février 2012 à 01:20:52, par aspinypetraps
41. le Vendredi 03 Février 2012 à 01:27:56, par Ensuro
42. le Vendredi 03 Février 2012 à 01:48:48, par BoumEnrom
43. le Vendredi 03 Février 2012 à 01:59:03, par DizzitSoign
44. le Vendredi 03 Février 2012 à 02:12:14, par CrambGreems
45. le Vendredi 03 Février 2012 à 02:12:33, par Anidich1
46. le Vendredi 03 Février 2012 à 02:51:27, par Inferyexiff
47. le Vendredi 03 Février 2012 à 03:33:32, par TheoroArogref
48. le Vendredi 03 Février 2012 à 03:34:18, par poettefed
49. le Vendredi 03 Février 2012 à 05:14:56, par Ensuro
50. le Vendredi 03 Février 2012 à 05:35:07, par Inferyexiff
51. le Vendredi 03 Février 2012 à 06:11:38, par NefReettY
52. le Vendredi 03 Février 2012 à 06:51:44, par ovabkavero
53. le Vendredi 03 Février 2012 à 06:52:34, par emoreendock
54. le Vendredi 03 Février 2012 à 08:17:11, par Sekboydaydeta
55. le Vendredi 03 Février 2012 à 09:01:39, par Wekscobserb
56. le Vendredi 03 Février 2012 à 13:59:12, par Inferyexiff
57. le Vendredi 03 Février 2012 à 16:17:21, par briscutious
58. le Vendredi 03 Février 2012 à 16:33:04, par Amardiamy
59. le Vendredi 03 Février 2012 à 16:59:55, par PerseMine
60. le Vendredi 03 Février 2012 à 17:43:23, par meadiaaquaple
61. le Vendredi 03 Février 2012 à 18:18:41, par Aneleboove
62. le Vendredi 03 Février 2012 à 18:26:16, par Estigeshanges
63. le Vendredi 03 Février 2012 à 19:02:06, par Claingeignobe
64. le Vendredi 03 Février 2012 à 19:11:26, par Lagestastsoge
65. le Vendredi 03 Février 2012 à 19:25:44, par Heagioftfrori
66. le Vendredi 03 Février 2012 à 19:31:48, par edgeryfet
67. le Vendredi 03 Février 2012 à 19:54:49, par Laxydoory
68. le Vendredi 03 Février 2012 à 20:05:27, par Risfakbib
69. le Vendredi 03 Février 2012 à 20:05:27, par Heraseame
70. le Vendredi 03 Février 2012 à 20:06:49, par Roagreeeasete
71. le Vendredi 03 Février 2012 à 20:39:09, par Kneenselt
72. le Vendredi 03 Février 2012 à 20:41:33, par LexImponsemox
73. le Vendredi 03 Février 2012 à 20:47:43, par KemeEmpissoge
74. le Vendredi 03 Février 2012 à 21:06:00, par snoppreoksjof
75. le Vendredi 03 Février 2012 à 21:24:23, par bridadiorne
76. le Vendredi 03 Février 2012 à 21:45:52, par TRIAREEJAICKY
77. le Vendredi 03 Février 2012 à 22:07:55, par phileampCalex
78. le Vendredi 03 Février 2012 à 22:21:01, par gliveMibe
79. le Vendredi 03 Février 2012 à 22:51:19, par Exhiliott
80. le Vendredi 03 Février 2012 à 22:56:26, par Erappelpibe
81. le Vendredi 03 Février 2012 à 23:32:08, par immigneta
82. le Vendredi 03 Février 2012 à 23:34:20, par ovabkavero
83. le Vendredi 03 Février 2012 à 23:35:26, par ROKSKERNELICS
84. le Samedi 04 Février 2012 à 00:08:00, par zefsMaseswemy
85. le Samedi 04 Février 2012 à 00:19:14, par Plaimaperpimb
86. le Samedi 04 Février 2012 à 00:43:20, par anymnagiate
87. le Samedi 04 Février 2012 à 01:02:09, par Sectreertiowl
88. le Samedi 04 Février 2012 à 01:18:41, par Afforomealley
89. le Samedi 04 Février 2012 à 01:24:46, par Playdayloossy
90. le Samedi 04 Février 2012 à 01:38:23, par sypeQuedise
91. le Samedi 04 Février 2012 à 01:41:23, par TheoroArogref
92. le Samedi 04 Février 2012 à 01:46:11, par Restedgisania
93. le Samedi 04 Février 2012 à 01:54:47, par Viettelep
94. le Samedi 04 Février 2012 à 02:29:16, par phistinecet
95. le Samedi 04 Février 2012 à 02:30:17, par utesseAsype
96. le Samedi 04 Février 2012 à 02:30:17, par CiteCricyBype
97. le Samedi 04 Février 2012 à 02:42:13, par Deelpjephop
98. le Samedi 04 Février 2012 à 02:59:27, par VoighistequerSwothe
99. le Samedi 04 Février 2012 à 03:05:59, par Earnereft
100. le Samedi 04 Février 2012 à 03:13:32, par analinginasty
101. le Samedi 04 Février 2012 à 03:41:21, par sestyrity
102. le Samedi 04 Février 2012 à 03:56:59, par Hadsduats
103. le Samedi 04 Février 2012 à 04:17:04, par Sciepaycare
104. le Samedi 04 Février 2012 à 04:42:12, par falpElimi
105. le Samedi 04 Février 2012 à 04:51:56, par Sciepaycare
106. le Samedi 04 Février 2012 à 05:23:30, par untottefe
107. le Samedi 04 Février 2012 à 05:26:54, par GetEtelpdat
108. le Samedi 04 Février 2012 à 05:27:17, par zittyType
109. le Samedi 04 Février 2012 à 06:02:24, par skysleneaclek
110. le Samedi 04 Février 2012 à 06:09:50, par Layeplerile
111. le Samedi 04 Février 2012 à 06:38:08, par PranionsinIsp
112. le Samedi 04 Février 2012 à 06:52:13, par Teantable
113. le Samedi 04 Février 2012 à 06:53:01, par Inferyexiff
114. le Samedi 04 Février 2012 à 07:35:37, par phoffslorsLip
115. le Samedi 04 Février 2012 à 07:48:38, par Vadaneams
116. le Samedi 04 Février 2012 à 08:18:49, par Loottcropak
117. le Samedi 04 Février 2012 à 09:02:16, par Malklayepak
118. le Samedi 04 Février 2012 à 09:21:05, par Inferyexiff
119. le Samedi 04 Février 2012 à 09:45:45, par MixMizritle
120. le Samedi 04 Février 2012 à 10:03:24, par VoighistequerSwothe
121. le Samedi 04 Février 2012 à 10:29:39, par SetFrermFen
122. le Samedi 04 Février 2012 à 11:13:10, par Evageaddima
123. le Samedi 04 Février 2012 à 14:27:51, par Inferyexiff
124. le Samedi 04 Février 2012 à 14:45:57, par ToivaRon
125. le Samedi 04 Février 2012 à 16:44:08, par vofbevakidf
126. le Samedi 04 Février 2012 à 17:21:43, par Inferyexiff
127. le Samedi 04 Février 2012 à 17:41:33, par AffireeNoitte
Ajouter un commentaire.