微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

zend-framework – Zend Framework – 定义导航菜单的正确方法

我正在使用一个模板,其中有两个不同的导航菜单.

  1. Main navigation menu. ( fixed )

  2. Action navigation menu,contains elements such as back,save,delete etc.
    this navigation elements changes according to the controllers being called. while it may exist for some controller and for some it doesn’t

我正在使用布局,我已将所有模板代码放在我的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; ?>

可以这样做吗?或者我有更好的方法吗?

解决方法

看起来你的Action导航菜单实际上就像一个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导航菜单的控制器才会使用此方法.
此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类.

然后部分将负责使用占位符渲染您的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的navigation view helper method renderMenu()渲染菜单将允许您仅渲染活动分支,其中每个分支将对应于您的控制器.

最后,在您的布局中,您将拥有:

// 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);
}

有关容器的更多信息,请参见refer to this page.另外,如果您不熟悉占位符,请参阅here is a good practical example有关如何使用它们的信息.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