Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-05-2009 15:30:17

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

[R&D Architecture]Back Office modulable commun à plusieurs sites ?

Bonjour,

Depuis quelques temps je fais ma petite sauce de mon côté, je suis assez content, mais j'aimerais quand même vous en parlez pour avoir d'autres avis sur le sujet smile

Je suis en charge d'un développement neuf (je repars de zéro) d'un ensemble de sites portails de sociétés appartenant toutes au même groupe.

La problématique: un site différent pour chaque société, mais certains modules strictement identiques. Puis backoffice qui va avec biensûr.

Pour l'instant, chaque site est indépendant et non modulaire.

Un site, si on le prend à l'état le plus basique, c'est:
- du graph.
- du texte
- des parties dynamiques:
     =>news (actualités)
     =>infos (client)
     =>agenda (de la société)
     =>etc. dans le même esprit...
- un espace-clients:
     =>news (actualités)
     =>infos (client)
     =>agenda
     =>WebTV (de la société)
     =>Téléchargement de mises à jours
     =>Commandes consommables (par ex. pré-imprimés)
     =>Assistance en ligne
     =>etc.

Chaque "module" (news, infos, agenda, etc.) sera, dans sa conception, identique en tout point de site en site.

L'espace-clients est lui aussi identique.

A la base, j'ai commencé par faire un premier site portail totalement autonome, son système de news, son système d'agenda, etc. Et même son propre espace-clients.
Tout ça parce qu'il fallait le faire dans l'urgence.

Ensuite, j'ai séparé l'espace-clients (pour les clients de nos clients) de tout ça en considérant que ça devait être indépendant du site.

Je l'ai "templatisé", ça ressemblait à ça :

Code:

application/
    Config/
    Controllers/
    Models/
    Views/
Modules/
    societe1/
        Config/
        Controllers/
        Models/
        Views/
        bootstrap.php
    societe2/
        Config/
        Controllers/
        Models/
        Views/
        bootstrap.php
library/
public/
    societe1/
        images/
        scripts/
        styles/
        index.php
    societe2/
        images/
        scripts/
        styles/
        index.php
bootstrap.php
Initializer.php

Du coup, très facile de mettre en production l'espace-client d'une nouvelle société du groupe.

Chaque société est considérée comme un module et possède son propre bootstrap appelé depuis l'index du dossier public concerné. Le virtualhost, pointant lui, directement sur le fichier index.php de la société en question.
J'avais structuré comme ça avec l'idée que chaque société consomme/partage la même application, mais peut utiliser ou non certains "modules" (news, téléchargement de mises à jours, etc.)

L'application possédait sa config (environnement), et chaque "module" (société) un fichier de paramètres.

Et ça devient déjà plus compliqué, parce que j'ai une sémantique ambigüe.
Qu'est-ce qu'un module ? la gestion des news, de l'agenda, "plugable" ou non ? Une société doit-elle être aussi considérée comme un module ?

Les sociétés devraient-elles se trouver dans le dossier "application" avec toujours leurs bootstrap respectifs ?

Une chose est sûre, pour moi, un module est activable/désactivable et ne contient pas de vues, qu'une partie "application". Chaque société étant en charge de mettre en forme et d'afficher le résultat de chaque module.


Première problèmatique.


Deuxième questionnement: et le backoffice dans tout ça ?

Ce que j'appelle backoffice se rapproche plus d'un CMS dans l'idée. Ce n'en est pas vraiment un, puisque je ne compte pas dynamiser le site entier. Tous les contenus textuels (commerciaux) restent spécifiques et ne seront pas modifiables via une interface.

Par contre, les données des parties dynamiques correspondants à des modules (news, infos, agenda, webtv, etc.) doivent évidemment être alimentées via un CMS/BO. Chaque société est indépendante, il ne s'agit pas de "templates", mais je ne souhaite pas dupliquer les parties dynamiques qui sont identiques.

Et au dessus de ça, j'aurai donc un CMS/BO pour manipuler tout ça et qui ne devra en toute logique exister qu'une seule fois, puisque le fonctionnement sera identique d'un site à l'autre.


Comment structurer tout ça d'après vous ?


Selon le choix final, je vais me retrouver avec plus ou moins d'applications:

- Une application par site comprenant le backoffice de ce site ?
- Une application par site et une application indépendante pour un backoffice commun à tous les sites ?


Un architecte pour me répondre ? :p



Merci,


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#2 06-05-2009 12:36:03

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Bon, je simplifie le sujet, en posant une simple question pour commencer smile

Lorsque je dois construire une application commune qui sera utilisée par différentes entités (ici des sociétés), comme un espace-clients, je considère chaque entité comme un module. Du coup je ne sais pas comment différencier ces modules "entités" des modules applicatifs, comme un module "news" ou "acl" ou autre.

