2009-08-07 7 views
8

Używam Zend_Navigation (słodki dodatek do frameworka, btw), aby zbudować moje menu, po czym powinno być renderowane na stronie (oczywiste). I najpierw ustawić pojemnik gdzieś w kontrolerze:Pierwsze menu Zend_Navigation do pracy z fisheye jQuery's

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

Następnie w układzie, to staje się to tak:

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

który działa doskonale. Teraz: chcę, aby menu było renderowane trochę inaczej. Strona, którą buduję, używa jQuery Fisheye-plugin do zbudowania menu podobnego do Macintosha. Jednak ten plugin potrzebuje specjalnego znaczników ...

Właściwie, to pobiera listę <a> elementów zawierających zarówno <img> (na ikonie) oraz <span> (na etykiecie). Standardowy helper widoku menu renderuje wszystko na liście nieuporządkowanej (logicznie) z parametrem 'label' jako tekstem łącza.

Wygląda na to, że treść przekazana do parametru 'label' została wygenerowana przed renderowaniem, więc wstawienie html nie przyniesie mi żadnego pożytku. Poza tym Rybie Oko zazwyczaj nie zajmuje swoich elementów zawartych w tagu <li>, a cała rzecz jest zapakowana w <ul></ul>, ale jest to tylko jednopoziomowa lista elementów <a>.

Zastanawiam się nad napisaniem niestandardowego pomocnika widoku dla stacji dokującej, który byłby w stanie zająć się wstawianiem <img> i <span>, ale bardzo trudno jest uzyskać pomocnika widoku niestandardowego dołączonego do nawigacji klasa. Po prostu nie wiem, gdzie go umieścić i w jaki sposób, mimo że wszystkie inne niestandardowe klasy (modele i takie) są słodko obsługiwane przez autoloader. Jakieś pomysły na ten temat?

Z drugiej strony, nawet jeśli mogę uzyskać pomocnika widoku do pracy, nadal pozostaję z nieuporządkowaną listą HTML - wiem, że mogę ją stracić również za pomocą niestandardowego pomocnika widoku, ale zawsze byłem wentylator zawierający główne menu nawigacyjne na liście, ze względu na semantykę.

Jeśli ktoś może mi pomóc, bardzo bym to docenił. Jeśli Fisheye po prostu nie działa z <ul>, to byłoby zbyt źle ... czy byłby to dobry powód, aby całkowicie stracić Zend_Navigation w tym przypadku?

Odpowiedz

25

Nie widziałem jeszcze sposobu, ani pod względem tworzenia niestandardowego renderera. Oto, co skończyło się robi choć:

Po pierwsze, zamiast renderowania domyślnego menu() połączenia, tworzyć częściowy do renderowania w:

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

wówczas (od docs), można stworzyć " zwyczaj”render tak:

// -- 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; 
} 

skończyło się to, co pierwotnie (menu z jednego poziomu podmenu) z tego skryptu:

// -- 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> 

Można po prostu zmienić znacznik w częściowym i dodać tam swoje obrazy/ikony.

+1

Wow, idealna odpowiedź. Wygląda na to, że w Zend_Navigation wciąż jest coś do zrobienia, ale dostanę tam, gdzie muszę iść. Dzięki! – JorenB

+1

@JorenB tylko dlatego, że wiesz, po prostu zapytałem Matthew P. (główny deweloper na ZF), czy w dowolnym momencie dołączą dekoratory do nawigacji. Powiedział (w skrócie) "nie planowane, ponieważ częściowe mają bardzo niewiele kosztów, a dekoratorzy nie są kochani przez społeczność" .. wygląda na to, że Zend_Nav jest hitem wydajnościowym na własną rękę. – typeoneerror

+0

Próbowałem tego, ale kontener jest pusty ... obiekt (Zend \ Navigation \ Navigation) # 509 (3) { ["pages": protected] => array (0) { } ["indeks": chroniony ] => array (0) { } ["dirtyIndex": protected] => bool (false) } – cwhisperer

7

Niestety, do wydania formatowania w poprzednim poście

Aby dodać niestandardową pomocnika wykonać następujące czynności, w 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_' 
     ); 

} 

Następny utworzyć niestandardowy widok pomocnika i umieścić go w ' addHelperPath 'ścieżka. W zależności od tego, co chcesz zrobić, musisz zaimplementować przynajmniej własną funkcję htmlify. Spójrz na Zend/View/Help/Navigation/Menu.php jako przykład.

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) 
    { 
     ... 
    } 
} 

Następnie w skrypcie Phtml:

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

lub po prostu

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

Teraz, jeśli chcesz dodać własne niestandardowe właściwości do wygenerowanego kodu HTML można dodawać je do plik nawigacji ini lub xml. Na przykład:

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

Zwyczaj xml tag <img> zostanie zapisany jako własność strony nawigacyjnej i mogą być pobrane jak:

foreach ($iterator as $page) { 

    ... 

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

    ... 
} 

nadzieję, że to pomaga. Peter

+0

Twoje rozwiązanie pomogło mi w moim pytaniu. Dzięki! http://stackoverflow.com/questions/2364695/how-do-i-extend-the-zend-navigation-menu-view-helper – Sonny