Как использовать два разных меню в двух разных модулях с zend_navigation? - PullRequest
0 голосов
/ 23 декабря 2011

Я подал заявку с двумя модулями. Каждый модуль имеет свое меню. Я использую Zend_navigation для рендеринга меню. Меню отображается правильно, подменю тоже, но только одно меню отображается на каждой странице. Я пытаюсь найти исправления, найденные на этом форуме, но ничего не изменилось.

Вот моя структура:

application/
    modules/
        default/
            configs/
               navigationSite.xml
            controllers/
            models/
            views/
               bootstrap.php
        cards/
            configs/
               navigationCards.xml
            controllers/
            models/
            views/
               bootstrap.php

Модуль Boostrap По умолчанию:

<?php

class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{

    protected function _initNavigation()
    {

            // read navigation XML and initialize container
            $configSite = new Zend_Config_Xml(
                                    APPLICATION_PATH.
                                        '/modules/default/configs/navigationSite.xml', 
                                        'site');
            $containerSite = new Zend_Navigation($configSite);
            // register navigation container
            $registrySite = Zend_Registry::getInstance();
            $registrySite->set('Zend_NavigationSite', $containerSite);
            // add action helper
            Zend_Controller_Action_HelperBroker::addHelper(
                new Bravo_Controller_Action_Helper_NavigationSite()
            );
    }

}

Boostrap модуль Карты:

<?php

class Cards_Bootstrap extends Zend_Application_Module_Bootstrap
{

    protected function _initNavigation()
    {

            // read navigation XML and initialize container
            $configCards = new Zend_Config_Xml(
                                    APPLICATION_PATH.
                                        '/modules/default/configs/navigationCards.xml', 
                                        'site');
            $containerCards = new Zend_Navigation($configCards);
            // register navigation container
            $registryCards = Zend_Registry::getInstance();
            $registryCards->set('Zend_NavigationApp', $containerCards);
            // add action helper
            Zend_Controller_Action_HelperBroker::addHelper(
                new Bravo_Controller_Action_Helper_NavigationApp()
            );
    }

}

navigationCards.xml:

<?xml version="1.0" encoding="UTF-8"?>

<configData>
    <cards>
        <menu1>
            <label>Cards 1</label>
            <uri>/cards/menu1</uri>
        </menu1>
        <menu2>
            <label>Cards 2</label>
            <uri>/cards/menu2</uri>
        <menu2>
    </cards>
</configData>

navigationSite.xml:

<?xml version="1.0" encoding="UTF-8"?>

<configData>
    <site>
        <menu1>
            <label>Site 1</label>
            <uri>/default/menu1</uri>
        </menu1>
        <menu2>
            <label>Site 2</label>
            <uri>/default/menu2</uri>
        <menu2>
    </site>
</configData>

На мой взгляд По умолчанию:

<div id="menu">
    <?php echo $this->navigation(Zend_Registry::get('Zend_NavigationSite'))->menu();?>
</div>

На мой взгляд Карты:

<div id="menu">
    <?php echo $this->navigation(Zend_Registry::get('Zend_NavigationApp'))->menu()
    ->renderMenu(null, array(
        'minDepth' => null,
        'maxDepth' => 1,
        'ulClass' => 'navigation',
        'onlyActiveBranch' => false));
    ?>
</div>

Что-то мешает отображению двух разных меню на своих страницах, но я не могу понять. Может кто увидит очевидное: -)

РЕДАКТИРОВАТЬ: я исправил это! Я просто не знал, что такое "Zend_Registry". Теперь я звоню по правильному индексу и все в порядке! :-) Я обновил код этого поста тоже. Спасибо, ребята, за альтернативные решения!

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Для чего это стоит, я могу показать, как сделать разные меню в разных модулях с помощью одной начальной загрузки. Я использую плагин контроллера в проекте:

class Application_Plugin_Menu extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $module = strtolower($request->getModuleName());
        $controller = strtolower($request->getControllerName());

        $nav = new Zend_Navigation(new Zend_Config_Ini($config, $module));
        Zend_Registry::set('Zend_Navigation', $nav);   
    }
}
0 голосов
/ 23 декабря 2011

У меня обычно есть несколько меню в моих проектах, но я использую только одну Bootstrap с переключателем в нем.

Основываясь на "роли учетной записи", я получаю другое меню и другой макет, но другим способом:

protected function _initNavigationAndLayout(){
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    switch ($examplevar){
        default:
        case 1:
            $layout->setLayout('layout1');
            $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation1.xml','nav');
            break;
        case 2:
            $layout->setLayout('layout2');
            $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation2.xml','nav');
            break;
    }
    $navigation = new Zend_Navigation($config);
    $view->navigation($navigation)->setAcl($this->_acl)->setRole($this->_auth->getStorage()->read()->role    );
}

вы можете видеть, что у меня есть $ this -> _ acl и $ this -> _ auth, которые являются экземплярами Zend_Acl и Zend_Auth для вещей, связанных с разрешениями:)

Моя навигация (образец):

<?xml version="1.0" encoding="UTF-8"?>
    <configdata>
        <nav>
            <login>
                <label>Login</label>
                <controller>secure</controller>
                <action>login</action>
                <route>default</route>
                <resource>login</resource>
            </login>
        </nav>
    </configdata>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...