2009-08-07 6 views
8

J'utilise Zend_Navigation (ajout doux au framework, btw) pour construire mon menu, après quoi il devrait être rendu dans la page (de manière évidente). J'ai d'abord mis le conteneur quelque part dans le contrôleur:Obtenir le menu Zend_Navigation pour travailler avec le Fisheye de jQuery

// $pages is the array containing all page information 
$nav = new Zend_Navigation($pages); 
$this->view->navigation($nav); 

Ensuite, dans la mise en page, il est rendu comme ceci:

echo $this->navigation()->menu(); 

qui fonctionne parfaitement. Maintenant: je veux que le menu soit rendu un peu différemment. La page que je construis utilise le jQuery Fisheye-plugin pour construire un menu Dock Mac-like. Cependant, ce plugin a besoin d'un balisage spécifique ...

En fait, il faut une liste des éléments <a> contenant à la fois un <img> (l'icône) et un <span> (pour l'info-bulle). L'assistant de vue Menu standard affiche tout ce qui se trouve dans une liste non ordonnée (logiquement), avec le paramètre 'label' comme texte du lien.

Il semble que le contenu passé au paramètre 'label' soit échappé avant le rendu, donc l'insertion du code HTML ne me sera d'aucune utilité. En outre, le Fisheye ne semble généralement pas prendre ses éléments contenus dans un tag <li>, avec le tout enveloppé dans <ul></ul>, mais juste une liste à un niveau d'éléments <a>.

Je pensais à écrire un assistant de vue personnalisé pour le dock, qui pourrait prendre soin d'insérer le <img> et le <span>, mais j'ai beaucoup de mal à obtenir un assistant de vue personnalisé attaché à la navigation classe. Je n'arrive tout simplement pas à savoir où le placer et de quelle manière, même si toutes mes autres classes personnalisées (modèles et autres) sont soigneusement prises en charge par l'autochargeur. Des idées à ce sujet? Puis, même si je peux obtenir cette aide de vue, il me reste la liste HTML non ordonnée - je sais que je peux la perdre aussi en utilisant l'aide de vue personnalisée, mais j'ai toujours été fan de contenir des menus de navigation principaux dans une liste, pour des raisons de sémantique.

Si quelqu'un peut m'aider un peu, je l'apprécierais grandement. Si le Fisheye n'est pas conçu pour fonctionner avec <ul>, ce serait dommage ... y aurait-il une bonne raison de perdre complètement Zend_Navigation dans ce cas?

Répondre

25

Je n'ai pas encore vu le chemin en termes de création d'un moteur de rendu personnalisé. Voici ce que je fini par faire bien:

D'abord, au lieu de rendre le menu par défaut() appel, créer une partie à rendre dans:

// menu.phtml is partial, cms is module 
$partial = array('menu.phtml', 'cms'); 
$this->navigation()->menu()->setPartial($partial); 
echo $this->navigation()->menu()->render(); 

ensuite (à partir de la documentation), vous pouvez créer un " « Render coutume comme ceci:

// -- inside menu.phtml 
foreach ($this->container as $page) 
{ 
    // this just prints a "<a>" or "<span>" tag 
    // depending on whether the page has a uri 
    echo $this->menu()->htmlify($page), PHP_EOL; 
} 

J'ai fini par faire ce que j'avais à l'origine (un menu avec un niveau de sous-menus) avec ce script:

// -- another menu.phtml 
<ul class="navigation"> 

<?php 

$html = array(); 

foreach ($this->container as $page) 
{ 
    $html[] = "<li>"; 
    $html[] = $this->menu()->htmlify($page) . PHP_EOL; 

    if (!empty($page->pages)) 
    { 
     $html[] = "<ul>"; 
     foreach ($page->pages as $subpage) 
     { 
      $html[] = "<li>"; 
      if ($href = $subpage->getHref()) $html[] = "<a href=\"{$href}\">"; 
      else $html[] = "<span>"; 
      $html[] = "<img src=\"/ui/cms/img/icons/edit.png\" alt=\"\"/>"; 
      $html[] = $subpage->getLabel(); 
      if ($href) $html[] = "</a>"; 
      else $html[] = "</span>";    
      $html[] = "</li>"; 
     } 
     $html[] = "</ul>"; 
    } 

    $html[] = "</li>"; 
} 

