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有关如何使用它们的信息.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...