Zend framework Zend框架-定义导航菜单的正确方法
我使用的模板有两个不同的导航菜单Zend framework Zend框架-定义导航菜单的正确方法,zend-framework,zend-navigation,Zend Framework,Zend Navigation,我使用的模板有两个不同的导航菜单 主导航菜单。(固定) 操作导航菜单,包含后退、保存、删除等元素。 此导航元素根据所调用的控制器而更改。对于某些控制器,它可能存在,而对于某些控制器,它可能不存在 我正在使用布局,我已经将所有模板代码放在我的default.phtmllayout文件中。我面临的问题是操作导航菜单的问题。由于此菜单的html代码位于default.phtml中,因此我需要根据调用的控制器更改其内容 我不确定这样做是否正确。但是在我的default.phtml中,我正在检查控制器名称
default.phtml
layout文件中。我面临的问题是操作导航菜单的问题。由于此菜单的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; ?>
这样做可以吗?或者我有更好的方法吗?我想没关系。相反,我会在控制器中执行此操作,并包括使用的导航,然后您可以使用ACL等 如果控制器刚刚设置:
$this->view->navigation()->setContainer($navigation);
其中,$navigation
是Zend_导航的一个实例。然后在布局中:
<?=$this->navigation()->menu()?>
看起来您的操作导航菜单实际上就像一个子菜单,其中每个操作都是子页面的一部分。这样做的一个好方法是拥有两个Zend_Navigation实例,例如,您可以将其存储在注册表中。然后,在控制器中,您可以调用preDispatch()
方法中的动作帮助器,如下所示:
// in each controller where you want your "action navigation menu"
public function preDispatch()
{
$this->_helper->navigation()->renderActionNavigation();
}
当然,只有需要此操作导航菜单的控制器才具有此方法。
此操作帮助器基本上将获取当前视图对象,创建占位符并渲染局部视图,如下所示:
// 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\u View\u Helper\u导航
然后,partial将负责使用占位符呈现子菜单:
// 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() ?>
如果选择在注册表中注册Zend_导航容器,可以通过以下方式在引导中完成:
// 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);
}
有关容器的详细信息。另外,如果您不熟悉占位符,请了解如何使用占位符。我是zend framework的新手。你的解释对我来说似乎有点过头了。我仍在掌握助手或导航的概念,以及在zend中如何处理它。你能给我解释一下代码到底发生了什么吗。它属于哪里只是编辑了我的答案并在每个片段上添加了注释。从Zend文档中,允许开发人员将运行时和/或按需功能注入任何扩展
Zend\u Controller\u Action
的操作控制器。动作助手的目标是尽量减少扩展抽象动作控制器的必要性,以便注入通用动作控制器功能。我感谢您的帮助。但是你认为我不使用Zend_导航也能达到同样的效果吗?。Zend_Navigation让我烦恼的是定制装饰器,我仍然无法获得它。将视图帮助程序用于相同的目的如何?您始终可以覆盖Zend Navigation视图帮助程序,使其按照您想要的方式运行。但是,我建议您保留Zend_Navigation组件来呈现您的导航,它在大多数情况下使事情变得更容易。我在路径(./views/scripts/)中未找到此错误script'partials/_action-Navigation.phtml'
我使用的是模块化目录结构,我将分区放在应用程序/layouts/partials
目录中,但我无法使其正常工作。如何更改路径以使用与我的目录结构相关的分区?我可以使用zend_导航为我的菜单生成完全相同的语法吗?你能给我举个例子吗?:)你的方法的问题是我需要为所有控制器和动作定义动作导航。而对于我的应用程序,动作导航对于某些应用程序存在,而对于某些应用程序则不存在
// 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);
}