0

「通常の」メニューとサブメニューのあるWebサイトで作業しています。

これは、ナビゲーションに適したブートストラップのメソッドです。

Bootstrap.php

protected function _initNavigation()
{        
    $view = $this->getResource('view');

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

    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');

    $navigation = new Zend_Navigation($config);

    $view->navigation($navigation);

    $menuPartial = array('menu.phtml', 'default');        
    $view->navigation()->menu()->setPartial($menuPartial);

    $subMenuPartial = array('submenu.phtml', 'default');        
    $view->navigation()->subMenu()->setPartial($subMenuPartial);
} 

library / Pcw / View / Helper / Navigation / SubMenu.php

class Pcw_View_Helper_Navigation_SubMenu extends Zend_View_Helper_Navigation_Menu
{
    public function subMenu(Zend_Navigation_Container $container = null)
    {
        return parent::menu($container);
    }
}

Stackoverflowに関するドキュメントとトピックによると、この構造は機能するはずですが、次のエラーが発生します。

Fatal error:  Uncaught exception 'Zend_Navigation_Exception' with message 'Bad method call: Unknown method Zend_Navigation::subMenu' in /home/prj/domains/prjon.nl/library/Zend/Navigation/Container.php:366
Stack trace:
#0 [internal function]: Zend_Navigation_Container->__call('subMenu', Array)
#1 [internal function]: Zend_Navigation->subMenu()
#2 /home/prj/domains/prjon.nl/library/Zend/View/Helper/Navigation/HelperAbstract.php(503): call_user_func_array(Array, Array)
#3 /home/prj/domains/prjon.nl/library/Zend/View/Helper/Navigation.php(132): Zend_View_Helper_Navigation_HelperAbstract->__call('subMenu', Array)
#4 /home/prj/domains/prjon.nl/Application/Bootstrap.php(410): Zend_View_Helper_Navigation->__call('subMenu', Array)
#5 /home/prj/domains/prjon.nl/Application/Bootstrap.php(410): Zend_View_Helper_Navigation->subMenu()
#6 /home/prj/domains/prjon.nl/library/Zend/Application/Bootstrap/BootstrapAbstract.php(669): Bootstrap->_initNavigation() in /home/prj/domains/prjon.nl/library/Zend/Navigation/Container.php on line 366

エラーは明らかです。メソッドsubMenuが見つからず、呼び出されませんが、サブメニューの処理を担当するヘルパーを作成しました。

誰かが私が間違っていることを知っていますか?

前もって感謝します!

4

3 に答える 3

1

これは私がそれを行う方法です、それが理にかなっていることを願っています。ACLとAuthの統合は省略しています(これは素晴らしい機能です)。

「ホーム」と「管理者」を含むトップメニューと、「管理者」セクションのサブメニューが必要だとします。

私のブートストラップで:

protected function _initNavigation()
{
    $container = new Zend_Navigation();

    // or in xml etc
    $pages = array(
                array('label' => 'Home', 'controller' => 'index', 'action' => 'index'),
                array('label' => "Admin", 'controller' => 'admin', 'id' => 'admin', 'pages' => array(
                        array('label' => "Add an account", 'controller' => 'admin', 'action' => 'createuser'),
                        array('label' => "Clear cache", 'controller' => 'admin', 'action' => 'clearcache')
                        )
                )
    );

    $container->addPages($pages);

    Zend_Registry::set('Zend_Navigation', $container);
    return $container;
}

次に、私のレイアウトでメインメニューを表示します。

$container = Zend_Registry::get('Zend_Navigation');
$this->navigation()->menu()->renderMenu($container,array('minDepth' => 0, 'maxDepth' => 0))

(すべてのrenderMenuオプションについては、ドキュメントを確認してください。非常に柔軟です。'maxDepth' => 1のadminサブメニューを使用して、簡単にロールオーバーを行うことができます)

次に、管理者テンプレートで、サブメニューを表示します。

$container = Zend_Registry::get('Zend_Navigation');
$found = $container->findById('admin');
echo $this->navigation()->menu()->renderMenu($found,array('minDepth' => 0))

そうすれば、ビューレンダリングがブートストラップから切り離され、パーシャルやカスタムビューヘルパーは必要ありません。

于 2012-05-31T09:20:11.077 に答える
1

別のパス構文を使用するだけで、ビューヘルパーで機能します。addHelper()はナビゲーションヘルパーで機能するはずです。

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

への変更:

$view->addHelperPath('/../library/Pcw/View/Helper/Navigation', 'Pcw_View_Helper_');

私のために働く、うまくいけばあなたのためにも働くでしょう。

于 2012-05-31T07:19:26.310 に答える
0

プラグインファイル(ROOT / Application / SubmenuPlugin.php)の私のコード:

$view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('view');

$submenuPartial = array('submenus/'.$currentControllerName.'.phtml', 'default'); //$currentControllerName defined a couple of lines ago             

$view->addHelperPath(APPLICATION_ROOT . '/library/Pcw/View/Helper', 'Pcw_View_Helper_');
$view->navigation()->submenu()->setPartial($submenuPartial);

場所のサブメニュー:ROOT / Application / views / scripts / submenus /

場所サブメニュービューヘルパー:ROOT / library / Pcw / View / helper / Submenu.php

これはあなたを助けましたか?

于 2012-10-24T10:20:15.673 に答える