Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-08-2008 17:59:09

cr0cK
Membre
Date d'inscription: 10-07-2008
Messages: 14

[resolu] Découpage Front office / Back office

Bonjour à tous,


J'aimerais avoir votre avis sur comment gérer les modules / contrôleurs dédiés aux front office et ceux dédiés au back office.
Ma structure ZF est composée de plusieurs modules, dont un CMS, et je ne sais pas trop comment m'y prendre pour déclarer certains contrôleurs publics (dédiés au front), et d'autres private (pour le backoffice) sans que cela devienne un bordel sans nom.

Un exemple bateau pour comprendre :
Cette url pointe vers une page du back office : /cms/article/add
Celle ci vers une page front office : /cms/article/view/mon-article

J'avais pensé à qque chose comme ça :
http://site/private/cms/article/add
et
http://site/public/cms/view/mon-article

... mais je ne vois pas trop comment gérer ça correctement, et récupérer l'info private/public donc un controlleur via _request ou autre.

Vos suggestions sont les bienvenues smile

Dernière modification par cr0cK (22-08-2008 18:35:06)

Hors ligne

 

#2 19-08-2008 18:56:30

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: [resolu] Découpage Front office / Back office

Salut,

Ca devrait répondre à tes besoins : http://www.z-f.fr/forum/viewtopic.php?id=1725

wink

Hors ligne

 

#3 20-08-2008 10:26:07

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [resolu] Découpage Front office / Back office

Actuellement je travail sur un système de gestion de module qui me permettrait de faire de simple copié collé d'un site à l'autre. Ca rejoint tes besoins. Par exemple la structure de mes modules est :

Code:

news/
     backend/
          controllers/
               IndexController.php
               ....
          views/
               scripts/
                    index/
                         insert.phtml
                         update.phtml
                         delete.phtml
     models/
     controllers/
          IndexController.php
     views/
          scripts/
                index/

De cette façon, pour gérer les news en admin, je pioche les bon controlleurs (pour les updates, inserts, ...) dans le dossier backend.

pour savoir si je suis en mode administration et pour lui dire de regarder dans un autre répertoire, j'utilise une route avec une adresse particulière :

Code:

$route = new Zend_Controller_Router_Route(
    'manager/:module/:controller/:action/*',
    array(
        'module'     => 'admin',  //module par défault
        'controller' => 'dashboard',  //controller par défault
        'action' => 'resume',  //action par défault
        '_isAdmin' => 'True',
        '_isModule' => 'True'
    )
);

"_isAdmin", m'indique que c'est une route réservé à l'admin. je vérifie également que je suis bien dans la gestion d'un module grâce au paramète "_isModule". Puis j'ai un plugin qui vérifie les paramètres et change le répertoire.

J'ai pas les dossiers sous la main car c'est un projet assez récent que je développe chez moi, donc je posterais mes sources ce soir.

Je me suis inspiré de la logique expliqué par Kaimite et 2mx : http://www.z-f.fr/forum/viewtopic.php?id=1500
Très intéressant !

Je me pose aussi certaines questions au niveau du front/back~office. Par exemple est ce que c'est logique de mettre dans le dossier module les fichiers pour ces 2 parties ? Est ce que le dossier modules ne devrait pas être uniquement consacré au modules news, forum, clients,...

pour le moment j'ai ça dans le dossier module :

Code:

modules/
     clients/
     front/ (pas de module default)
     admin/
     news/
     module.../

Si t'as des ressources à ce sujet, je suis preneur.

a++

Hors ligne

 

#4 20-08-2008 11:19:43

lethak
Membre
Lieu: France
Date d'inscription: 05-04-2008
Messages: 168

Re: [resolu] Découpage Front office / Back office

@cr0cK:

vu d'ici, un simple system de routes devrais te convenir !

routes.ini :

Code:

[BO-cms-article-add]
  route = "cms/article/add"
  default.module = backoffice
  default.controller = cms
  default.action = addarticle

[FO-cms-article-view]
  route = "cms/article/view/:monArticle"
  default.module = frontoffice
  default.controller = cms
  default.action = view

a toi de faire pointer la route ou tu le désire

Dernière modification par lethak (20-08-2008 11:22:02)


IT Dev @Twitter

Hors ligne

 

#5 20-08-2008 11:44:34

cr0cK
Membre
Date d'inscription: 10-07-2008
Messages: 14

Re: [resolu] Découpage Front office / Back office

Merci pour vos réponses.

J'ai lu les autres threads copiés collés plus haut, ça me donne des idées mais ca ne réponds qd même que partiellement à mon pb.

