2009-08-07 13 views
8

Zend_Navigation(フレームワークへの甘い追加、btw)を使用してメニューを構築しています。その後、ページにレンダリングする必要があります。私が最初にどこかのコントローラでコンテナを設定します。完璧に動作jQueryのフィッシュアイで動作するZend_Navigationメニューを取得する

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

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

を次に、レイアウトで、それは次のようにレンダリングされます。今すぐ:私は少し異なってレンダリングされるメニューをします。私が構築しているページでは、jQuery Fisheye-pluginを使ってMacのようなDockメニューを構築しています。しかし、このプラグインは、特定のマークアップを必要とする...

は実際には、<img>(アイコン用)と<span>(ツールチップ)の両方を含む<a>要素のリストを取ります。標準のメニュービューヘルパーは、すべてを非順序リスト内(論理的)にレンダリングし、'label'パラメータをリンクテキストとしてレンダリングします。

'label'パラメータに渡されるコンテンツはレンダリング前にエスケープされているようですので、htmlを挿入すると良いことはありません。さらに、Fisheyeは通常、<li>タグに含まれているアイテムを取っているようではなく、全体が<ul></ul>に包まれていますが、1レベルのリスト<a>の要素のみが含まれています。

ドック用のカスタムビューヘルパーを作成することを考えていましたが、これは<img><span>を挿入して処理することができますが、ナビゲーションにカスタムビューヘルパーを追加するのは非常に困難ですクラス。私は他のすべてのカスタムクラス(モデルなど)がオートローダーによって世話をされているにもかかわらず、どこに配置するのか、どのように配置するのか分かりません。これに関するアイデア?

また、このビューヘルパーを機能させることができても、まだHTMLの順序付けられていないリストが残っています。カスタムビューヘルパーを使用してそのビューヘルパーも失う可能性がありますが、セマンティクスのために、リスト内のメインナビゲーションメニューを含むファン。

誰かが私を少しでも助けることができれば、私は大いに感謝します。魚眼レンズが<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; 
} 

私はこのスクリプトを私はもともと(サブメニューの1つのレベルのメニュー)を持っていたもの作ってしまった:

// -- 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 ["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); ?> 

か、単に

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

あなたが生成されたHTMLに独自のカスタムプロパティを追加したい場合は今、あなたはあなたにそれらを追加することができますナビゲーションiniまたはxmlファイル。たとえば:

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

カスタムXMLタグ<img>は、ナビゲーション・ページのプロパティとして保存され、同様に取り込むことができます。

foreach ($iterator as $page) { 

    ... 

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

    ... 
} 

は、この情報がお役に立てば幸いです。 Peter

+0

あなたのソリューションは私の質問に私を助けてくれました。ありがとう! http://stackoverflow.com/questions/2364695/how-do-i-extend-the-zend-navigation-menu-view-helper – Sonny

関連する問題