echo join(PHP_EOL, $html); 

?> 
</ul> 

Vous pouvez simplement changer le balisage dans le partiel et y ajouter vos images/icônes.

+1

Wow, réponse parfaite. Il semble qu'il y ait encore du travail à faire sur Zend_Navigation, mais cela m'amène où je dois aller. Merci! – JorenB

+1

@JorenB juste pour que vous sachiez aussi, je viens de demander à Matthew P. (lead dev sur ZF) si elles incluraient des décorateurs pour la navigation à tout moment. Il a dit (en résumé) "pas prévu parce que les partiels ont très peu de frais généraux et que les décorateurs ne sont pas aimés par la communauté" ... on dirait que Zend_Nav est un succès en soi. – typeoneerror

+0

J'ai essayé mais le conteneur est vide ... objet (Zend \ Navigation \ Navigation) # 509 (3) { ["pages": protected] => array (0) { } ["index": protected ] => array (0) { } ["dirtyIndex": protected] => booléen (false) } – cwhisperer

7

Désolé, pour la question de la mise en forme sur le post précédent

Pour ajouter votre aide personnalisée, procédez comme suit, dans votre bootstrap:

protected function _initNavigation() 
{ 
    $this->bootstrap('view');   // make sure we have a view 
    $view = $this->getResource('view');  // get the view resource 
    $config = new Zend_Config_Xml(APPLICATION_ROOT . '/config/navigation.xml','nav'); 
    $container = new Zend_Navigation($config); 
    $view->navigation($container); 

    // Tell Zend were it can find your custom helpers and what 
    // the prefix is going to be. 

    $view->addHelperPath(
      APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation', 
      'MyApp_View_Helper_' 
     ); 

} 

Créez ensuite votre aide de vue personnalisée et de le mettre dans le ' chemin d'accès addHelperPath. En fonction de ce que vous voulez faire, vous devez implémenter au moins votre propre fonction htmlify. Jetez un oeil à Zend/View/Aide/Navigation/Menu.php à titre d'exemple.

class MyApp_View_Helper_MyMenu extends Zend_View_Helper_Navigation_Menu 
{ 
    public function myMenu(Zend_Navigation_Container $container = null) 
    { 
     if (null !== $container) { 
      $this->setContainer($container); 
     } 
     return $this; 
    } 

    protected function htmlify(Zend_Navigation_Page $page) 
    { 
     ... 
    } 
} 

Ensuite, dans votre script phtml:

<?php echo $this->navigation()->myMenu()->setMaxDepth(0); ?> 

ou tout simplement

<?php echo $this->navigation()->myMenu(); ?> 

Maintenant, si vous voulez ajouter vos propres propriétés personnalisées au code HTML généré, vous pouvez les ajouter à votre navigation ini ou fichier xml. Par exemple:

<home> 
    <label>Home</label> 
    <uri>/</uri> 
    <img> 
     <src>/images/MyIcon.gif</src> 
    <img> 
</home> 

La balise XML personnalisé <img> sera stocké en tant que propriété de la page de navigation et peut être récupéré comme:

foreach ($iterator as $page) { 

    ... 

    $properties = new Zend_Config($page->GetCustomProperties()); 
    $myPicture = $properties->img->src; 

    ... 
} 

Hope this helps. Peter

+0

Votre solution m'a aidé avec ma question. Merci! http://stackoverflow.com/questions/2364695/how-do-i-extend-the-zend-navigation-menu-view-helper – Sonny

Questions connexes