Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1 2
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
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
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
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
re!
Mon souci n'est pas totalement terminé
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' ) 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
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
up!
Hors ligne
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
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 parce que ce type de route existe bien
Et merci de ton aide!
Hors ligne
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
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
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.
Hors ligne
<?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
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
Faire le var_dump dans la partie catch() c'est à dire?
Hors ligne
Je veux dire juste avant le throw (je n'avais pas le code sous les yeux) :
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
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
Et les paramètres ?
Hors ligne
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
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
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
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
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
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
Hors ligne
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
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
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
Pages: 1 2