我使用的模板有两种不同的导航菜单。
主导航菜单。 (已修复)
- 醇>
操作导航菜单,包含后退,保存,删除等元素。 此导航元素根据被调用的控制器而变化。虽然它可能存在于某些控制器而某些控制器却不存在
我正在使用布局,并且已将所有模板代码放在我的default.phtml
布局文件中。我面临的问题是操作导航菜单。由于此菜单的html代码位于default.phtml
,我需要根据被调用的控制器更改其内容。
我不确定这是否是正确的做法。但在我的default.phtml
我正在检查控制器名称并相应地显示菜单。这是我正在使用的代码。
<?php if(Zend_Controller_Front::getInstance()->getRequest()->getControllerName() == 'item'): ?>
<!-- Action Navigation Menu -->
<div class="statsRow">
<div class="wrapper">
<a href="#"><img src="/images/icons/dark/add.png" alt="" class="icon"><span>New item</span></a>
<a href="#"><img src="/images/icons/dark/cd.png" alt="" class="icon"><span>Publish / Unpublish item</span></a>
<a href="#"><img src="/images/icons/dark/trash.png" alt="" class="icon"><span>Delete item</span></a>
</div>
</div>
<div class="line"></div>
<?php endif; ?>
可以这样做吗?或者我有更好的方法吗?
答案 0 :(得分:3)
您的操作导航菜单似乎实际上就像SubMenu,其中每个Action都是子页面的一部分。做这种事情的一个好方法是有两个Zend_Navigation实例,你可以将它们存储在注册表中。然后,在您的控制器中,您可以在preDispatch()
方法中调用 Action Helper ,如下所示:
// in each controller where you want your "action navigation menu"
public function preDispatch()
{
$this->_helper->navigation()->renderActionNavigation();
}
当然,只有需要此操作导航菜单的控制器才能使用此方法。 此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
。
然后,partial将负责使用占位符渲染您的subMenu:
// 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() ?>
此外,使用设置为onlyActiveBranch
选项true
的{{3}}呈现菜单将允许您仅呈现活动分支,其中每个分支将对应您的控制器。
最后,在您的布局中,您将拥有:
// 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);
}
有关容器的更多信息,navigation view helper method renderMenu()
。此外,如果您不熟悉占位符,refer to this page关于如何使用它们。
答案 1 :(得分:1)
我想没关系。我会在控制器中执行此操作并使用Zend_Navigation包含导航,然后您可以使用ACL等。
如果控制器刚刚设置:
$this->view->navigation()->setContainer($navigation);
其中$navigation
是Zend_Navigation的一个实例。然后在你的布局中:
<?=$this->navigation()->menu()?>