Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Parmi ceux qui se sont penchés sur Zend_Navigation, auriez-vous rencontré le problème suivant :
En peuplant un objet Zend_Navigation() d'une arborescence, il est possible de générer des breadcrumbs, menu, sitemap, ...
Ces générations peuvent être soumises à des contraintes (profondeur de l'arborescence désirée, rendu de sous menu d'un élément, ...)
Exemple de menu :
$pages = array( array( 'label' => "Page 1", 'controller' => 'myCtrl', ), array( 'label' => "Page 2", 'controller' => 'mySuperCtrl', ), array( 'label' => "Page 3", 'controller' => 'myCtrl', ), array( 'label' => "Page 4", 'controller' => 'mySuperCtrl', ) );
// on récupère l'objet Zend_Navigation rempli (nb : on peut se passer de $menu, les aides de vues iraient chercher automatiquement l'objet situé dans la clé "Zend_Navigation" du registre, ici elle est "Zend_Navigation_Test") $menu = Zend_Registry::get('Zend_Navigation_Test') // Exemples de génération de menus : echo $this->navigation()->menu($menu); // renvoie : * Page 1 * Page 2 * Page 3 * Page 4 echo $this->navigation()->breadcrumbs($menu); echo $this->navigation()->menu($menu)->setMinDepth(<X>)->setMaxDepth(<Y>); ...
Tout cela fonctionne bien !
Zend_Navigation met également à notre disposition des méthodes de "recherche", à savoir pouvoir rechercher un menu (ou plusieurs) en fonction de son label, son id, les controllers/actions/modules associés ou toute autre propriété accessible aux pages (dont des propriétés personnalisées)
Toutefois, quand on tenter d'utiliser la méthode findAllBy('<criteria>', '<value>'), la valeur retournée n'est pas une vue (génération HTML) mais un array de pages (Zend_Navigation_Page_Mvc) correspondant au critère recherché.
$myCtrlPages = $this->navigation($menu)->menu()->findAllByController('myCtrl'); // équivalent à $myCtrlPages = $menu->findAllByController('myCtrl'); // renvoie un tableau contenant les pages 1 et 3.
Récupérant donc un tableau de pages, si on désire l'utiliser pour afficher un menu le premier réflexe est de l' injecter à nouveau dans un objet Zend_Navigation pour obtenir un rendu, via :
echo $this->navigation()->menu(new Zend_Navigation($myCtrlPages)); // renvoie bien : * Page 1 * Page 3
Cela fonctionne bien également, seules les pages recherchées sont affichées dans le menu.
MAIS...[b] l'objet Zend_Navigation de départ (issu du registre) se retrouve dépourvu de toutes les pages qui ne correspondaient pas au critère... [b]Elles semblent totalement perdues ! Et ce, pas depuis la recherche (findAllBy()) mais depuis la création d'un nouvel objet Zend_Navigation.
Dès lors :
echo $this->navigation()->menu(); // renvoie * Page 1 * Page 3 // l'aide de vue navigation choisi le dernier Zend_Navigation // qui lui a été affecté (ici celui des pages recherchées) echo $this->navigation()->menu()->setContainer(Zend_Registry::get('Zend_Navigation_Test')); // équivalent à : echo $this->navigation()->menu(Zend_Registry::get('Zend_Navigation_Test')); // renvoie * Page 3 * Page 4 // l'objet de base quant à lui est désormais dépourvu des pages passées au Zend_Navigation de la recherche
On peut en conclure (au premier abord) que la création d'un nouveau Zend_Navigation à partir de pages issues d'un autre Zend_Navigation consiste en un déplacement de pages du second objet vers le premier, laissant notre premier objet dépourvu de toutes ces pages (il n'est donc plus réellement utilisable pour générer de nouveaux menus "complet").
Pour ma part la solution "brute de force" venue à l'esprit est pour résoudre cela consiste à récupérer toutes les pages du premier objet, à effectuer la fameuse recherche findAllBy* et l'injection dans un nouveau Zend_Navigation, puis replacer l'ensemble des pages dans le premier objet (pour qu'il soit complet à nouveau)
Exemple (pratique pour ceux qui voudraient essayer)
$menu = Zend_Registry::get('Zend_Navigation_Test'); // mémorisation des pages $pages = $menu->getPages(); // récupération des pages correspondant au critère recherché $myCtrlPages = $menu->findAllByController('myCtrl'); // affichage d'un menu avec seulement ces pages // NB : la ligne ci-dessous à un impact sur l'objet $menu qui // se trouvera dépouvu des pages contenus dans $myCtrlPages. echo $this->navigation()->menu(new Zend_Navigation($myCtrlPages)); // on remet la totalité des pages dans notre objet, pour qu'il soit complet à nouveau $menu->setPages($pages);
Quelqu'un aurait-il été confronté à cette problématique et su la résoudre ?
Hors ligne
Pages: 1