Добавьте Zend_Navigation в View со старым старым загрузчиком - PullRequest
1 голос
/ 02 апреля 2010

Я боролся с Zend_Navigation все выходные, и теперь у меня есть другая проблема, которая, как мне кажется, стала причиной многих моих проблем.

Я пытаюсь добавить Zend_Navigation в устаревшее приложение Zend Framework 1.7.6, я обновил библиотеку Zend до 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 \ сайт \ приложение \ модули \ работодатели \ контроллеры \ IndexController.php в строке 27

Это вызвано следующим кодом в функции init () моего контроллера.

$uri = $this->_request->getPathInfo();
$activeNav = $this->view->navigation()->findByUri($uri); <- this is null when called
$activeNav->active = true;

Я полагаю, это потому, что объект Zend_Navigation отсутствует в представлении.

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

Спасибо

Grant

1 Ответ

2 голосов
/ 02 апреля 2010

Сначала вам нужно выяснить, правильно ли ваше подозрение, что 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;
}
...