2009-08-07 2 views
8

Zend_Navigation (프레임 워크에 btw 추가)을 사용하여 메뉴를 만든 다음 페이지에 렌더링해야합니다 (자명). 내가 먼저 컨트롤러 어딘가에 컨테이너를 설정합니다jQuery의 어안과 함께 작동하도록 Zend_Navigation 메뉴 가져 오기

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

다음, 레이아웃, 그것은 다음과 같이 렌더링 : 완벽하게 작동

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

합니다. 자 : 메뉴를 조금 다르게 렌더링하고 싶습니다. 내가 만들고있는 페이지는 jQuery Fisheye-plugin을 사용하여 Mac과 유사한 도크 메뉴를 만듭니다. 그러나이 플러그인은

사실, <a> 요소를 포함한 모두 (아이콘의 경우) <img>과 (툴팁의 경우) <span>의 목록을 걸립니다 ... 특정 마크 업이 필요합니다. 표준 메뉴 뷰 도우미는 'label' 매개 변수를 링크 텍스트로 사용하여 논리적으로 정렬되지 않은 목록의 모든 것을 렌더링합니다.

'label' 매개 변수로 전달 된 콘텐츠는 렌더링 전에 이스케이프 처리되므로 html을 삽입하면 나에게 도움이되지 않습니다. 또한 Fisheye는 일반적으로 <li> 태그에 포함 된 항목을 가져 오지 않는 것으로 보이며 전체 내용은 <ul></ul>으로 묶이지 만 한 수준의 목록은 <a> 개입니다.

<img><span>을 삽입 할 수있는 도크 용 사용자 정의보기 도우미를 작성하려고했으나 탐색에 첨부 된 사용자 정의보기 도우미를 얻는 데 어려움을 겪고 있습니다. 수업. 모든 다른 사용자 정의 클래스 (모델 등)가 자동 로더에 의해 멋지게 관리 되더라도 어디에 배치할지, 어떤 방법으로 배치 할지를 파악할 수 없습니다. 이것에 대한 아이디어가 있습니까?

다시보기 도우미가 작동하도록 할 수 있더라도 HTML 정렬되지 않은 목록이 남아 있습니다. 사용자 지정보기 도우미를 사용하여이 뷰어도 잃을 수는 있지만 항상 의미 체계를 위해 목록 안에 기본 탐색 메뉴를 포함하는 팬.

누구든지 나를 조금 도와 줄 수 있다면 크게 감사하겠습니다. Fisheye가 <ul>과 작동하도록되어 있지 않다면 너무 나빠질 것입니다.이 경우 Zend_Navigation을 잃을만한 충분한 이유가 있습니까?

답변

25

커스텀 렌더러를 만드는 방법을 아직 보지 못했습니다. 당신의 "를 만들 수 있습니다 (워드 프로세서에서) 다음

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

:로 렌더링 할 부분을 만들고,

첫째, 대신 기본 메뉴() 호출을 렌더링 : 여기 불구하고 결국 무엇 사용자 지정 "과 같이 렌더링 :

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

나는이 스크립트 내가 원래 (하위 메뉴 중 하나 개 수준 메뉴)를 가지고 무엇을하고 결국 :

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

부분적으로 마크 업을 변경하고 거기에 이미지/아이콘을 추가 할 수 있습니다.

+1

와우, 완벽한 답변입니다. 아직 Zend_Navigation에 할 일이있는 것 같지만, 내가 갈 필요가있는 곳으로 가버립니다. 감사! – JorenB

+1

@ JorenB 그냥 알다시피, 나는 Matthew P. (ZF의 수석 개발자)에게 언제든지 네비게이션 용 데코레이터를 포함할지 물었다. 그는 부분적으로는 오버 헤드가 거의없고 데코레이터가 커뮤니티에 의해 사랑받지 못하기 때문에 "계획하지 않았습니다."라고 말했습니다. Zend_Nav는 그 자체만으로도 상당한 성능을 발휘합니다. – typeoneerror

+0

시도했지만 컨테이너가 비어 있습니다. 개체 (Zend \ Navigation \ Navigation) # 509 (3) { [ "pages": protected] => 배열 (0) { } [ "index": protected ]]]> array (0) { } [ "dirtyIndex": protected] => bool (false) – cwhisperer

7

죄송합니다, 사용자 지정 도우미를 추가하려면 이전 게시물

에 서식 문제에 대한 다음을 수행, 부트 스트랩에 :

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_' 
     ); 

} 

다음은 사용자 정의보기 도우미를 작성하고 그것을 넣어 ' addHelperPath '경로에 있습니다. 당신이하고 싶은 것에 따라 최소한 자신의 htmlify 함수를 구현해야합니다. Zend/View/Help/Navigation/Menu.php를 예로 들어 보겠습니다.

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

다음, PHTML 스크립트 :

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

또는 지금 당신은 당신이에 추가 할 수 있습니다 생성 된 HTML에 사용자 정의 속성을 추가 할 경우 단지

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

당신의 네비게이션 ini 또는 xml 파일. 예를 들어이 도움이

foreach ($iterator as $page) { 

    ... 

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

    ... 
} 

희망 :

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

태그 <img> 탐색 페이지의 속성으로 저장됩니다 사용자 정의 XML처럼 가져올 수 있습니다. Peter

+0

당신의 솔루션은 내 질문에 도움이되었습니다. 감사! http://stackoverflow.com/questions/2364695/how-do-i-extend-the-zend-navigation-menu-view-helper – Sonny