Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-02-2008 09:39:23

or4cle
Membre
Date d'inscription: 18-02-2008
Messages: 70

[Zend_Layout] et application modulaire

Bonjour à tous, je suis nouveau ici et j'espère que je pourrais apprendre plein de choses grâce à ce forum sur ZF

précision avant de commencer : ce que j'appelle "appli modulaire ou module n'ont rien à avoir avec les modules de ZF, je n'utilise pas le principe de "module" du ZF pour l'instant

J’apprends à utiliser le ZF depuis un peu plus de 15 jours, j’ai lu les différents tuto sur developez.com plus d’une fois pour bien tout comprendre mais j’ai encore pas mal d’interrogation. Je débute aussi avec le MVC, jusqu’à présent je faisais du php à la bourrin (1 index avec full include, c’est ingérable et bien pourrie… donc j’essaye de passer au MVC)

J’ai des questions à propos du Zend_Layout, j’ai du mal à savoir comment l’utiliser de la bonne façon.
Imaginons un site bidon (mais représentatif à mon sens d’un site potentiellement assez classique à créer) contenant une section actualité, une section produit. Donc on aura 2 contrôleurs. (ActuController, ProduitController)
Chaque page du site étant découpé en 3 parties (gauche, centre, droite) donc le template contiendra :

Code:

     <div class="hp-left">
        <?= $this->layout()->left ?>
     </div>
     <div class="hp-center">
        <?= $this->layout()->center ?>
     </div>
     <div class="hp-right">
        <?= $this->layout()->right ?>
     </div>

Une page affichant un produit étant composé de la fiche du produit au centre, d’un module ‘top produit à droite, et d’un module « last actu » à droite.
Pour générer cette vue, je ne sais pas comment je dois faire :
L’action principale est sera « voirAction » dans ProduitController qui va récupe du model les données du produit et cette action appellera $this->render() qui sera affiché dans la partie center.
Mais pour générer les modules « top produit » et « last actu », dois-je en faire 2 actions que je placerais dans le ProduitController et ActuController et que j’appellerais de la façon suivante ? :

Code:

   public function voirAction()// ds ProduitController
    {
    // get Data produit from model
    $this->render(‘fiche’) ;

    // appel de l’action pr afficher le top prduit
$this->_helper->actionStack('topProduit,'produit','null',$param);

// appel de l’acton “last news’ pr afficher les dernière news
$this->_helper->actionStack('lastActu,’actu','null',$param);

}

avec…

Code:

    public function topProduitAction() // ds ProduitController
   {
       // get data from model
$this-view->listeProduit = $this->model->getTopProduit(10);
$this->render(‘top-produit’, ‘left’) ;
   }

    public function lastActuAction() // ds ActuController
   {
       // get data from model
$this-view->listeNews = $this->model->getLastNews(10);
$this->render(‘last-actu’, ‘right’) ;
   }

De cette façon, on rend dans chaque partie du template les infos et on obtient la page souhaitée.

Mais je pourrais aussi faire çà par :

Code:

$this->_forward('topProduit',null, null, $param);

ou encore tout mettre dans l’action voirAction() :

Code:

// get Data produit from model
$this->render(‘fiche’) ;

   // get data from model
$this-view->listeProduit = $this->model->getTopProduit(10);
$this->render(‘top-produit’, ‘left’) ;

   // get data from model
$this-view->listeNews = $this->model->getLastNews(10);
$this->render(‘last-actu’, ‘right’) ;

Je me pose toutes ces questions car dans le site que je souhaite recoder via ZF en MVC, toutes mes page sont constituées d’une action principal et le reste de la vue de module que je souhaite pouvoir réutiliser facilement.
Dans la page permettant de lire une actualité, je souhaite pouvoir ajouter le module « lastNews » et le module « topProduit » donc je ne vais pas le recoder mais réutiliser le même bout de code et peut-être le placer dans une autre partie du layout.




J’espère avoir été le plus clair possible et que vos expériences pourront m’aider.

Dernière modification par oracle (25-02-2008 09:40:59)

Hors ligne

 

#2 02-03-2008 15:06:04

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Layout] et application modulaire

Regarde du côté de la fonction init des controllers qui est exécuté pour toutes les actions du controller
Tu aurais ainsi un code du genre

Code:

class ProduitController extends Zend_Controller_Action {

public function init() {
    // appel de l’action pr afficher le top prduit
    $this->_helper->actionStack('topProduit,'produit','null',$param);

    //  appel de l’acton “last news’ pr afficher les dernière news
    $this->_helper->actionStack('lastActu,’actu','null',$param);
}

 public function voirAction()// ds ProduitController
    {
//... init est exécuté avant

    // get Data produit from model
    $this->render(‘fiche’) ;
}

public function autreAction()
    {
//... init est aussi exécuté ici

}

Après tu peux aussi étendre pour tous tes controllers comme ca

Code:

class MyController extends Zend_Controller_Action {
    public function init() {
        //..
    }
}

class ProductController extends MyController {}
class ActuController extends MyController {}

En espérant t'avoir aidé avec ce snippet de code smile

Hors ligne

 

#3 03-03-2008 09:33:22

or4cle
Membre
Date d'inscription: 18-02-2008
Messages: 70

Re: [Zend_Layout] et application modulaire

Merci d'avoir pris 2s pour me répondre.

J'avais aussi pensé à cette possibilité mais cela implique que toute mes actions de ProduitController afficheront toujours le module "topProduit" et "lastNews" puisque init() appellera ces 2 actions.
Or j'aurais peut-être envie d'avoir d'autre action principale dans ProduitController qui n'afficheront pas ces 2 modules (que je devrais peut être mieux appeller 'gadget' en fait)


En tout cas, j'ai déjà une réponse à une de mes question, en continuant à tester, j'ai vu que $this->forward() n'est pas la bonne méthode car si je fait 2 forward d'affilié dans mon action principale, le 2eme n'ajoute pas la vue à droite mais remplace (ce qui est normal d'ailleurs)


En fait, j'ai peut être été un peu trop compliqué dans ma question, ce que je voudrais savoir c'est : en utilisant ZF en MVC avec Zend_Layout, pour générer les différentes pages d'un site (mais constituées en partie de contenu type 'gadget' réutilisable) est-ce que la bonne façon de faire c'est d'ajouter des actions dans la pile d'action ?

Pour créer chaque page, on aura donc un truc du genre :

Code:

nomActionPrincipaleAction()
{
 ...
 $this->render() // rend la vu de l'action principale
 ...
 $this->actionStack('xxxx','controller', null, $param); // appel l'action du gadget ds son controller qui le rendra dans la zone du layout prévue
 ...
 $this->actionStack('xxxx','controller', null, $param);
 ...
 etc jusqu'à ce que toutes les parties de la page à générée soit ajoutée au template.
}

Dernière modification par oracle (03-03-2008 09:35:31)

Hors ligne

 

#4 03-03-2008 09:49:27

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Layout] et application modulaire

Regarde aussi du côté du view helper action() qui te permet d'ajouter des actions directement depuis la vue ou le template.

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