Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-03-2010 23:18:27

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

[zend_navigation] Fils d'ariane pour un forum

Bonjour,

Je développe en zend une ébauche de forum, et j'aimerai avoir un fils d'ariane qui retrace ma navigation comme un peu sur ce forum.

J'ai découvert et réussi à appliquer le navigation()->breadcrumbs() de zend dans un menu standard. Et maintenant je veux essayer de l'appliquer sur une liste dynamique de données. Genre un listing de conversation de forum répartie dans différentes catégories.

Donc je suis partie sur l'idée d'indiqué une uri dans le fichier xml par exemple ceci:

<forum>
<label>Forum</label>
<uri>forum.html</uri>
<class></class>
<pages>
<categorie>
<label>Categorie</label>
<uri>liste-sujet-forum-2.html</uri> //ceci renvoie vers la page qui les liste les conversation de ma 2eme categorie du forum
<class></class>
</categorie>
</pages>
</forum>

Pour le moment ça fonctionne, mais comment je pourrai rendre tout ceci dynamiquement en remplaçant le 2 de <uri>liste-sujet-forum-2.html</uri> par une variable? ou  existe-t-il un moyen de faire comme en php avec un genre de (.+) pour dire qu'il y aurai une valeur variable à cet endroit comme avec les regex.

Car je me vois mal indiquer toutes les combinaisons possible de mes uri à la main.

Et une dernière chose est-il possible d'envoyer dans mon fichier xml le titre de ma categorie dans mon <label> par exemple à partir d'un controller de zend?

Merci de votre aide!

Zed

Dernière modification par zed (24-03-2010 13:13:07)

Hors ligne

 

#2 20-03-2010 13:57:14

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

re!

bon j'ai avancer dans mon problème, au lieu de passer par les uri je suis passé par les routes.

dans ma fonction init de mon controller:

$route = Zend_Controller_Front::getInstance()->getRouter()->getCurrentRouteName();
$activeNav = $this->view->navigation()->findByRoute($route);
$activeNav->active = true;

donc c'est dans mes routes que je gère les paramètres dynamique par exemple les id de mes sujets.

routes.ini:

routes.liste-sujet-forum.type = "Zend_Controller_Router_Route_Regex"
routes.liste-sujet-forum.route = "liste-sujet-forum-(\d+)\.html"
routes.liste-sujet-forum.defaults.module = "Forum"
routes.liste-sujet-forum.defaults.controller = "sujet"
routes.liste-sujet-forum.defaults.action = "listesujet"
routes.liste-sujet-forum.map.1 = "id_suj_forum"
routes.liste-sujet-forum.reverse = "liste-sujet-forum.html"

ensuite dans mon xml j'indique seulement ma route que j'utilise.

navigation.xml:
<forum>
    <label>Forum</label>
    <route>forum</route>
    <class></class>
        <pages>
            <categorie>
            <label>Categorie</label>
            <route>liste-sujet-forum</route>
            <class></class>
            </categorie>
        </pages>                   
</forum>

Tout fonctionne nickel, le seul hic c'est dans mon fils d'ariane ça me donne Forum : Categorie. Ce qui est logique smile
Moi je ce que je voudrai faire c'est éditer le label dans mon fichier xml à partir de mon controller. Comme ça en fonction de la categorie que je clique mon label s'adapte.

Existe-t-il une fonction qui permet d'editer les éléments du fichier navigation.xml?

merci!

Hors ligne

 

#3 23-03-2010 14:11:23

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

re!

c'est bon mon problème est résolu, grâce à ces méthodes là qui ressorte un tableau

$activeLab = $this->view->navigation()->current();
$active = $this->view->navigation()->findActive($activeLab);

ensuite j'ai juste à modifier les champs qui m'intéresse.


voilà
++

Hors ligne

 

#4 24-03-2010 13:37:06

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

re!

Mon souci n'est pas totalement terminé hmm
J'arrive bien à faire mon fils de navigation du genre:

Accueil : Forum : leNomDeMaCategorie

Où Accueil est une page statique, Forum est une page statique et leNomDeMaCategorie est une page dynamique.

fichier navigation.xml:

<forum>
    <label>Forum</label>
    <route>forum</route>
    <class></class>
        <pages>
            <categorie>
                <label>categorie</label>
                <route>liste-sujet-forum</route>
                <class></class>
            </categorie>
        </pages>                   
