2012-05-30 3 views
0

Я работаю над веб-сайтом с «обычным» меню и подменю.Zend Menu extend

Это метод в загрузчике, который resonsible для навигации:

Bootstrap.php

protected function _initNavigation() 
{   
    $view = $this->getResource('view'); 

    $view->addHelperPath(APPLICATION_ROOT . '/library/Pcw/View/Helper/Navigation', 'Pcw_View_Helper_');   

    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 

    $navigation = new Zend_Navigation($config); 

    $view->navigation($navigation); 

    $menuPartial = array('menu.phtml', 'default');   
    $view->navigation()->menu()->setPartial($menuPartial); 

    $subMenuPartial = array('submenu.phtml', 'default');   
    $view->navigation()->subMenu()->setPartial($subMenuPartial); 
} 

библиотека/Pcw/View/Helper/Навигация/SubMenu.php

class Pcw_View_Helper_Navigation_SubMenu extends Zend_View_Helper_Navigation_Menu 
{ 
    public function subMenu(Zend_Navigation_Container $container = null) 
    { 
     return parent::menu($container); 
    } 
} 

В соответствии с документами и темами здесь, в Stackoverflow this const свалка должна работать, но следующая ошибка появляется:

Fatal error: Uncaught exception 'Zend_Navigation_Exception' with message 'Bad method call: Unknown method Zend_Navigation::subMenu' in /home/prj/domains/prjon.nl/library/Zend/Navigation/Container.php:366 
Stack trace: 
#0 [internal function]: Zend_Navigation_Container->__call('subMenu', Array) 
#1 [internal function]: Zend_Navigation->subMenu() 
#2 /home/prj/domains/prjon.nl/library/Zend/View/Helper/Navigation/HelperAbstract.php(503): call_user_func_array(Array, Array) 
#3 /home/prj/domains/prjon.nl/library/Zend/View/Helper/Navigation.php(132): Zend_View_Helper_Navigation_HelperAbstract->__call('subMenu', Array) 
#4 /home/prj/domains/prjon.nl/Application/Bootstrap.php(410): Zend_View_Helper_Navigation->__call('subMenu', Array) 
#5 /home/prj/domains/prjon.nl/Application/Bootstrap.php(410): Zend_View_Helper_Navigation->subMenu() 
#6 /home/prj/domains/prjon.nl/library/Zend/Application/Bootstrap/BootstrapAbstract.php(669): Bootstrap->_initNavigation() in /home/prj/domains/prjon.nl/library/Zend/Navigation/Container.php on line 366 

Ошибка ясна: метод SubMenu не может быть найдена и называется, но я создал помощник, который отвечает за обработку подменит ..

Кто-нибудь знает, что я делаю неправильно?

Заранее благодарен!

+0

http://stackoverflow.com/questions/2364695/how-do-extend-the-zend-navigation-menu-view-helper ** Решение ** в стартовом сообщении помогло мне , –

ответ

0

Мой код в файле плагина (ROOT/Application/SubmenuPlugin.php):

$view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('view'); 

$submenuPartial = array('submenus/'.$currentControllerName.'.phtml', 'default'); //$currentControllerName defined a couple of lines ago    

$view->addHelperPath(APPLICATION_ROOT . '/library/Pcw/View/Helper', 'Pcw_View_Helper_'); 
$view->navigation()->submenu()->setPartial($submenuPartial); 

Расположение подменю: ROOT/Application/просмотров/скрипты/субменю/

Расположение подменю View Helper: ROOT/библиотека/Pcw/View/помощник/подменю.php

Это вам помогло?

1

Я просто использую другой синтаксис пути, и он работает для моих помощников вида, addHelper() должен работать с помощниками навигации.

$view->addHelperPath(APPLICATION_ROOT . '/library/Pcw/View/Helper/Navigation', 'Pcw_View_Helper_'); 

изменение:

$view->addHelperPath('/../library/Pcw/View/Helper/Navigation', 'Pcw_View_Helper_'); 

работает для меня, надеюсь, будет работать для вас.

+0

Это действительно странно .. Ваше решение не работает для меня ... Я проверял, включен ли файл, добавив штамп в первую строку и это работает. Конструктор Pcw_View_Helper_Navigation_SubMenu не вызывается, хотя .. –

1

Так я это делаю, надеюсь, что это имеет смысл. Я не рассматриваю ACL & Интеграция Auth (это отличная функция).

Скажем, я хочу, чтобы в главном меню с «домашним» и «административным», и подменю в разделе «admin».

В моем Bootstrap:

protected function _initNavigation() 
{ 
    $container = new Zend_Navigation(); 

    // or in xml etc 
    $pages = array(
       array('label' => 'Home', 'controller' => 'index', 'action' => 'index'), 
       array('label' => "Admin", 'controller' => 'admin', 'id' => 'admin', 'pages' => array(
         array('label' => "Add an account", 'controller' => 'admin', 'action' => 'createuser'), 
         array('label' => "Clear cache", 'controller' => 'admin', 'action' => 'clearcache') 
         ) 
       ) 
    ); 

    $container->addPages($pages); 

    Zend_Registry::set('Zend_Navigation', $container); 
    return $container; 
} 

Тогда в моем макете я отображение главного меню:.

$container = Zend_Registry::get('Zend_Navigation'); 
$this->navigation()->menu()->renderMenu($container,array('minDepth' => 0, 'maxDepth' => 0)) 

(то проверьте документ для всех вариантов renderMenu, очень гибкими Вы можете легко сделать опрокидывание с подменю администратора с «maxDepth» => 1)

Затем в моем шаблоне администратора для отображения подменю:

$container = Zend_Registry::get('Zend_Navigation'); 
$found = $container->findById('admin'); 
echo $this->navigation()->menu()->renderMenu($found,array('minDepth' => 0)) 

Таким образом, рендеринг вида отделен от начальной загрузки, и мне не нужны частичные или пользовательские видовые помощники.

+0

К сожалению, это не то, что я ищу. Мне бы очень хотелось иметь отдельную функцию с собственными частицами. –