Столкнулся с небольшой проблемой при одновременном использовании в проекте на ZF класса Zend_Navigation и переопределенных или дополненных роутов.
Простой пример с использованием своих роутеров:
<route>page/:show</route>
При подключении Navigation и рендеринге страниц контейнера класс будет опираться на адрес, который подошел под правило роутера и перевел запрос на описанный в параметрах обработчик. Получается, что роутер влияет на конечные ссылки и свойства страниц игнорируются. На практике получается так. Мы переходим по ссылке /module/controller/action, ссылки меню рендерятся правильно по своим свойствам. Стоит перейти по ссылке /page/page1, которую наш переопределенный роутер поймает и назначит обработчика, меню на странице опирается на данные роутинга и вместо ожидаемых /module/controller/action в одном из пунктов появляется /page/.
Первый способ
Выход нашелся достаточно простой — поскольку Navigation зависит от роутера (строки запроса), нужно обнулить сам запрос непосредственно после отработки роутера, то есть на routeShutdown:
class MyApp_Plugin_Navigation extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$fixingRoute = new Zend_Controller_Request_Http();
$fixingRoute->setRequestUri('/');
$router->route($fixingRoute);
}
}
Плагин регистрируется в frontController-е и навигация формирует правильные ссылки независимо от глубины вложенности.
Второй способ
Спустя время я понял, что кардинально ошибся в настройке класса навигации в проекте. Случилось это из-за тотальной кривизны документации по Zend Framework и ее неактуальности. Очень часто в коде библиотеки встречаются методы, не описанные в документации.
Так вот для правильной работы навигации с приписанными роутерами нужно все лишь задать используемый для страницы маршрут по умолчанию, правда сделать это придется для всех страниц контейнера. В моем случае с конфигами на xml нужно дописать к свойствам страницы:
<main>
<label>Главная</label>
<module>default</module>
<controller>index</controller>
<action>index</action>
<resource>default:index</resource>
<privilege>index</privilege>
<route>default</route>
</main>




