[英]How to use two different menu in two different module with zend_navigation?
我用兩個模塊制作了一個應用程序。 每個模塊都有自己的菜單。 我使用Zend_navigation渲染菜單。 菜單正確渲染,子菜單也可以渲染,但每頁僅渲染一個菜單。 我嘗試在此論壇上找到一些修復程序,但沒有任何更改。
這是我的結構:
application/
modules/
default/
configs/
navigationSite.xml
controllers/
models/
views/
bootstrap.php
cards/
configs/
navigationCards.xml
controllers/
models/
views/
bootstrap.php
Boostrap模塊默認值:
<?php
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
protected function _initNavigation()
{
// read navigation XML and initialize container
$configSite = new Zend_Config_Xml(
APPLICATION_PATH.
'/modules/default/configs/navigationSite.xml',
'site');
$containerSite = new Zend_Navigation($configSite);
// register navigation container
$registrySite = Zend_Registry::getInstance();
$registrySite->set('Zend_NavigationSite', $containerSite);
// add action helper
Zend_Controller_Action_HelperBroker::addHelper(
new Bravo_Controller_Action_Helper_NavigationSite()
);
}
}
Boostrap模塊卡:
<?php
class Cards_Bootstrap extends Zend_Application_Module_Bootstrap
{
protected function _initNavigation()
{
// read navigation XML and initialize container
$configCards = new Zend_Config_Xml(
APPLICATION_PATH.
'/modules/default/configs/navigationCards.xml',
'site');
$containerCards = new Zend_Navigation($configCards);
// register navigation container
$registryCards = Zend_Registry::getInstance();
$registryCards->set('Zend_NavigationApp', $containerCards);
// add action helper
Zend_Controller_Action_HelperBroker::addHelper(
new Bravo_Controller_Action_Helper_NavigationApp()
);
}
}
navigationCards.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configData>
<cards>
<menu1>
<label>Cards 1</label>
<uri>/cards/menu1</uri>
</menu1>
<menu2>
<label>Cards 2</label>
<uri>/cards/menu2</uri>
<menu2>
</cards>
</configData>
navigationSite.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configData>
<site>
<menu1>
<label>Site 1</label>
<uri>/default/menu1</uri>
</menu1>
<menu2>
<label>Site 2</label>
<uri>/default/menu2</uri>
<menu2>
</site>
</configData>
在我看來,默認值:
<div id="menu">
<?php echo $this->navigation(Zend_Registry::get('Zend_NavigationSite'))->menu();?>
</div>
在我看來,卡片:
<div id="menu">
<?php echo $this->navigation(Zend_Registry::get('Zend_NavigationApp'))->menu()
->renderMenu(null, array(
'minDepth' => null,
'maxDepth' => 1,
'ulClass' => 'navigation',
'onlyActiveBranch' => false));
?>
</div>
某些東西阻止在其自己的頁面上呈現兩個不同的菜單,但是我不知道。 也許有人會看到明顯的:-)
編輯:我解決了! 我只是不知道什么是“ Zend_Registry”。 現在,我稱正確的索引為好! :-)我也更新了這篇文章的代碼。 謝謝你們的替代解決方案!
對於它的價值,我可以展示如何通過一個引導程序在不同的模塊中制作不同的菜單。 我在項目中使用控制器插件:
class Application_Plugin_Menu extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = strtolower($request->getModuleName());
$controller = strtolower($request->getControllerName());
$nav = new Zend_Navigation(new Zend_Config_Ini($config, $module));
Zend_Registry::set('Zend_Navigation', $nav);
}
}
我的項目中通常有多個菜單,但是我只使用一個帶有開關的Bootstrap。
基於“帳戶角色”,我得到了不同的菜單和不同的布局,但是方式不同:
protected function _initNavigationAndLayout(){
$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
switch ($examplevar){
default:
case 1:
$layout->setLayout('layout1');
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation1.xml','nav');
break;
case 2:
$layout->setLayout('layout2');
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation2.xml','nav');
break;
}
$navigation = new Zend_Navigation($config);
$view->navigation($navigation)->setAcl($this->_acl)->setRole($this->_auth->getStorage()->read()->role );
}
您可以看到我有一個$ this-> _ acl和一個$ this-> _ auth,它們是與權限相關的東西的Zend_Acl和Zend_Auth的實例:)
我的導航(示例):
<?xml version="1.0" encoding="UTF-8"?>
<configdata>
<nav>
<login>
<label>Login</label>
<controller>secure</controller>
<action>login</action>
<route>default</route>
<resource>login</resource>
</login>
</nav>
</configdata>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.