看起来您的操作导航菜单实际上就像一个子菜单,其中每个操作都是子页面的一部分。做这种事情的一个好方法是拥有两个 Zend_Navigation 实例,例如,您可以将它们存储在注册表中。然后,在您的控制器中,您可以在方法中调用Action HelperpreDispatch()
,如下所示:
// in each controller where you want your "action navigation menu"
public function preDispatch()
{
$this->_helper->navigation()->renderActionNavigation();
}
当然,只有需要这个 Action 导航菜单的控制器才有这个方法。这个 Action Helper 基本上会获取当前视图对象,创建一个占位符并渲染一个部分,如下所示:
// in your library/My/Controller/Action/Helper
class My_Controller_Action_Helper_Navigation extends Zend_Controller_Action_Helper_Abstract
{
private $_view = null;
public function direct()
{
$this->_view = $view = Zend_Layout::getMvcInstance()->getView();
$this->_view->placeholder('action-navigation');
return $this;
}
public function renderActionNavigation()
{
$this->_view->render('partials/_action-navigation.phtml');
}
}
如果您不使用库,只需将此代码放入/views/helpers/并重命名类Zend_View_Helper_Navigation
。
然后部分将负责使用占位符呈现您的子菜单:
// in /view/scripts/partials/_action-navigation.phtml
<?php $this->placeholder('action-navigation')->captureStart() ?>
<?php $options = array('onlyActiveBranch' => true); ?>
<?= $this->navigation()->menu()->renderMenu(Zend_Registry::get('nav.action-navigation'), $options);
// here I assume that you've stored your Navigation container in the registry ?>
<?php $this->placeholder('action-navigation')->captureEnd() ?>
此外,使用导航视图辅助方法renderMenu()
渲染菜单并onlyActiveBranch
设置选项true
将允许您仅渲染活动分支,其中每个分支都对应于您的控制器。
最后,在您的布局中,您将拥有以下内容:
// in your layout file (usually named layout.phtml)
<?= $this->placeholder('action-navigation'); ?>
如果您选择在注册表中注册 Zend_Navigation 容器,这可以在引导程序中以这种方式完成:
// in your bootstrap.php
protected function _initNavigation()
{
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
Zend_Registry::set('nav.action-navigation', $container);
}
有关容器的更多信息,请参阅此页面。此外,如果您不熟悉占位符,这里有一个关于如何使用它们的很好的实际示例。