8

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を挿入しても何の役にも立ちません。<li>さらに、Fisheyeは通常、タグに含まれているアイテムを取得していないようで、すべてがラップされていますが、要素<ul></ul>の1つのレベルのリストにすぎません。<a>

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

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

誰かが私を少し助けてくれるなら、私はそれを大いに感謝します。Fisheyeが<ul>'sで動作することを意図していない場合、それは残念です...この場合、Zend_Navigationを完全に失う正当な理由がありますか?

4

2 に答える 2

24

カスタムレンダラーを作成するという点でも、私はまだその方法を見ていません。これが私がやったことです:

まず、デフォルトのmenu()呼び出しをレンダリングする代わりに、レンダリングするパーシャルを作成します。

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

パーシャルのマークアップを変更して、そこに画像/アイコンを追加するだけです。

于 2009-08-10T14:38:51.603 に答える
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;

    ...
}

お役に立てれば。ピーター

于 2009-11-29T19:23:54.897 に答える