Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Azema a écrit:
Salut à tous,
Je pense qu'il est plus intéressant de créer plusieurs rôles différents qui permettent d'accéder ou non à des ressources et ensuite distribuer les rôles à chaque utilisateurs du système. Cela me parait moins lourd à gérer.
Cordialement, Azema.
N'est il pas plus intéressant de définir les rôles à la volée plutôt que de tous les définir à l'avance ?
Hors ligne
N'est il pas plus intéressant de définir les rôles à la volée plutôt que de tous les définir à l'avance ?
Rien ne t'empêche de définir des rôles à la volée en utilisant les Acls, non ? En tout cas, c'est comme ça que je procède, mes rôles, actions et modules sont dans une base de données et je charge à la volée.
Dernière modification par whitespirit (15-07-2008 12:26:03)
Hors ligne
elkolonel a écrit:
Merci Laurent, alors maintenant peut on aller plus loin. Peux t-on faire ceci :
Code:
library Zend MaLibrairie ... application default controllers models views backoffice modules dashboard controllers models views news controllers models views newsletters controllers models views medias controllers models views htdocs index.php /public images css etc...Pensez vous que cela soit possible en adaptant correctement son bootstrap ??
Cordialement,
Ca me semble tout à fait possible. En mode BackOffice on peut signaler au front contrôleur où se trouve les répertoires qui contient les contrôleurs. Voir ici : http://www.z-f.fr/forum/viewtopic.php?id=1500
Personnellement je ne sortirai pas la partie frontOffice. Pour moi le module est un moyen de packaging qui doit faciliter :
* L’installation et la réutilisation. On fait un glissé déposé dans le répertoire modules, on édite le fichier de conf et le module devrait être opérationnel.
* Minimiser les dépendances. Le module embarque toutes les fonctionnalités qui lui sont spécifiques.
* Faciliter les mises à jour et l’évolution du module. Tout est dans le répertoire du module, ce qui évite la fragmentation dans toute l’application.
Hors ligne
Alors la question suivante va être la façon de stocker les données afin d'être le plus évolutif possible dans l'application.
Comme je l'ai indiqué au départ de ce post, le but est de proposer un back office avec un core comprenant les fonctions essentielles à la gestion même du BO ainsi que les briques indissociables (selon ma vision, hein, pas la peine de partir en troll la dessus ;-)) du core que peuvent être :
- la gestion des utilisateurs
- la gestion de l'authentification
- la gestion de news
- la gestion de newsletters
- la gestions des droits (ACL)
- etc.
Par contre, comment être sur que l'application et notamment son modèle de données pourra évoluer sans aucun problème ?
Avez vous des propositions sur ce point particulier ? Un mode de stockage différent de ce qui se fait traditionnellement ? J'ai commencé à me documenter sur RDF mais le web sémantique, ce n'est pas forcément évident et je ne suis pas sur que cela réponde forcément à ma problématique.
[Edit] alors pour voir comment s'organisent les datas avec RDF, vous pouvez jetter un oeil ici (le graphe en bas de page nommé RDF and the Semantic Graph) : http://www.twine.com/tour/semantic. Cela à l'air intéressant mais sans doute complexe à mettre en place. Merci de vos retours...
[Edit 2] Une bonne source d'information sur le RDF : http://websemantique.org/PagePrincipale
[Edit 3] Peut être le modèle de wordpress avec son système de plugin est il un bon exemple d'évolutivité d'pplication. Qu'en pensez vous ?
Cordialement,
Dernière modification par elkolonel (22-07-2008 10:50:20)
Hors ligne
Alors j'interviens à nouveau afin de faire appel (encore une fois ;-) ) à votre expérience.
Après présentation de l'architecture du projet aux webmasters et designers qui travaillent avec moi, ils m'ont posé les questions suivantes :
- est il possible d'avoir tout les fichier HTML (ceux qui sont présents dans les vues et layouts) regroupés en un seul et même endroit ?
- est il possible d'avoir un système de thème? autrement dit est il possible d'avoir tous les fichiers phtml dans un seul et même répertoire et rangés par thème (duplication des fichiers pour chaque thème) ?
Merci pour vos retours sur la question,
Cordialement,
Hors ligne
On a également developpé un système de BO avec ZF.
On est parti sur un arbo comme celle la :
library
Zend
MaLibrairie
...
application
default
controllers
models
views
fr
controllers
models
views
admin (la gesiton globale du BO)
menu
controllers
models
views
install
news
controllers
models
views
install
utilisateur
controllers
models
views
install
www
index.php
/public
/fr
images
css
js
Ainsi, on peut ajouter, ou enlever un module très facilement, et chaque module contient sa partie BO et FO.
Pour les évolutions des modules, effectivement, c'est le problème, s'il y a des gros changements dans la structure de la table, ou même du ZF (1.0 et 1.5 avec les layouts), alors dans le dossier install, je gère les différences entre les verisons, et fait les adaptations sur la structure de la base et sur les fichiers s'il le faut...
Hors ligne
Merci pour ta réponse Aurélien, ma structure a évolué et s'approche de la tienne. Il me reste à résoudre le souhait de mes webmasters, designers pour que tout soit parfait.
Cordialement,
Hors ligne
Salut Aurelien,
j'aurai 2 questions sur ta structure si tu veux bien :
* Qu'est ce que contient le répertoire admin ?
* Tout tes modules on l'aire de se trouver sous /fr comment ça se passe si je rajoute une langue ?
@+
Hors ligne
Alors je ne veux pas répondre à la place d'Aurélien (euh... pourtant c'est ce que je fais, mais non je donne juste mon avis ;-), arrête maintenant il y a des gens qui te regarde... ), mais en fait le répertoire admin va contenir tout ce qui va être proprement dit le back-office. Tandis que les autres répertoires, tels que 'menu', 'news' seront la partie front office de l'application. Le côté back-office du module de news sera par exemple gérer par le controlleur situé dans 'application/fr/admin/controllers/NewsController.php avec les actions AddAction, ListAction, EditAction par exemple...
Pour ce qui est de l'organisation multilingue, est il nécessaire de tout dupliquer dans des répertoires de langues. N'est il pas plus simple d'utiliser le mode gettext de zend_translate avec des fichiers po (en liaison avec le logiciel PoEdit : http://www.poedit.net/index.php) ?
PS : désolé pour le petit dédoublement de personnalité plus haut, on fait comme si de rien n'était d'accord ?
Hors ligne
elkolonel a écrit:
mais en fait le répertoire admin va contenir tout ce qui va être proprement dit le back-office. Tandis que les autres répertoires, tels que 'menu', 'news' seront la partie front office de l'application. Le côté back-office du module de news sera par exemple gérer par le controlleur situé dans 'application/fr/admin/controllers/NewsController.php avec les actions AddAction, ListAction, EditAction par exemple...?
Apparemment ce n'est pas ce qu'a l'aire de dire Aurelien :
Aurelien a écrit:
Ainsi, on peut ajouter, ou enlever un module très facilement, et chaque module contient sa partie BO et FO.
D'où ma question
elkolonel a écrit:
Pour ce qui est de l'organisation multilingue, est il nécessaire de tout dupliquer dans des répertoires de langues. N'est il pas plus simple d'utiliser le mode gettext de zend_translate avec des fichiers po (en liaison avec le logiciel PoEdit : http://www.poedit.net/index.php) ?
Effectivement je pense que la bonne approche et d'utiliser le routeur pour simuler un répertoire de langue
http://www.z-f.fr/forum/viewtopic.php?id=552 et l'utilisation de zend_translate et/ou une vue par langue.
Hors ligne
Dans admin, j'ai mon controller admin, qui me permet de pinter mon application sur http://monapplication/fr/admin.
Dans mon bootstrap, je parse tous les modules, regarde s'ils sont actifs ou pas, et défini dynamiquement les PATH de views, model, et controller.
Pour ce qui est du FR, effectivement, chaque module est duppliqué dans cet exemple, ce qui n'est pas super.
L'idée étant de mettre dans default qu iest au même niveau de fr les modules communs multilingues, et ensuite, dans fr, en, es, etc, les modukes spécifiques à chaque version de langue...
Hors ligne
elkolonel a écrit:
Merci pour ta réponse Aurélien, ma structure a évolué et s'approche de la tienne. Il me reste à résoudre le souhait de mes webmasters, designers pour que tout soit parfait.
Cordialement,
Alors mes problèmes liés à mes webmasters et designers sont résolus, j'ai réussi à tout placer (déplacer) dans un seul répertoire grâce aux commandes suivantes :
$viewRenderer->setViewBasePathSpec('/path_to_application/application/design/basic') ->setViewScriptPathSpec(':module/:controller/:action.:suffix') ->setViewScriptPathNoControllerSpec(':action.:suffix') ->setViewSuffix('html');
C'est vraiment là que l'on s'aperçoit de la souplesse et de la puissance du ZF... ;-)
Maintenant, je me pose la question suivante, sachant qu'un back-office ne fonctionne pas sans un front office, est il possible dans le bootstrap de définir un layout pour le front office et un layout différent pour le bo ?
Un retour d'expérience sur cette question ?
Hors ligne
Salut,
Je débute sur ZF donc je n'ai pas forcément bcp d'expérience...
Pour la structure de mon appli j'ai suivi les conseils de 2mx (que je remercie au passage). J'utilise donc une structure modulaire.
Chaque module contient ses controllers pour le front et ceux pour l'admin. Comme ça si je veux le réutiliser pour un autre projet j'ai juste le dossier du module à copier-coller.
Pour mon admin j'ai un 2e bootstrap (toujours largement inspiré de 2mx ).
Je peux donc définir un 2e layout spécifique à l'admin :
$optLayout = array( 'layout' => 'gabarit_general', 'layoutPath' => LAYOUTS_DIR . '/admin', 'contentKey' => 'contenu' ); Zend_Layout::startMvc($optLayout);
Voici ma structure type :
article admin controllers IndexController.php formulaires article.form.php views config config.conf.php controllers IndexController.php formulaires models Article.php Articles.php views
J'ai deux models. Un au singuler et un au pluriel.
Le model singuler est une class qui propose des actions sur un article unique (recupererInfos(), majNbLectures(), preparerInfosPourWeb() etc.).
Celle au pluriel me permet de récupérer plusieurs articles, pour un listing par exemple. En général la dans function init du controller j'ai un truc du genre :
$this -> _model = new Articles();
Pour récupérer plusieurs articles j'utilise un code dans le genre :
$listeArticles = $this -> _model -> renvoyerArticlesDe($rubriques_id, $page_en_cours, $nb_par_page);
Qui me renvoi un array d'instances de Article();
Pour le CRUD, chaque model etend une class qui étend la Zend_DB_Table
class Article exends Kaimite_Db_AccesDonnees {}
Cette class contient les actions redondantes :
- enregistrerInfos()
- recupererInfos()
- modifierEnregistrement()
- etc.
J'utilise un système de cache perso. La méthode recupererInfos() test si le cache existe et le récupère ou interroge la base.
Pour l'espace d'admin je me suis fait une class qui liste les enregistrements et mes controllers sont souvent sur le même modele :
<?php class Agence_IndexController extends Zend_Controller_Action { function init() { Zend_Loader::loadClass("Article", MODULES_DIR . "/article/models"); Zend_Loader::loadClass("Articles", MODULES_DIR . "/article/models"); $this -> _model = new Articles(); return ; } function indexAction () { return; } function listeAction () { $Listing = new Kaimite_ListingAdmin(); // Listing des enregistrements return; } function corbeilleAction () { $Listing = new Kaimite_ListingAdmin(); // Listing de la corbeille return; } function formAction () { $uid = $this -> _request -> getParam('uid', null); $Article = new Article($uid); if ( is_numeric($uid) ) { $this -> view -> classIconeTitre = "Maj"; $this -> view -> titreFormulaire = "Modification d'un article"; } else { $this -> view -> classIconeTitre = "Ajout"; $this -> view -> titreFormulaire = "Ajout d'un article"; } $this -> view -> Formulaire = $Article -> renvoyerFormulaire(MODULES_DIR . "/article/admin/formulaires/article.form.php"); return; } function enregistrerAction () { $Article = new Article(); if ( ( $retourForm = $Article -> infosValidesPourAdmin(MODULES_DIR . "/article/admin/formulaires/article.form.php") ) === true ) { $this -> _helper -> viewRenderer -> setNoRender(); if ( ($uidRetour = $Article -> enregistrerInfos()) !== false ) { header("Location:/admin/article/index/liste/uid/" . $uidRetour . "/retour/enregistrer_succes"); } else { header("Location:/admin/article/index/liste/uid/" . $uidRetour . "/retour/erreur"); } } //--> LE FORMULAIRE EST MAL RENSEIGNÉ else { $Article = new Article($_POST['uid']); if ( is_numeric($_POST['uid']) ) { $this -> view -> classIconeTitre = "Maj"; $this -> view -> titreFormulaire = "Modification d'un article"; } else { $this -> view -> classIconeTitre = "Ajout"; $this -> view -> titreFormulaire = "Ajout d'un article"; } $this -> view -> Formulaire = $retourForm; $this -> _helper -> viewRenderer -> render("form"); } return ; } function effacerAction () { $uid = $this -> _request -> getParam('uid', null); $Article = new Article($uid); if ( $Article -> effacerEnregistrement() ) { header("Location:/admin/article/index/liste/retour/effacer_succes"); } else { header("Location:/admin/article/index/liste/retour/erreur"); } } } ?>
Par habitude je n'efface rien de mes tables. J'utilise un champ "poubelle" que je passe à 1 ou 0.
Je n'utilise donc pas les CASCADE de mySQL.
J'ai développé un petit module qui se charge de me créer une arborescence de base ainsi que les principaux fichiers génériques quand je veux me créer un nouveau module. Je lui donne le nom du module, sa table, les actions frontales et il me crée l'arbo, les fichiers .phtml, les class de bases..
Je suis en train de bosser sur mon premier sur site avec ZF Je suis donc encore en phase de test.
Je ne cherche pas vraiment à pouvoir installer des modules depuis mon admin. Mes client n'en sont pas encore là...
Voilà pour ce qui est de ma petite expérience sur ZF. Merci pour vos commentaires et critiques
Cordialement,
Kaimite
Dernière modification par Kaimite (31-07-2008 16:06:33)
Hors ligne
Aurelien a écrit:
Dans admin, j'ai mon controller admin, qui me permet de pinter mon application sur http://monapplication/fr/admin.
Dans mon bootstrap, je parse tous les modules, regarde s'ils sont actifs ou pas, et défini dynamiquement les PATH de views, model, et controller.
Alors c'est là que cela devient intéressant, peux tu me dire comment tu définis dynamiquement des PATH de views ?
Car je me retrouve de nouveau confronté à un problème (sans doute par méconnaissance de la globalité du ZF...). Pour mes webmasters, designers, j'ai réussi à tout caler dans un seul répertoire 'design' qui se trouve au même niveau que le rep. 'application'. J'ai fait de même pour mes modules. Afin qu'ils soient totalement indépendant, je les ai sorti du répertoire application (comme le propose seikajin : http://zend-framework.developpez.com/se … siers/#LIV).
Toutefois, rappelez vous j'ai défini dans mon bootstrap un endroit personnalisé pour mes vues (afin que mes designers et graphistes puissent travailler avec tous les fichiers regroupés)
$viewRenderer->setViewBasePathSpec('/path_to_application/application/design/basic') ->setViewScriptPathSpec(':module/:controller/:action.:suffix') ->setViewScriptPathNoControllerSpec(':action.:suffix') ->setViewSuffix('html');
et maintenant comment puis je gérer les vues des modules ? Le but d'un module est de le déposer, de modifier quelque peu sa config et qu'il fonctionne. Cela implique d'avoir les vues qui concernent le module dans un sous répertoire de celui-ci... mais alors fini la centralisation des vues pour mes designers...
Avez vous une idée, car là j'ai l'impression de marcher vers un mur dans mon organisation...
Qu'en pensez vous ?
Hors ligne
Je pense que dans une organisation comme celle que tu recherche tu dois obligatoirement un jour trancher entre :
1 - avoir des modules complètement autonome ce qui implique une séparation des dossiers de vue pour tes designers.
2 - soit centraliser les vues et perdre la gestion autonome des modules.
bah c'est un peu une réponse sans fond, je crois qu'il faut juste faire un choix... Tout dépend de ce que tu recherche, faciliter la gestion des modules ou faciliter la vie de tes designers
Dernière modification par Roulio (04-08-2008 17:01:54)
Hors ligne
Roulio a écrit:
Je pense que dans une organisation comme celle que tu recherche tu dois obligatoirement un jour trancher entre :
1 - avoir des modules complètement autonome ce qui implique une séparation des dossiers de vue pour tes designers.
2 - soit centraliser les vues et perdre la gestion autonome des modules.
bah c'est un peu une réponse sans fond, je crois qu'il faut juste faire un choix... Tout dépend de ce que tu recherche, faciliter la gestion des modules ou faciliter la vie de tes designers
Merci Roulio, je crois que tu viens de me donner la solution.
En fait, il faut considérer le module comme un élément indépendant mais pas forcément refermé sur lui-même. L'ajout d'un module sur l'application peut effectivement consister en l'ajout d'un répertoire module mais peut également mettre en place les fichiers nécessaires au templating dans le répertoire design. Le tout est d'avoir des noms et une arborescence suffisamment bien pensée pour ne pas écraser de fichiers de vue/layout/theme d'autres modules.
Contenu du package du module auth (par exemple) :
[auth.zip] /application /design /theme /scripts /auth /login.html /auth /controllers /models /sql /config
Comme cela, il suffit de le dézipper à la racine et de lancer son installation dans le back-office et le tour est joué.
Je vais tester cela mais je pense en effet qu'il s'agit de la bonne solution...
Merci Roulio. ;-)
Hors ligne
Je fait remonter ce topic assez ancien, juste pour savoir si c'était possible d'avoir un retour d'expèrience de ton backoffice (M. Elkolonel ou d'autres) sur leur création et surtout sur l'architecture choisie.
Dernière modification par baboune (17-12-2008 14:02:07)
Hors ligne
Bonjour,
Je suis également intéressé par un retour d'expérience !
Merci
Hors ligne
la ou j'hésite encore, c’est a l’utilisation de 2 bootstraps. Pour pouvoir bien séparer la partie back et la partie front.
Avantage :
- Chargement de fichier INI différent
- Authentification et ACL séparer
- Déclaration du Layout et des vues bien distinc
- Sécurité
Default :
- Lourdeur de mise en place.
Hors ligne
Salut,
Ce n'est pas lourd à mettre en place avec une bonne gestion de la config.
Par exemple une classe qui load la config en fonction du module dans le frontController.
De mon côté je ne met rien ou presque dans le bootstrap.
J'ai un plugin d'initialisation commun à toute l'appli, que j'appelle depuis le bootstrap en passant en paramètre le nom du module.
Ensuite dans le plugin d'initialisation j'utilise une classe qui se charge de loader l'environnement et toute la config du module en question, et tout se fait automatiquement.
J'accède ensuite indépendamment, grâce à une classe dérivant Zend_Registry, à ma config (fichier ini lié à l'environnement : dev, test, prod, etc.) et aux paramètres (fichier ini contenant tous les paramètres de l'appli en elle même, donc qui ne changent pas quelque soit l'environnement).
Je pense que séparer les config et paramètres du front et du back est une bonne solution.
A+ benjamin.
Dernière modification par Delprog (21-01-2009 16:03:46)
Hors ligne
Ensuite dans le plugin d'initialisation j'utilise une classe qui se charge de loader l'environnement et toute la config du module en question, et tout se fait automatiquement.
tu utilise quelle type d'architecture et peut tu me détailler stp ce que tu entend par "loader l'environnement et toute la config du module en question", translate, layout, vue, ACL c'est ça (juste pour être sur).
Je pense que séparer les config et paramètres du front et du back est une bonne solution.
Oui je suis completement d'accord
Hors ligne
Salut,
Dans ma classe d'initialisation je commence par appeler une classe Tight_Config en passant en paramètre le chemin du fichier qui décrit l'environnement. C'est à dire celui contenant le nom du fichier ini de config à utiliser (qui change en fonction de l'environnement), et le fichier de paramètres (tout le paramétrage lié à l'application elle-même, routes, vues, controllers, ACL, langues, etc.) à utiliser par l'appli.
Cette classe de config redéfinie le Registre pour utiliser encore une fois un registre personnalisé Tight_Registry, depuis lequel j'accède à toutes les méthodes du Zend_Registry + des méthodes qui me renvoient soit la config, soit les paramètres.
Suite à ça, je continue l'exécution de mon initializer et configure chaque partie indépendamment (un peu comme l'initializer proposé par Zend Studio for Eclipse) automatiquement en fonction du fichier de paramètres.
$this->initDb(); $this->initCache(); $this->initLanguage(); $this->initView(); $this->initHelpers(); $this->initPlugins(); $this->initRoutes(); $this->initControllers();
exemple pour la vue :
/** * Initialise la vue en fonction des parametres définis dans * Tight_Registry::getParams() * ou avec des valeurs par défaut * * @return void */ public function initView() { Zend_Loader::loadClass('Tight_View'); $this->_view = new Tight_View(); // Si des config de scripts sont présentes dans le fichier de paramètres $scripts = Tight_Registry::getParams()->get('view')->get('scripts', null); if (!is_null($scripts)) { foreach($scripts as $script) { $this->_view->addScriptPath($this->_moduleRoot . $script->scriptPath); } } // Si aucune config n'a été donné pour les scripts, config par défaut $scripts = $this->_view->getScriptPaths(); if (empty($scripts)) { $this->_view->addScriptPath($this->_moduleRoot . '/views/scripts'); } /** * Configure l'url complète de l'accès public dans la variable _httpRoot de la view * Accessible ensuite par $this->_httpRoot, voir Tight_View * @see Tight_View */ $this->_view->setHttpRoot(Tight_Registry::getConfig()->app->get('httpRoot', '')); $doctype = Tight_Registry::getParams()->get('view')->get('doctype', 'XHTML1_STRICT'); $this->_view->doctype($doctype); $encoding = Tight_Registry::getParams()->get('view')->get('encoding', 'UTF-8'); $this->_view->setEncoding($encoding); // Chargement de la config du layout depuis le fichier de paramètres, sinon valeur par défaut $layoutPath = Tight_Registry::getParams()->get('view')->get('layoutPath', '/application/views/layouts'); $defaultLayout = Tight_Registry::getParams()->get('view')->get('defaultLayout', 'layout'); Zend_Layout::startMvc(array( 'layoutPath' => $this->_moduleRoot . $layoutPath, 'layout' => $defaultLayout )); // Recupère l'objet de vue utilisé par les actions des controllers $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->initView(); $viewRenderer->setView($this->_view); Tight_Registry::set('view', $this->_view); }
et dans le fichier de paramètres :
[view] scripts.script1.scriptPath = "/views/scripts" doctype = "XHTML1_STRICT" encoding = "UTF-8" layoutPath = "/views/layouts" defaultLayout = "layout"
Même principe pour le reste.
En gros, je suis parti du plugin d'initialisation proposé par Zend Studio for Eclipse, je l'ai greffé à ma classe gérant la config et automatisé.
Pour la classe Tight_Config, j'ai mis en place un fonctionnement assez proche de ce que propose sekaijin dans son blog, que je remercie au passage car même si nos classes restaient assez différentes, son expérience m'a permis d'améliorer quelques points incertains dans ma classe.
A+ benjamin
Hors ligne
merci beaucoup delprog, mais ça confirme quand même ma pensé :
Default : - Lourdeur de mise en place.
je vais surement t'embeter encore, je galère déja avec la méthode _Config, mais c'est plus facile quand même grace a toi et sekaijin. merci encore !
Hors ligne
merci beaucoup delprog, mais ça confirme quand même ma pensé :
Default : - Lourdeur de mise en place.
Je ne suis pas d'accord
Tout ça me permet de créer un squelette d'application une bonne fois pour toute.
Lors d'un nouveau projet, je copie mon squelette, j'en fais un projet et je n'ai plus qu'à ajouter les quelques spécificités s'il y en a.
Quelques soient mes projets, mes bootstrap, initializer et config conservent le même fonctionnement.
Dernière modification par Delprog (22-01-2009 16:02:15)
Hors ligne
Avez-vous pensé à ne pas faire de "back office" séparé en utilisant judicieusement les ACLs?
Pour le projet sur lequel je bosse, on s'est pas pris la tête. En gros le menu change (s'agrandit) selon ton rôle.
Et vous avez donc accès à d'autres pages "cachés" des visiteurs normaux. Pas de config différentes, et la possibilité de gérer ton site "en directe", je veux dire par là que par exemple quand je suis sur le front et que je visionne une news, j'ai un petit icone pour l'éditer si j'ai les droits...
C'est encore moins lourd à gérer comme ça je trouve :p
Hors ligne