Я все время борется с Zend_Navigation, и теперь у меня есть еще одна проблема, которая, по моему мнению, явилась причиной многих моих проблем.
Я пытаюсь добавить Zend_Navigation в унаследованное приложение 1.7.6 Zend Framework, я обновил Zend Library до 1.9.0 и обновил загрузку, чтобы это обновление библиотеки.
Проблема в том, что я не знаю, как, а в примерах показан новый метод начальной загрузки того, как добавить объект Navigation в представление, я пробовал это:
//initialise the application layouts with the MVC helpers $layout = Zend_Layout::startMvc(array('layoutPath' => '../application/layouts')); $view = $layout->getView(); $configNav = new Zend_Config_Xml('../application/config/navigation.xml', 'navigation'); $navigation = new Zend_Navigation($configNav); $view->navigation($navigation); $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); $viewRenderer->setView($view);
Похоже, что это выполняется отлично, но когда я перехожу к использованию помощника вида breadcrumb в моем макете, он вызывает ошибки: Строгие стандарты: создание объекта по умолчанию из пустого значения в C: \ www \ moobia \ development \ website \ application \ modules \ работодатели \ контроллеры \ IndexController.php в строке 27
Это вызвано следующим кодом в функции init () моего контроллера.
$uri = $this->_request->getPathInfo(); $activeNav = $this->view->navigation()->findByUri($uri); <- this is null when called $activeNav->active = true;
Я считаю, что это потому, что объект Zend_Navigation не находится в представлении.
Я бы посмотрел на перенос бутстрапа на текущий метод, но в настоящее время у меня не хватает времени для выпуска.
Благодаря,
Грант
Сначала вам нужно выяснить, верно ли ваше подозрение, что Zend_Navigation нет в представлении. Самый простой способ сделать это – добавить:
var_dump($this->view->navigation());exit;
к вашему контроллеру init (). Это должно вернуть объект Zend_Navigation, если он есть.
Если его нет, альтернативный способ предоставления объекта Zend_Navigation – использовать реестр, что может быть проще. Для этого вы удалите материал представления из своего загрузочного файла и просто выполните следующее:
$configNav = new Zend_Config_Xml('../application/config/navigation.xml', 'navigation'); $navigation = new Zend_Navigation($configNav); Zend_Registry::set('Zend_Navigation', $navigation);
ваш элемент init () контроллера останется таким же, как объект представления будет выглядеть в реестре, если он еще не имеет объекта Zend Navigation.
Однако я не уверен, что ваш код init () контроллера будет работать так, как вы хотите. Я не думаю, что findByUri () будет работать на страницах Mvc (но я мог ошибаться), и из вашего предыдущего вопроса было похоже, что большинство страниц вашего XML-файла являются Mvc-тегами. Класс Mvc имеет свойство «href», которое представляется эквивалентным. Если ваш XML-файл содержит оба типа страниц, вам может потребоваться проверить их, поэтому я бы предложил следующее:
$uri = $this->_request->getPathInfo(); if (($activeNav = $this->view->navigation()->findByHref($uri)) !== null) { $activeNav->active = true; } else if (($activeNav = $this->view->navigation()->findByUri($uri)) !== null) { $activeNav->active = true; }