Zend: Как я могу глобально установить текущий элемент навигации? - PullRequest
1 голос
/ 21 января 2010

конфигурация:

resources.frontController.plugins.nav = "WD_Controller_Plugin_Nav"

самозагрузка:

protected function _initAutoloader() {
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('WD_');
return $loader;
}

protected function _initNav() {
  $this->bootstrap('layout');
  $layout = $this->getResource('layout');
  $view = $layout->getView();
  $config = new Zend_Config_Xml( APPLICATION_PATH . '/configs/navigation.xml', 'nav');
  $navigation = Zend_Navigation( $config );

  $fc = Zend_Controller_Front::getInstance();
  $fc->registerPlugin( new WD_Controller_Plugin_Nav() );
  $view->navigation( $navigation );
}

библиотека / WD / Controller / Plugin / Nav.php:

class WD_Controller_Plugin_Nav extends Zend_Controller_Plugin_Abstract {

    public function postDispatch() {
        $uri = $this->_request->getPathInfo();
            $view = Zend_Layout::getMvcInstance()->getView();
        $activeNav = $view->navigation()->findByUri($uri)->setActive(true);
    }
}

веб-вывод:

Неисследованное исключение 'Zend_Loader_PluginLoader_Exception' с сообщением «Плагин по имени 'FindByUri' не был найден в реестра

Я в значительной степени знаю, что я делаю неправильно, поскольку я ссылаюсь на навигацию помощника Zend View, а не на навигацию напрямую (метод findByUri существует непосредственно в Zend_Navigation), но я не уверен, как правильно ссылаться на него ,

1 Ответ

1 голос
/ 21 января 2010

Плагины контроллеров по умолчанию не имеют ссылки на объект представления, как это делают контроллеры. Есть много разных способов получить ваш экземпляр экземпляра.

Один, с помощью помощника действий ViewRenderer, вот так:

$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view;

Два, из вашего макета:

$view = Zend_Layout::getMvcInstance()->getView();

Или, как всегда, из вашего приложения при загрузке. Но это будет зависеть от того, как вы его настроите.

Как только вы это сделаете, вам будет доступен метод getContainer() в all помощниках вида навигации. Итак,

$container = $view->navigation()->getContainer();

Должно работать на вас,

...