En fait, j'ai une structure un peu plus complexe. J'ai x modules (default / cms / system / newsletters...) avec pour chacun d'eux un BO et un FO (BackOffice / FrontOffice).
Donc le coup de faire un module BO qui rassemble l'ensemble des interfaces BO de tous mes modules, c'est pas envisageable. J'aimerais pouvoir mettre dans un module CMS par exemple, l'ensemble de ses contrôleurs BO et FO. Même chose pour le front, je peux pouvoir définir des contrôleurs front par module, et non un big module Front qui contient l'ensemble des contrôleurs front. (Je me répète un peu).

Mais l'idée des routes est qd même je pense une bonne solution. Je vais y regarder.
L'idée serait d'intégrer un rep supplémentaire 'public' ou 'admin' avant le module :

http://monsite/public/cms/article/vew...
http://monsite/admin/cms/article/add

Et avec un _admin récupéré par un plugin du Front, ca devrait être jouable pour faire le nécessaire des pages admin (Checker l'ACL, charger les CSS / JS and co des pages BO, etc).

Je vais expérimenter tout ça, je vous fais un retour d'expérience ds qques jours smile

Si d'autres avis/xp, je suis toujours preneur !

Hors ligne

 

#6 20-08-2008 12:04:23

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [resolu] Découpage Front office / Back office

As-tu lu mon post ? ou il n'est peut-être pas assez clair ?

crOcK a écrit:

En fait, j'ai une structure un peu plus complexe. J'ai x modules (default / cms / system / newsletters...) avec pour chacun d'eux un BO et un FO (BackOffice / FrontOffice).
Donc le coup de faire un module BO qui rassemble l'ensemble des interfaces BO de tous mes modules, c'est pas envisageable. J'aimerais pouvoir mettre dans un module CMS par exemple, l'ensemble de ses contrôleurs BO et FO. Même chose pour le front, je peux pouvoir définir des contrôleurs front par module, et non un big module Front qui contient l'ensemble des contrôleurs front. (Je me répète un peu).

Ca n'est pas ce que j'ai expliqué. Chaque module possède un repertoire (Backend) qui possède les controllers et les vues pour l'admin. Sinon le dossier de ton module possède sa partie FO avec le dossier controllers et views...
L'arbo de mon précendent post concerne un seul module et pas toute l'appli XD. Car on travaille tous avec des applis avec une "structure un peu plus complexe":

Code:

application/
     config/
     locale/
     models/
     modules/
          news/
               ---- ICI arbo du module (cf post précédent) ----
          cms/
          default/
          etc/
library/
public/
index.php

Ce qui répondrait, je pense exactement à ce que tu recherche...

a+

Hors ligne

 

#7 20-08-2008 12:17:16

cr0cK
Membre
Date d'inscription: 10-07-2008
Messages: 14

Re: [resolu] Découpage Front office / Back office

sisi j'avais bien lu smile

Mais c vrai que gt resté sur la lecture de http://www.joecarbure.com/dw2/doku.php? … ec_modules qui rassemble donc tous les contrôleurs front et BO dans 2 modules.

Je pense que je vais faire une structure très ressemblante à ta proposition Roulio, je check ça.

Hors ligne

 

#8 22-08-2008 18:34:09

cr0cK
Membre
Date d'inscription: 10-07-2008
Messages: 14

Re: [resolu] Découpage Front office / Back office

Petit feedback :

J'ai donc implémenté un fonctionnement sur le même model que celui de Roulio mais avec une route plus générique (inspiré du tuto de acharrex pour les langues) :

Code:

$front = Zend_Controller_Front::getInstance();

// Declare access route
$front->getRouter()->addRoute(
    'default',
    new Zend_Controller_Router_Route(
        '/:access/:module/:controller/:action/*',
        array (
            'access' => 'public',
            'module' => 'default',
            'controller' => 'index',
            'action' => 'index'
        )
    )
);

Je récup donc partout un paramètre access depuis _request qui ne se limite d'ailleurs pas qu'à public/admin.

Mon arbo est la suivante :

Code:

/application
    /modules
        /cms
            /public
                /controllers
                /view
            /admin
                /controlleurs
                /view
            /autre_acces_possible
                /controlleurs
                /view
            /models
        /...

Un plugin front se charge de définir pour l'ensemble des modules où chercher les controleurs avec un setControllerDirectory().
Si je trouve pas de paramètre access, répertoire 'public' par défaut. Utile dans le cas d'un module qui n'aurait pas de back office, ca allège un peu l'arbo...

Code:

public function routeShutdown()
{
    $front = Zend_Controller_Front::getInstance();
    $request = $front->getRequest();
    $pathControllers = PATH_MODULES . '/' . $request->getParam('module') . '/' . $request->getParam('access') . '/controllers';

    //default controllers path
    if (!is_dir($pathControllers)) {
        return;
    }

    //set controllers directories
    $controllersDirectories = array();

    $dir = new DirectoryIterator(PATH_MODULES);
    foreach ($dir as $d) {
        if (!$d->isDot() && strpos($d->getFilename(), '.svn') === false && strpos($d->getFilename(), '_sample') === false) {
            $controllersDirectories[$d->getFilename()] = $d->getRealPath() . '/' . $request->getParam('access') . '/controllers';
        }
    }

    $front->setControllerDirectory($controllersDirectories);

    //set access to namespace
    _namespace()->access = $request->getParam('access');
}

Et ensuite, tjs dans le plugin, un preDispatch() permet de checker qu'un user est bien auth, sinon redirection.
C'est sympa, car dès que je tape dans une url /admin..., je sais que le user devra obligatoirement être logué pour y accéder.

Code:

/**
 * Check authentification for admin side
 */
public function preDispatch()
{
    //if admin side && auth module, not need to check authentication
    if (self::isAdmin() && $this->_request->getModuleName() == 'auth')
        return;

    //if admin side, check authentification
    if (self::isAdmin() && (!Zend_Auth::getInstance()->hasIdentity() || is_null(_namespace()->loggedUser))) {
        $this->redirectToLogin();
    }
}

## PROTECTED

/**
 * Redirection to the login page
 */
protected function redirectToLogin()
{
    //sav the url before redirection
    _namespace()->urlBeforeAuthentification = $_SERVER['REQUEST_URI'];

    $this->_request->setParam('access', self::_ADMIN);
    $this->_request->setModuleName('auth');
    $this->_request->setControllerName('index');
}

Il y a qu'un truk que j'aimerais faire mais qui pour l'instant ne marche pas, c'est de gérer un paramètre access par défaut :
Que http://site.com/cms/news == http://site.com/public/cms/news

Ca doit être possible avec Zend_Controller_Router_Route_Regex, mais pour l'instant ca veut pas sad

Dernière modification par cr0cK (22-08-2008 18:37:19)

Hors ligne

 

#9 25-08-2008 09:24:15

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [resolu] Découpage Front office / Back office

Salut crOcK,

énorme! t'as trouvé sans que j'ai besoin de mettre les sources, on a plus ou moins la même chose.

crOcK a écrit:

J'ai donc implémenté un fonctionnement sur le même model que celui de Roulio*** mais avec une route plus générique (inspiré du tuto de acharrex pour les langues) :

*** sur celui de Kaimite et 2mx wink Merci à tout les deux.


Par contre je vois que tu maîtrise certainement mieux que moi l'utilisation des phases de déroulement du framework. J'ai un peu de mal à savoir comment utiliser, routeShutdown, predispatch... idem pour protected, private & public malgré que je connais leur définition, je ne sais pas trop comment les utiliser du coup pratiquement toutes mes méthodes sont "public".


crOcK a écrit:

Il y a qu'un truk que j'aimerais faire mais qui pour l'instant ne marche pas, c'est de gérer un paramètre access par défaut :
Que http://site.com/cms/news == http://site.com/public/cms/news

Ca doit être possible avec Zend_Controller_Router_Route_Regex, mais pour l'instant ca veut pas sad

J'ai réfléchi à cette question, il faut éventuellement paramétrer dans les options par défaut l'accès ? par exemple :

Code:

$front->getRouter()->addRoute(
    'default',
    new Zend_Controller_Router_Route(
        '/:module/:controller/:action/*',
        array (
            'access' => 'public',
            'module' => 'default',
            'controller' => 'index',
            'action' => 'index'
        )
    )
);

? Mais je ne pense pas que ce soit la meilleure des façons. (si il y a des experts qui passe dans le coin wink )

Hors ligne

 

#10 25-08-2008 10:33:16

cr0cK
Membre
Date d'inscription: 10-07-2008
Messages: 14

Re: [resolu] Découpage Front office / Back office

@Roulio :

Pour les différentes phases du contrôleur, check cette page, ça devrait t'aider :
http://framework.zend.com/manual/fr/zen … ugins.html

Pour les accès des méthodes, un premier raisonnement consiste à se dire :
Est-ce que ma méthode a besoin d'être accessible à l'extérieur de ma classe ? Si non, alors elle doit être private ou protected. Et là tu te reposes une autre question : Est-ce que j'ai envie que cette méthode soit accessible par une classe dérivée ? Si oui, alors elle est protected.

J'ai mis redirectToLogin() protected car je n'ai pas envie qu'on puisse l'appeler n'importe où, j'autorise seulement la classe et celles qui en dérivent à y accéder.

Voilà, sinon si on revient au sujet :
J'ai déjà param une valeur par défaut de access, 'public' en l'occurrence mais si j'omets l'accès dans l'url, ça explose ce qui parait plutôt logique. Je ne me suis pas repenché sur le sujet, c'est pas critique, j'y regarderai un peu plus tard mais ça me semble pas impossible, et c surement pas trop dur à faire avec Zend_Controller_Router_Route_Regex donc. Faut 'juste' lui dire de prendre le premier param de manière facultative, 'public' si absent. La doc traite plus ou moins le cas de figure avec un nombre.

A voir smile

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