</forum>

et mon fichier routes.ini correspondant:

routes.accueil.route = accueil.html
routes.accueil.defaults.module = Default
routes.accueil.defaults.controller = index
routes.accueil.defaults.action = accueil

routes.forum.type = "Zend_Controller_Router_Route_Static"
routes.forum.route = "forum.html"
routes.forum.defaults.module = "Forum"
routes.forum.defaults.controller = "index"
routes.forum.defaults.action = "index"

routes.liste-sujet-forum.type = "Zend_Controller_Router_Route_Regex"
routes.liste-sujet-forum.route = "liste-sujet-forum-(\d+)\.html"
routes.liste-sujet-forum.defaults.module = "Forum"
routes.liste-sujet-forum.defaults.controller = "sujet"
routes.liste-sujet-forum.defaults.action = "listesujet"
routes.liste-sujet-forum.map.1 = "id_rub_forum"
routes.liste-sujet-forum.reverse = "liste-sujet-forum-%d.html"

Donc jusque là tout va bien, tout fonctionne nickel. Mais (parce qu'il y a toujours un 'Mais' hmm ) lorsque j'ai deux pages dynamiques dans mon fils ne navigation j'ai l'erreur suivante qui apparaît:

Fatal error: Zend_Controller_Router_Exception: Cannot assemble. Too few arguments? in C:\wamp\www\ZendProjet\library\Zend\View\Helper\Navigation\HelperAbstract.php on line 519


Qu'est-ce que j'ai pour avoir cette erreur?

C'est fois ci je veux un fils de navigation du type:

Accueil : Commentaires : Envoyer un MP à leLoginDuMembreQuiAPoster

où Accueil est une page statique, Commentaires est une page dynamique et Envoyer MP... est une page dynamique aussi.

J'ai testé quelques truc, j'ai remarqué que si commentaire était une page statique aucune erreur n'apparaissait mais bon du coup je ne peux plus afficher les commentaires d'une news précise si j'ai pas de paramètre hmm
Et si j'ai commentaire en page dynamique mes commentaires d'une news s'affiche, mais quand je clique sur un lien qui m'amène vers les MP j'ai la fatal error.

Voici mes routes:

routes.envoyer-mp.type = "Zend_Controller_Router_Route_Regex"
routes.envoyer-mp.route = "envoyer-mp-(\d+).html"
routes.envoyer-mp.defaults.module = "Default"
routes.envoyer-mp.defaults.controller = "index"
routes.envoyer-mp.defaults.action = "envoyermp"
routes.envoyer-mp.map.1 = "id_destinataire"
routes.envoyer-mp.reverse = "envoyer-mp-%d.html"

routes.commentaire.type = "Zend_Controller_Router_Route_Regex"
routes.commentaire.route = "commentaire-(\d+).html"
routes.commentaire.defaults.module = "Default"
routes.commentaire.defaults.controller = "index"
routes.commentaire.defaults.action = "commentaire"
routes.commentaire.map.1 = "id_news"
routes.commentaire.reverse = "commentaire-%d.html"

et voici mon fichier navigation.xml:

<commentaire>
    <label>Commentaire</label>
    <route>commentaire</route>
    <class></class>
        <pages>
            <mp>
             <label>mp</label>
                <route>envoyer-mp</route>
                <class></class>
            </mp>
        </pages>
                               
</commentaire>

D'où peut venir la fatal error? Faut-il que j'indique quelques chose en plus dans ma route 'envoyer-mp' pour qu'il sache qu'il descend de 'commentaire' qui est une page dynamique? Je vois pas du tout comment faire le fils de navigation avec plusieurs pages dynamique...

Merci d'avoir pris la peine de lire ce pavé, parce que je suis un peu perdu.

Zed

Dernière modification par zed (24-03-2010 13:38:14)

Hors ligne

 

#5 25-03-2010 11:29:44

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

up!

Hors ligne

 

#6 25-03-2010 14:05:55

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Bonjour, ce message d'erreur vient de Zend_Controller_Router_Route_Regex, ligne 199:

        $return = @vsprintf($this->_reverse, $mergedData);

$mergedData ne contient probablement pas les arguments demandés.

On peut identifier la cause en faisant un var_dump de $this->_reverse et de $mergedData juste avant l'appel fautif.

Hors ligne

 

#7 25-03-2010 19:50:46

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

en faisant un var_dump($this->_reverse, $mergedData); j'ai ceci :

string(18) "envoyer-mp-%d.html" array(1) { [1]=> &string(2) "17" }

et ensuite j'ai fais un var_dump($return); j'ai ceci:

string(18) "envoyer-mp-17.html" bool(false)

je ne comprends pas pourquoi il me retourne un false hmm parce que ce type de route existe bien


Et merci de ton aide!

Hors ligne

 

#8 25-03-2010 22:15:54

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

j'ai effectué un test dans Zend_Controller_Router_Route_Regex j'ai commenté ceci:

ligne ~ 197 :
if ($return === false) {
       require_once 'Zend/Controller/Router/Exception.php';
      // throw new Zend_Controller_Router_Exception('Cannot assemble. Too few arguments?');
}

donc comme ça je zappe l'exception et le résultat de ma page est correcte. J'ai mon fils de navigation qui apparait correctement:

Accueil : Commentaire : Envoyer MP à LoginDeLauteurDuCommentaire

Mais à une différence c'est que le lien Accueil fonctionne bien il me renvoie vers accueil.html, le lien LoginDeLauteuretc... me renvoie bien vers la page en cours mais par contre le lien Commentaire me renvoie vers au lien vide alors que normalement il devrai me redirigé vers la page où je liste tous les commentaires.

Est-ce que le souci de la fatal error et que j'indique pas la route de l'element parent dans l'element <mp></mp> de mon fichier .xml ?? Car d'après l'erreur il me manquerai un argument...

A votre avis?

Hors ligne

 

#9 26-03-2010 10:46:58

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Tant qu'on y est à modifier le code source, autant enlever le @ de vsprintf comme ça on saura l'origine de l'erreur.

Je précise pour les débutants qui liraient que le code source de Zend ne doit jamais être modifié en production, on le fait ici pour voir ce qui se passe.

Hors ligne

 

#10 26-03-2010 11:21:55

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

oui je l'ai testé ça aussi, c'est pour ça que je pense sur le soucis qu'il manque un argument... donc en enlevant le @ à vsprintf j'obtiens un warning:

Warning: vsprintf() [function.vsprintf]: Too few arguments in C:\wamp\www\ZendProjet\library\Zend\Controller\Router\Route\Regex.php on line 195

et ma fatal error est toujours présente aussi:

Fatal error: Zend_Controller_Router_Exception: Cannot assemble. Too few arguments? in C:\wamp\www\ZendProjet\library\Zend\View\Helper\Navigation\HelperAbstract.php on line 519

En me documentant sur vsprintf.... string vsprintf ( string $format , array $args ) ... et j'ai bien le premier paramètre qui est un string et le second un array.

hmm

Hors ligne

 

#11 26-03-2010 11:34:14

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Code:

<?php
$a = array(1 =>'17') ;
$t = 'envoyer-mp-%d.html' ;
$s = vsprintf($t, $a) ;
var_dump($s) ;
?>

J'ai pas d'erreur là, un caractère est invalide dans la chaîne ?

Il faudrait faire le var_dump() dans la partie catch().

Dernière modification par Zartan (26-03-2010 11:40:31)

Hors ligne

 

#12 26-03-2010 11:47:32

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

Non je ne vois pas de caractère invalide...

la route y correspondant est:

routes.envoyer-mp.type = "Zend_Controller_Router_Route_Regex"
routes.envoyer-mp.route = "envoyer-mp-(\d+).html"
routes.envoyer-mp.defaults.module = "Default"
routes.envoyer-mp.defaults.controller = "index"
routes.envoyer-mp.defaults.action = "envoyermp"
routes.envoyer-mp.map.1 = "id_destinataire"
routes.envoyer-mp.reverse = "envoyer-mp-%d.html"

en retournant un var_dump de $return et de $s de ton script j'ai dans les deux cas:

string(18) "envoyer-mp-17.html"

Hors ligne

 

#13 26-03-2010 11:50:17

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

Faire le var_dump dans la partie catch() c'est à dire?

Hors ligne

 

#14 26-03-2010 11:52:41

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Je veux dire juste avant le throw (je n'avais pas le code sous les yeux) :

Code:

        if ($return === false) {
            require_once 'Zend/Controller/Router/Exception.php';
            throw new Zend_Controller_Router_Exception('Cannot assemble. Too few arguments?');
        }

Dernière modification par Zartan (26-03-2010 11:53:47)

Hors ligne

 

#15 26-03-2010 11:58:15

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

si je fais un var_dump($return) dans le catch() il me retourne

bool(false)

Ce qui est normal vu qu'il rentre dans la conditions non?

Hors ligne

 

#16 26-03-2010 12:00:38

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Et les paramètres ?

Hors ligne

 

#17 26-03-2010 12:03:51

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

ha... si je fais un var_dump($return, $this->_reverse, $mergedData); dans le catch() j'ai ceci:

bool(false) string(19) "commentaire-%d.html" array(0) { }

ce qui veux dire?

Hors ligne

 

#18 26-03-2010 12:35:13

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Ca veut dire que $mergedData est vide, et donc qu'il faut suivre le fil jusqu'à découvrir la source de l'erreur.

var_dump($data) ;
var_dump($this->_defaults) ;
var_dump($this->_values) ;

est un bon début.

Hors ligne

 

#19 26-03-2010 12:41:59

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

oki je te suis, donc ces var_dump dans le catch() me retourne ceci:

$data:
array(0) { }

$this->_defaults :
array(3) { ["module"]=> string(7) "Default" ["controller"]=> string(5) "index" ["action"]=> string(11) "commentaire" }

$this->_values:
array(0) { }

Dernière modification par zed (26-03-2010 12:42:14)

Hors ligne

 

#20 26-03-2010 13:08:25

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

Bon dans la continuité des tests j'ai fais ceci:

echo'<br />1';
var_dump($defaultValuesMapped);
echo'<br /> 2';
var_dump($matchedValuesMapped);
echo'<br />3';
var_dump($dataValuesMapped);

et en retour j'ai ceci dans ma page envoyer-mp-17.html:

1array(0) { }
2array(1) { [1]=> string(2) "17" }
3array(0) { }
1array(0) { }
2array(0) { } // il ne manque pas quelque chose ici en tant normale? (simple question)
3array(0) { }

tandis que dans ma page commentaire-4.html j'ai ceci:

1array(0) { }
2array(1) { [1]=> string(1) "4" }
3array(0) { }

Hors ligne

 

#21 26-03-2010 13:37:23

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

On voit clairement que la route est appelée une première fois avec 'envoyer-mp 'et les bons paramètres, puis une seconde fois avec 'commentaire' sans paramètres.

Si je comprends le problème c'est donc :

accéder à un commentaire pour un article mettons id=4, et envoyer un message dont l'auteur a l'id=17.

Mais quand on connait l'id de l'article, on peut en déduire l'id de l'auteur. Par ailleurs on peut quand même vouloir envoyer un message à un membre par son id.

Le plus simple c'est quand même d'avoir une action statique envoyer-mp-a-l-auteur qui va calculer l'id de l'auteur en fonction de l'article et ensuite de rediriger sur envoyer-mp avec comme paramètre l'id de l'auteur.

On a donc bien besoin de réécrire le fichier navigation en séparant la version regex de envoyer-mp de commentaire, et en ajoutant une version statique en dessous de commentaire : envoyer-mp-a-l-auteur.

Dernière modification par Zartan (26-03-2010 14:45:07)

Hors ligne

 

#22 26-03-2010 15:44:16

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

non il ne s'agit pas de l'auteur de l'article mais l'auteur du commentaire... je réexplique:

J'ai ma page d'accueil qui est statique. Dans cette page je liste tous mes articles.
Ensuite j'ai ma page commentaire qui est une page dynamique car dans l'url je récupère l'id de l'article. Comme ça dans ma page commentaire je liste tous les commentaires en rapport avec un article.
Et enfin dans envoyer-mp qui est une page dynamique aussi car dans l'url je récupère l'id de l'auteur 'd'un' commentaire.

Et quand tu parles d'ajouter une version statique en dessous de commentaire: envoyer-mp-a-l'auteur. C'est un fils de commentaire où vraiment à part de commentaire comme ceci:

<commentaire>
    <label>Commentaire</label>
    <route>commentaire</route>
    <class></class>
        <pages>
            <mp>
                <label>mp</label>
                <route>envoyer-mp</route>
                <class></class>
            </mp>
                        <mpauteur>
                <label>mp auteur</label>
                <route>envoyer-mp-a-l-auteur</route>
                <class></class>
            </mpauteur>
        </pages>
</commentaire>

ou

<commentaire>
    <label>Commentaire</label>
    <route>forum</route>
    <class></class>
        <pages>
            <mp>
                <label>mp</label>
                <route>commentaire</route>
                <class></class>
            </mp>
        </pages>
                               
</commentaire>
<mpauteur>
    <label>mp auteur</label>
    <route>envoyer-mp-a-l-auteur</route>
    <class></class>
</mpauteur>

car si je mets un statique après un element regex, sa plante de la même façon tandis que si mon regex est le dernier élément ça fonctionne hmm

Hors ligne

 

#23 26-03-2010 16:05:57

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

Ah je vois, il est possible d'intervenir au niveau de Zend_Navigation et ajouter les éléments à la volée.

http://framework.zend.com/manual/fr/zen … pages.html

créer des pages et les ajouter en fonction avec addPage() .

Ou alors passer deux paramètres dans envoyer-mp, l'id de l'article et celui du commentaire (ou ceux de leurs auteurs respectifs).

Surcharger Zend_Navigation_Page pour créer une page spécialisée si nécessaire.


je pensais à ça :
<commentaire>
    <label>Commentaire</label>
    <route>commentaire</route>
    <class></class>
        <pages>
              <mpauteur>
                <label>mp auteur</label>
                <route>envoyer-mp-a-l-auteur</route>
                <class></class>
            </mpauteur>
        </pages>
</commentaire>
<mp>
    <label>mp</label>
    <route>envoyer-mp</route>
    <class></class>
</mp>

En ajoutant les pages à la volée, on va pouvoir définir une page pour chaque commentaire, c'est tricher mais faute de mieux ça marchera. Cependant je pense que la vraie bonne solution serait de réécrire la route envoyer-mp avec deux paramètres.

Dernière modification par Zartan (26-03-2010 16:20:28)

Hors ligne

 

#24 26-03-2010 16:51:04

zed
Membre
Date d'inscription: 28-01-2010
Messages: 27

Re: [zend_navigation] Fils d'ariane pour un forum

oki...

sinon là je viens de trouver une autre piste, j'a rajouter ceci dans ma route commentaire

routes.commentaire.defaults.id_news = 4

Et mon fils de navigation fonctionne je n'ai plus de fatal error. Seul soucis c'est que le lien commentaire me redirige que vers les commentaires de la news 4 systématiquement. Vu que je suis dans une regex j'ai tenté de mettre %d à la place mais il me le remplace par 0 dans mon url.

Donc je me suis penché sur le problème, avec

$route = Zend_Controller_Front::getInstance()->getRouter()->getCurrentRoute();
var_dump($route);exit;

j'obtiens ceci:

object(Zend_Controller_Router_Route_Regex)#203 (7) { ["_regex:protected"]=> string(22) "commentaire-(\d+).html" ["_defaults:protected"]=> array(4) { ["module"]=> string(7) "Default" ["controller"]=> string(5) "index" ["action"]=> string(11) "commentaire" ["id_news"]=> string(0) "" } ["_reverse:protected"]=> string(19) "commentaire-%d.html" ["_map:protected"]=> array(1) { [1]=> string(7) "id_news" } ["_values:protected"]=> array(1) { [1]=> string(1) "4" } ["_isAbstract:protected"]=> bool(false) ["_matchedPath:protected"]=> NULL }

Comment je peux faire pour récupérer la valeur ["id_news"] vu que c'est un objet il me crache une erreur quand je fais $route['id_news']...

Mon but là est après de modifier cette valeur par le bon id_news, et si cela ne fonctionne pas je regarderai avec les addPages.

Merci!

Hors ligne

 

#25 26-03-2010 17:05:08

Zartan
Membre
Date d'inscription: 22-06-2009
Messages: 49

Re: [zend_navigation] Fils d'ariane pour un forum

C'est bien pour cela qu'il faut passer deux paramètres:

routes.envoyer-mp.map.1 = "id_news"
routes.envoyer-mp.map.2 = "id_destinataire"

Ca n'existe pas en tant que tel route["id_news"], la valeur est dans le premier champ de _values, et ça correspond à id_news dans _map mais ce n'est pas lié directement.

Dernière modification par Zartan (26-03-2010 17:11:28)

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