Aujourd'hui, j'ai donc ça:

Code:

application/
    Config/
    Controllers/
    Models/
    Views/
modules/
    societe1/
        Config/
        Controllers/
        Models/
        Views/
        bootstrap.php
    societe2/
        Config/
        Controllers/
        Models/
        Views/
        bootstrap.php
library/
public/
    societe1/
        images/
        scripts/
        styles/
        index.php
    societe2/
        images/
        scripts/
        styles/
        index.php
bootstrap.php
Initializer.php

J'ai fait ça parce que chaque "entité" (module?) peut avoir des spécificités que d'autres n'ont pas: controllers, vues spécifiques, etc...

Comment faites-vous ?


A+ benjamin


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 06-05-2009 13:25:58

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

une idée peut être bête : mais ton param 'module' peut être égale à "modules_societe1" ou "module_societe2", qui correspond a "modules/societe1" ou "modules/societe2".

Hors ligne

 

#4 06-05-2009 13:50:27

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Je n'ai pas compris où tu veux en venir smile


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 21-05-2009 01:39:46

yannux
Membre
Lieu: Rennes
Date d'inscription: 07-04-2007
Messages: 284
Site web

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Pour te donner une autre idée. (C'est très bref)

J'aurai faire un module backend  et un module frontend.
Ton module backend te permet de créer tout ce que tu veux en choisissant pour quel société on le fait (liste des société, avec un id, en base).

Ta partie frontend devrait détecter à partir de l'url, les données de quelle société elle doit récupérer, utiliser un petit système de thème pour gerer le contenu en dur qui peut changer, etc...


Car si j'ai bien compris là tu duplique plein de code identique entre tes différents modules sociétés ?  :s


Société : Direct Info Service

Hors ligne

 

#6 23-05-2009 13:57:59

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Non, pour l'instant je ne l'ai fais que pour une entité, urgence oblige smile

Mais maintenant j'ai le temps de réfléchir, j'ai déjà des idées, mais je suis intéressé par vos avis.

L'architecture dont tu parles est celle que j'ai choisi pour l'espace-clients dont je parle.

En fait, le problème pour moi est surtout de bien faire la part des choses, entre ce qu'est un "module" et ce qui fait l'application.

Dans mon cas, pour l'instant, le backend dont tu parles est mon application, et le frontend est réparti en modules correspondant à chaque entité. Ces modules contiennent un fichier de paramètres (ini) et éventuellement des controlleurs et des vues particulières (si cette entité a des spécificités). C'est donc l'arbo que j'ai cité plus haut:

Code:

application/    <----- backend
    Config/
        environment.ini
        prod.ini  (chargé par environment.ini)
        test.ini   
        dev.ini   
    Controllers/
    Models/
    Views/
modules/
    societe1/
        Config/
             parameters.ini
        Controllers/
        Models/
        Views/
        bootstrap.php
    societe2/

Je pense que c'est plus une réflexion sur une arbo à adopter et comment faire la part entre un "module" et une "entité".

Là, j'ai dans le dossier public, un index.php qui include le bootstrap.php de la société (ce que j'appelle entité) concernée. Et je sais donc de qui il s'agit, j'ai son propre fichier de paramètres, sans utiliser l'url.

Mais à partir de là, où placer les "modules" au sens propre comme la gestion des news, des articles, des mises à jours, etc....

En somme, j'ai un problème de vocabulaire et d'archi smile


Merci,

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#7 20-08-2009 16:29:19

Eureka
Membre
Date d'inscription: 18-07-2009
Messages: 81

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Salut !

En relisant des posts je croise celui-ci qui correspond de très près à la problématique à laquelle je suis confrontée et sur laquelle je réfléchis depuis quelques semaines maintenant.

Cette problématique j'ai "tenté" de l'expliciter ici ( http://www.z-f.fr/forum/viewtopic.php?id=3611 ) et un peu là (http://www.z-f.fr/forum/viewtopic.php?id=3824), tout en longueur également, mais sans avoir réussir à avoir de retours d'expérience suffisamment partagés pour me lancer définitivement dans une architecture précise (bref, à tatons pour l'heure, me concentrant un peu plus en attendant sur d'autres aspects indépendants de cette archi, mais le temps passe et j'aimerais réussir toutefois à statuer rapidement sur un choix judicieux afin d'esquiver l'expérience que tu viens de traverser avec ce "one shot from scratch" (compassion ?!)).

L'application que je dois mettre en oeuvre est similaire à la tienne : modules (même problème de vocabulaire, "addons" dirais-je du coup) partagés et activables/désactivables, possibilité d'ajout de pages supplémentaires pour une société donnée, ... . Bref en soit énormément de traitements communs mais également des spécificités (éventuelles ou certaines).

La où l'approche est sensiblement différente vient du fait que pour ma part ce n'est pas une application orientée mono-portail multisites mais multiportails multisites (en soit plusieurs portails avec pour chacun plusieurs sites).

Si tu as mis en application ce projet de refonte, pourrais-tu faire part de l'architecture que tu as adopté, en mettant également en avant les contraintes (au sens "erreurs de conception" que tu aurais préférées soulever dès le départ) auxquelles tu as été confrontées ?

En revanche si tu n'as pas encore mis cela en application je suis partant, si ça te dis également, pour confronter nos opinions et discuter allègrement des problématiques auxquelles on peut être confronté à divers niveaux.

Dernière modification par Eureka (20-08-2009 16:30:19)

Hors ligne

 

#8 27-08-2009 14:55:46

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Salut,

Je n'ai pas encore refactorisé réellement tout ça, mais par contre j'ai refactorisé sur "papier". Je travaille en ce moment sur un gros projet que j'ai commencé avec ZF1.8 et du coup je repense pas mal de choses.

Pour l'arborescence, il n'y a en fait pas énormément de solutions.
Par ex. j'avais mis en place des sites clients basés sur des modèles, avec spécificités ou non mais qui reposent tous sur la même techno. J'avais à ce moment décidé de partir sur une arbo du type:

Code:

application/
    _config/
        prod.ini  <------ config, c'est à dire qui ne change qu'en fonction de l'environnement
        test.ini              (à ne pas confondre avec paramètres)
        dev.ini       
    Ankha  <----- 1 modèle de site avec ses controlleurs, traductions et vues
        Controllers/
        Languages/
        Views/
    Illid    <----- 1 autre modèle de site etc.
    Models  <------- Modèles (métier+persistance) commun à tous les sites
    Teldra
    Ysena
    Zelen
modules/
    client1/
        _cache/
        _config/
            parameters.ini   <---- fichier de paramètres propre au client1
        Controllers/     <---- controlleurs spécifiques au client1
        Languages/      <---- langues pour les controlleurs/vues spécifiques au client1
        Views/             <---- vues spécifiques au client1
    client2/
        idem
    client3/
    etc.
public/
    client1/
        _css/
        _images/
        _js/
        index.php <--- bootstrap client1, très peu de code, assure le new Initializer('identifiantclient');
    client2/
        idem
    etc.
Initializer.php   <---- classe perso d'initialisation qui charge tout l'environnement

En fait, ici c'était très simple. Je n'avais aucun paramètre en BDD (choix non personnel smile), je sais dans l'index de quel client il s'agit et je charge donc l'initializer avec un paramètre qui identifie le client. L'initializer charge tout l'environnement (le bon fichier de paramètres etc etc.). Tu remarques donc que je n'utilise pas le nom de domaine. Pour une simple raison, en prod c'est bien, mais en dev tu l'as dans l'os, tu dois te battre avec des virtual hosts.

A l'arrivée d'un nouveau client, je n'ai donc qu'à copier/coller dans modules un dossier (en fonction du site) contenant tout ce qu'il faut pour un modèle d'origine, à faire le fichier parameters.ini du client et mettre son identité dans index.php pour que l'initializer charge bien son environnement.

Dans l'initializer je récupère le modèle du site utilisé par le client dans le parameters.ini et je définis grâce à ça le module par défaut (Ankha, Illid, etc.) qui se trouve dans Application.

Cette solution fonctionne bien, mais ce n'est pas très conventionnel.

Si aujourd'hui je devais repenser la chose, et ça avec ZF1.8+, je changerai certainement certains détails.
Déjà je passerais sur une BDD ça c'est sur.

Je ferais une arbo différente pour l'intégration car avant je faisais moi même l'intégration, aujourd'hui j'ai mon intégrateur pour ça smile

Dans mes nouveaux projets je n'ai donc plus aucune vue dans les dossiers application et modules. J'ai tout extrait dans un dossiers "templates" au même niveau que les autres. L'intégrateur n'a donc jamais à parcourir les dossiers autres que templates. J'ai aussi simplifié l'arbo en virant le dossiers scripts. Les vues sont organisées par modules/controllers :

Code:

application/
library/
modules/
public/
templates/
    default/
        _layouts/
        error/
            index.phtml
        index/
            index.phtml
    auth/
    news/
    mail/
    etc.
tests/

Je ne veux pas te mettre sur de mauvaises pistes, mais je pense que j'appliquerais "presque" (note le presque) la même chose au cas plus haut. J'aurais donc dans templates, un dossier par modèle de site, un dossier par client avec ses vues perso et un dossier par modules à proprement parlé (news, agenda, auth, etc. etc.).

Code:

templates/
    _ankha/
        index/
            index.phtml
        contact/
            index.phtml
    _illid/
       idem
    client1/
    client2/

Mais, et je reviens sur le presque, il y aurait un problème. Les vues des modules (news, auth, etc.) diffèrent entre les modèles de sites (qui sont aussi maintenant des modules). Je te laisse donc réfléchir à cette question que je me poserai moi plus tard smile

Pour le reste, avec ZF1.8+ et Zend_Application, les choses seraient un peu différentes, mais pas tant que ça. L'initializer saute, la config passe dans application.ini, et le reste serait configuré dans une jolie méthode _initXXX dans le bootstrap en fonction du client et depuis la BDD (ou même des fichiers config ini, XML ou peu importe).

Tout ce qui est commun à tout le monde, c'est à dire Models, Acl, Services, etc etc. seraient dans le dossier application/.

Déjà tout ça serait un peu plus conventionnel. Après faut pas chercher des années, la meilleure solution est celle qui te convient et qui te demande le moins d'efforts (en restant dans du propre bien sûr).

Voilà pour une première reflexion, note bien que ce ne sont que des idées, rien de concret, je n'ai pas encore pu revenir sur ces projets pour les ré-organiser. Ce qui est sûr c'est que dans mon projet actuel, j'ai tout déporté au maximum dans des modules qui sont indépendants (parfois inter-dépendants mais rarement). Avec en commun Models, Acls et Services.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#9 27-08-2009 17:50:26

Eureka
Membre
Date d'inscription: 18-07-2009
Messages: 81

Re: [R&D Architecture]Back Office modulable commun à plusieurs sites ?

Salut (et merci pour l'étendue de la réponse !),

J'ai quelques idées / questions, dans la foulée de la lecture. Je t'en fais part :-)

* Détection du site
Je ne sais pas de quelle manière tu sais dans l'index de quel client il s'agit (?) mais pour ma part cela est défini dans un virtualhost, sous forme de variable d'environnement (qui est donc récupérée par index.php qui définiera les constantes de chemins de l'application en fonction de la valeur de cette variable (ex. getenv('client') renverrait 'client1', 'client2', ..., en fonction du virtualhost utilisé donc)

* Relation entre contrôleurs
J'imagine que les contrôleurs spécifiques pour un client (/modules/client/controllers) permettent  par exemple d'ajouter de nouvelles pages pour le site donné, mais penses-tu également à la possibilité qu'ils étendent ou remplacent des contrôleurs par défaut (ceux de /application/model/controllers/) ?

Pour ma part j'y ai réfléchi. La mise en pratique de l'héritage paraît aisément logique, mais la mise en pratique de la substitution un peu moins :
- pour un héritage : peu de problèmes, car le contrôleur du module aura le namespace du module et pourra donc hériter du contrôleur par défaut sans qu'il y ait de conflit de nom ([Default_]IndexController vs Client1_IndexController)
- pour une substitution : comment spécifier à ZF qu'il doit vérifier dans le dossier /controllers du client s'il existe un contrôleur et de l'utiliser (ex: Client_IndexController) et que s'il ne le trouve pas ici il aille prendre celui par défaut ([Default_]IndexController) ?

Les solutions que j'y verrais sont :
- solution 1 : surcharger la méthode instanciant les contrôleurs d'actions en lui demandant de vérifier si un contrôleur existe dans le /module/client et si ce n'est pas le cas prendre celui du niveau d'au-dessus.
- solution 2 (contraignante) : la plus simple mais la moins "sympa" serait que chaque /module/client/ redéfinisse chaque contrôleur par défaut et en hérite, et que pour une substitution on retire simplement le extends [Default_]SameController'. Mais du coup cela implique que chaque client possède tous les contrôleurs définis par défaut... plutôt "lourd" en soit.

* Les modules
D'après ce que je comprends par la suite, les fonctionnellement parlant modules, c'est à dire "auth", "news", ... sont des /modules/ au sens ZF au même titre que "Client1", "Client2", ..., sans distinction particulière dans l'arborescence ?

Et les modèles, que tu dis être des "modules" dans /application/, tu les basculeraient également dans l'arbo /modules/ ? (ils sont fonctionnellement tout aussi commun aux modules clients que le sont les modules "auth" ou "news", non ?

Du coup petite question m'interpelant : des modules dans /application (modèles de site), dans /modules (clients + fonctionnalités), tu les gères tous comme des modules au sens ZF, à savoir utilisable avec Zend_Loader_Module_Autoloader  ?

Au passage, où gères-tu tes /forms ? dans /models peut-être ?

Je viendrais probablement ajouter à cette discussion les mises en applications opérées dans les semaines qui viennent (pour que ce post continue de déborder d'idées et de retours d'expérience)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages