IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Création d'un chemin de fer


Sujet :

MVC PHP

  1. #1
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut Création d'un chemin de fer
    Bonjour,

    Je post ici un code que j'ai développé qui permet de créer le chemin de fer sur un site.

    étant débutant avec le modèle MVC et zend framework, j'attend de vous de me dire ou sont mes erreurs dans la construction. Par exemple, à savoir si la boucle while qui construit le chemin, ne devrait pas plutôt se situé dans la vue, et non le controleur. Toutes vos critiques sont bonne à prendre!

    comme je n'ai vu que très peu de code concernant la création d'un chemin de fer, ca pourra peut-être aider certaine personne

    table.sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE `pages` (
    	`Id` INT NOT NULL AUTO_INCREMENT ,
    	`Id_page` VARCHAR(255) NOT NULL ,
    	`Titre` VARCHAR( 255 ) NOT NULL ,
    	`Mots_cles` VARCHAR( 255 ) NOT NULL ,
    	`Description` VARCHAR( 255 ) NOT NULL ,
    	`Contenu` TEXT NOT NULL ,
    	`Id_parent` VARCHAR(255) NOT NULL ,
    	PRIMARY KEY ( `Id` )
    );
    zendf\application\controllers\IndexController.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    class IndexController extends Zend_Controller_Action 
    {
    	function cheminAction()
    	{
    			$this->view->title="chemin";
     
    			// instanciation
    			$pages = new Pages();
     
    			// je récupère la vue ou je me situe
    			$vue = basename($_SERVER['REQUEST_URI']);
    			$vue == "public" ? $Id_page="index" : $Id_page = $vue;
     
    			// initialisation des variables a vide
    			$chemin = $Id_parent = "";
     
    			// tant que
    			while($Id_parent != 'end')
    			{
    				// j'exécute un select sur la page ou je me situe
    				$this->view->chemin = $pages->getPages($Id_page);
    				// je récupère le titre de la page
    				$chemin_page_en_cours = '<a href=' . $this->view->url(array("controller"=>"index","action"=>"$Id_page")) .'>'.$this->view->chemin[0]->Titre.'</a>';
    				// si je ne suis pas sur la page d'acceuil
    				// alors il y a une page précédente donc j'insère ma fèche
    				if($Id_page != 'index')
    				{
    					$chemin_page_en_cours="&nbsp;&raquo;&nbsp;".$chemin_page_en_cours;
    				}
    				// je concatene 
    				$chemin = $chemin_page_en_cours.$chemin;
    				// je récupere l'id parent, le noeud auquel est rataché ma page
    				$Id_page = $Id_parent = $this->view->chemin[0]->Id_parent;				
    			}
    			$this->view->chemin = $chemin;		
    	}
    }
    zendf\application\models\Pages.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Pages extends Zend_Db_Table{
    	public function getPages($idpage)
    	{	
    			$select = $this->select();
    			$select->from('pages');
    			$select->where('Id_page = ? ',$idpage);		
    			$res = $this->fetchAll($select);	
    			return $res;
    	}
    }
    zendf\application\views\scripts\index\chemin.phtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php		
    			echo $this->chemin;	
    ?>
    J'attend vos avis.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Salut miya,

    Je regarderai en détails plus tard mais pour l'instant voici qques petites remarques:

    1. Je ferais effectivement la contruction du lien dans la view et même pour être plus en accord avec le framework, dans une aide de vue (helper).

    2. Dans le controller, je n'utiliserais pas $_SERVER['REQUEST_URI'] mais plutôt $this->getRequest()->getRequestUri(). Maintenant si tu es dans la vue, tu peux utiliser $this->url().

    3. C'est du détails, mais tu n'est pas obligé de spécifier le from quand tu génères le select à partir de la table visée

    Voilà, c'est tout pour le moment

  3. #3
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Merci! Je prend note des remarques

  4. #4
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    Je pense que le meilleur endroit pour poser ce code est dans un view helper.

    comme ça tu n'aura pas de code dans ta vue et tu n'aura pas de code purement applicatif dans tes contrôleurs, vu qu'un chemin de fer est seulement une aide à la navigation, donc de l'ergonomie

  5. #5
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    ok! je connais pas encore les view helper donc ce sera l'occasion d'apprendre

  6. #6
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Je continue dans la correction de mon code.

    objectif : basculer mon code du controller dans un view_helper pour être en accord avec le MVC.

    le view_helper

    dans "application\views\helpers" > je créé mon ficher, par exemple, "CreationChemin.php" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    <?php
    class Zend_View_Helper_CreationChemin
    {
        function creationChemin()
        {
     
    		// je récupère la vue ou je me situe
    		$vue = basename($this->getRequest()->getRequestUri());
    		$vue == "public" ? $Id_page="index" : $Id_page = $vue;
     
            return $vue;
        }
    }
    A partir de la je voudrais tester, dans ma vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
                    echo $this->CreationChemin();
    	?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to undefined method Zend_View_Helper_CreationChemin::getRequest() in C:\wamp\www\webspace\application\views\helpers\CreationChemin.php on line 8

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Salut Miya,

    De mon côté, je n'ai pas la même signature de classe.
    J'ai un signature propre à mes helpers et j'étends Zend_View_Helper_Abstract, regarde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     // Fichier ShortDate.php
    class Custom_View_Helper_ShortDate extends Zend_View_Helper_Abstract {
     public function shortDate() {
     }
    ...
    }
    Pour que cela fonctionne, je dois renseigner dans le préfix et le chemin vers mes helper dans le bootstrap.php, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    $view = new Zend_View();
    $view->addHelperPath('../application/defaults/views/helpers', 'Custom_View_Helper');
    $view->doctype('XHTML1_STRICT'); // Ici je précise déjà le doctype pratique pour règler les problèmes de balises fermante avec Zend_Form
    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
    $viewRenderer->setView($view);
    ...
    Voilà, j'espère que ca va pouvoir te faire avancer un peu

  8. #8
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    ok, c'est qu'ici il procède d'une autre manière :

    http://g-rossolini.developpez.com/tu...page=vue#LIV-A

    § IV-C. Ajout de styles

  9. #9
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Je suis sous la doc de zend, et je pense comprendre ce que tu me dis.

    Au §53.4.2. Chemin des aides, il te dise que par défaut les view_help sont dans zend/views/helpers, sauf si tu veux pointer sur un autre répertoire, tu dois lui dire par l'intermédiaire de setHelperPath() et addHelperPath() (le dernier permettant d'empiler les view_help).

    Dites moi si je me trompe


    Sinon, le pb vient de getRequest() qui ne connait pas!

    J'ai plusieurs questions :

    1/ comment accéder a l'url dans mon view helper?
    ****EDIT****
    auto-réponse :

    dans mon help_view, je récupère ma vue ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public $view;
     
        public function setView(Zend_View_Interface $view)
        {
            $this->view = $view;
        }
    2/ j'instancie toujours dans mon controllers (?) , comment je fais pour récupérer l'instanciation dans mon view_helper?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Salut myia,

    Je vais tenter de t'expliquer la mise en place du fil d'ariane sur mon projet (www.seetiz.be).

    Tout d'abord un peu de raisonnement basique.
    1. Le fil d'ariane est sensé arriver sur toutes tes pages et c'est le même traitement à chaque fois.
    2. Il faut différencier l'affichage du calcul d'url

    Ceci établi, le meilleur endroit pour mettre le traitement n'est pas le controller puisque tu peux en avoir plusieurs et donc répéter du code. Il faut faire le traitement avant d'arriver au controller, ce qui te laisse comme option les Plugins. De plus tu as besoin de ton objet request initialisé, donc au plus tôt, il doit agir sur l'évènement routeShutdown.

    Idem pour l'affichage, il faut éviter la répétition de code, donc le View Helper est la meilleure solution. De plus si tu utilises Zend_Layout, tu es carrément mieux d'appeler cet helper dans la view du layout.

    Tu vas me demander, comment faire fonctionner le tout.
    Très simple, dans ton plugin, tu calcules ton url et même le libellé que tu sauves dans la session (avec un namespace réservé pour ton fil d'ariane).
    Il ne te reste plus qu'a mettre en forme et à afficher le contenu de ta session dans ton View Helper.

    J'espère que c'est clair, n'hésites pas si il y a quelque chose que tu ne comprends pas.

    A+,
    Olivier

  11. #11
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    salut oliviercuyp,

    Deja je te remercie pour toutes ces précisions.

    J'avais surement du oublié de préciser que ca faisait depuis seulement qqjours que je commencais a m'amuser avec zend

    Avec tout ce que tu viens de me dire, tu me fais paniqué Moi au vue des remarques cités plus haut, je pensais que le code dans le controllers qui construisait le chemin, je devais le mettre dans le view_helper.. non?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Salut miya,

    Bon, j'ai bien regarder ton code du premier post.
    La différence entre ton chemin de fer et le miens, c'est que le tien est static.
    En gros, chaque page a un et un seul fil d'ariane qui est retenu dans la db grâce à tes idParent. Dans mon cas, j'utilise la session pour stocker le vrai chemi parcouru par l'utilisateur.
    Donc tu peux remplacer la session par Zend_Registry.

    Je vais tenter d'appronfondir un peu le système Plugin + Helper.
    D'abord un petit schéma pour bien comprendre où les plugins interviennent (et tout le system MVC par la même occasion) :



    Comme tu peux le voir, les plugins sont des objets appeler à différents moments du cycle MVC (routeStartup, routeShutdown, ...).
    Au moment du routeShutdown, l'objet request a été initialisé par le router avec les elements de la route (module, controller, action, params, ...).

    C'est à se moment là que ton plugin de chemin de fer doit interpréter le route pour construire le chemin.
    Voici à quoi ressemble un plugin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class My_Plugin_CheminDeFer extends Zend_Controller_Plugin_Abstract
    {
      public function routeShutdown(Zend_Controller_Request_Abstract $request) {
    /* Contruction de $chemin sous forme de array() genre :
     chemin[0] = array('label' => 'monLabel', 'url' => 'monUrl')
     chemin[1] = array('label' => 'autreLabel', 'url' => 'autreUrl')
     ...
    */
       Zend_Registry::set('chemin', $chemin);
      }
    }
    Ici, pour être en pahse avec la philosophie MVC, tu ne gardes que les données essentielles pour la construction de ton chemin de fer. La couche présentation sera gérée par ton View Helper.

    Pour enregistré ton plugin, il te suffit de faire ceci dans ton bootstrap.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ini_set('include_path',
      '/dossier/des/plugins'
      .PATH_SEPARATOR.get_include_path()
    );
    ...
    $front = Zend_Controller_Front::getInstance();
    ...
    $front->registerPlugin(new My_Plugin_CheminDeFer());
    ...
    Maintenant que tu as fait ceci. Il ne te reste plus qu'a interpréter ce que tu as mis dans la registry grâce à ton helper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    public function cheminDeFer() {
     $output = 'Vous êtes ici: ';
     $chemin = Zend_Registry::get('chemin');
     foreach($chemin as $link) {
      $output .= '<a href="'.$link['url'].'">'.$link['label'].'<a>&nbsp;';
     }
    return $chemin;
    }
    Dans ta view, tu n'auras plus qu'à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    <?= $this->cheminDeFer() ?>
    ...
    Cela te permet d'avoir une découpe clair de ton code et que chaque element s'occupe uniquement de son métier. Ainsi, tu pourras changer facilement le rendu de ton chemin dans ton helper (par exemple le mettre sous forme de liste <ul><li>) sans toucher à la logique de calcul de celui-ci.

    De plus, les controllers n'interviennent plus du tout dans la gestion du chemin de fer et donc tu n'as pas de redondance de code

    J'espère avoir été plus clair, cette fois-ci. N'hésite pas si il reste des zones d'ombre.

    PS: Jète tjrs un oeil ici, ça vaut tjrs la peine

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Attention, je suis parti de l'hypothèse que tu as un chemin de fer identique pour toutes les pages de ton site.
    Si ton chemin de fer n'est valable que pour un controller, tu peux évidemment déplacer le code du plugin dans l'init() de ton controller.
    Tiens moi au courant

  14. #14
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    oliviercuyp,

    Merci pour ta réponse.

    Je pense mettre de coté, ce morceau de code, et y revenir dans quelques jours. Dans l'immédiat, je vais m'attarder sur le zend_form, qui je pense me permettra de mieux aborder les divers aspect.

    On se tient au courant

  15. #15
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    J'ai tenté de rectifier, "au mieux", mon code. Je ne suis pas arrivé à tout ce que tu m'as dit oliviercuyp, mais je 'pense' que c'est déjà mieux qu'au départ :

    IndexController.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    class IndexController extends Zend_Controller_Action {
    	function cheminAction(){
    			$this->view->title="chemin";
     
    			$pages = new Pages();
     
    			$vue = basename($this->getRequest()->getRequestUri());
    			$vue == "public" ? $Id_page="index" : $Id_page = $vue;	
     
    			$this->chemin = array();
    			$this->line = 0;
     
    			while($Id_page != 'end'){
    				$select = $pages->select();
    				$select->where('Id_page = ?', $Id_page);
    				$row = $pages->getPagesRow($select);
    				$this->chemin[$this->line] = $row->Id_page;
    				$this->line ++;
    				$Id_page = $row->Id_parent;
    			}
    			$this->view->chemin = $this->chemin;
    	}
    chemin.phtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php			
    			$chemin ="";
    			foreach($this->chemin as $valeur){
    				$chemin_page_en_cours = '<a href='.$this->url(array("controller"=>"index", "action"=>"$valeur")).'>'.$valeur.'</a>';
    				if($valeur != 'index'){
    					$chemin_page_en_cours="&nbsp;&raquo;&nbsp;".$chemin_page_en_cours;
    				}
    				$chemin = $chemin_page_en_cours.$chemin;
    			}
    			echo "vous êtes ici : " . $chemin;	
    ?>
    Pages.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class Pages extends Zend_Db_Table_Abstract{
    	protected $_name = 'pages';
    	protected $_primary = 'Id';
     
    	public function getPagesAll(){			
    		return $this->fetchAll($this->select());	 
    	}
     
    	public function getPagesRow($select){
    		return $this->fetchRow($select);
    	}
     
    	public function getPagesFind($idpage){			
    		return $this->find($idpage)->current();	 
    	}

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Bonjour Miya,

    Il y a qques petites choses que je ne comprends pas dans ce que tu as fait.

    Ton IndexController gère juste le chemin de fer ? Sinon comment fais-tu pour avoir ton chemin de fer dans tes pages vu que c'est des actions séparées ?

    La solution la plus simple aurait été de mettre le code de ton 'cheminAction' dans la funciton init() de ton controller et de mettre le code de ton chemin.phtml dans un view helper que tu peux appler dans chaqu'une de tes view...

    Mais j'ai peut-être raté un épisode ou une partie de ton code est manquante pour que je comprenne ce que tu fais.

    Tiens moi au courant,
    Olivier

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    Je m'interroge également sur la création d'un chemin de fer. Je suis également toute "fraiche" sur Zend mais je me "régale".
    Merci Olivier pour tes explications qui me donnent déjà une bonne piste.
    Mon site est composé d'une page d'accueil, et en dessous j'ai 4 controllers qui gerent 4 parties du site.
    Chaque controller propose un premier niveau avec une liste d'objet puis on peut voir le détail d'un objet puis descendre encore d'un niveau quand on fait des actions sur l'objet.
    Comment puis-je gérer ce chemin d'ariane ?

    Est ce que je dois dans chaque action de chaque controller ajouter un item dans mon chemin quand je suis dans une action qui descend et retirer le dernier item quand je suis dans une action qui remonte ?

    Je vais donc intervenir sur mon fil d'ariane un peu partout.
    Dans ce cas, est ce que l'utilisation d'un pluggin est adapté ?

    Merci d'avance de tes précisions.

    Nathalie

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Finalement j'ai implementé mon fil d'ariane en m'inspirant de vos infos.
    Pour ceux que ca pourrait interesser voici comment je l'ai fait :

    J'ai une classe chemin qui gère la construction et la mémorisation en session du chemin de fer :

    Mon chemin de fer est géré avec des niveau. Chaque action doit savoir à quel niveau du chemin elle va intervenir.
    La page d'accueil est le niveau zero, la methode index que chaque controller est le niveau 1, les autres sont en niveau 2 voir 3,...
    Chaque action mets a jour le fil d'ariane de la facon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // je mets a jout le fil d'ariane de niveau 1
    Chemin::enregistrer(2,"Mes potagers");
     
    ou
    // je mets a jout le fil d'ariane de niveau 2 avec un libelle de lien dynamique
    Chemin::enregistrer(2,$this->view->potager->nom);
    Voici la classe de gestion du chemin de fer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php 
     
    class Chemin {
     
    public static function init () {
    			// initialisation 
    			$chemin = self::getChemin();
    }
     
     
     
     
    public static function enregistrer ( $niveau , $label ) {
     
    			$fc = Zend_Controller_Front::getInstance();
    			$url =$fc->getRequest()->getRequestUri();
     
    			// je récupère le chemin en mémoire
    			$chemin =self::getChemin();
     
    			// si je suis plus haut que le niveau actueln j'efface tous les niveaux inférieurs
    			$niveau_actuel = count($chemin)+1;
    			if ($niveau_actuel>$niveau) {
    				for ($i=$niveau;$i<=$niveau_actuel;++$i) {
    					unset($chemin[$i]);
    				}
    			}
     
    			// j'enregistre le nouveau niveau actuel
    			$chemin[$niveau]=array('label' => $label , 'url' => $url , 'niv' => $niveau);
     
    			// je mets en session
    			self::saveChemin($chemin);
    } 
     
    // mémorisation du chemin
    private static function saveChemin ($chemin) {
    			// je le remets en session
    			$cheminNS= new Zend_Session_Namespace('Chemin');
    			$cheminNS->chemin = $chemin;
    }
     
    // récupération du chemin en session
    public static function getChemin () {
     
    	$cheminNS= new Zend_Session_Namespace('Chemin');
    	if (isset($cheminNS->chemin)) {
    		$chemin=$cheminNS->chemin;
    	} else {
    		// s'il n'existe pas je l'initialise et je le mets en session
    		$chemin = array();
    		$chemin[0]= array('label' => 'Accueil' , 'url' => '/', 'niv' => 0);
    		// je le remets en session
    		$cheminNS->chemin = $chemin;
    	}
    	return $chemin;
    }
     
     
     
    }
    ensuite j'ai un helper qui fait la mise en page, avec un appel dans mon layout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="ariane"><? echo $this->cheminDeFer(); ?></div>
    Voici le helper du fil d'ariane
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?php
    class Zend_View_Helper_CheminDeFer
    {
     
    public function cheminDeFer() {
    	// je crécupère le chemin
    	 $chemin = Chemin::getChemin();
    	 $output = '';
     
    	 $sep="";
    	 foreach($chemin as $link) {
    	  $output .= $sep.'<a href="'.$link['url'].'">'.$link['label'].'<a>&nbsp;';
    	  $sep="&nbsp;&gt;&nbsp;"; 
    	 }
    		return $output;
    }
     
    }

    Il me reste un petit problème c'est que je gère également quelques raccourcis de navigation dans mon site et que je peux retourner a un emplacement de niveau 2 directement depuis n'importe quel point du site et que dans ce cas, seul le niveau 2 est mis a jour et il se retrouve donc en incohérence avec les niveaux supérieurs qui correspondent à l'emplacement précédent.

    Voila, j'espere que ca pourra aider quelqu'un

    Nat

Discussions similaires

  1. [PHP < 5] Création d'un chemin jusqu'à un répertoire
    Par Swoög dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 0
    Dernier message: 14/02/2011, 19h18
  2. [1.x] Chemin de fer en symfony
    Par etoileweb dans le forum Symfony
    Réponses: 5
    Dernier message: 05/11/2010, 05h48
  3. Parcours Chemin de fer (1 table)
    Par olifile dans le forum Requêtes
    Réponses: 5
    Dernier message: 12/06/2010, 03h58
  4. mon chemin de fer n'arrive pas à démarrer!
    Par kayorn dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 02/06/2009, 21h55
  5. Création de fil d'ariane (Chemin de fer)
    Par rad_hass dans le forum ASP.NET
    Réponses: 0
    Dernier message: 24/11/2008, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo