Обновление - см. Обновление ниже.
Я пытаюсь улучшить производительность нашей CMS на основе ZF и пытаюсь кэшировать объект Zend_Navigation
, который я создаю с помощью структуры меню. Кэширование объекта означает, что я не могу установить текущую страницу активной, или у меня будет копия меню в кэше для каждой страницы.
Чтобы разрешить кэширование структуры, независимо от текущей страницы, я переместил выделение текущей страницы в меню на jQuery, который работает хорошо. Затем я заметил, что Breadcrumb_Helper
(который использует тот же объект Zend_Navigation
, что и меню) ничего не отображал - очевидно, потому что у меня не установлена активная страница.
Учитывая, что я знаю идентификатор страницы, есть ли способ попасть внутрь объекта Zend_Navigation
, чтобы установить этот конкретный активный?
В идеале я хотел бы сделать что-то вроде:
$nav->findOneBy("id", $currentPageId)->setActive(true);
Но, похоже, нет способа получить доступ к страницам в объекте, как этот. Глядя на код, используя findOneBy
, чтобы получить текущую страницу, затем removePage
, чтобы удалить ее, затем установить активную собранную и использовать addPage
, чтобы вернуть собранную обновленную страницу, возможно, но довольно запутанный.
Другой вариант - просто кэшировать массив, который я использую для создания объекта Zend_Navigation
, что облегчит активацию текущей страницы после получения базового массива из кэша.
(Я должен указать, что все страницы в cms просто имеют URL-адреса, такие как /privacy
, /about-us
, и перенаправляются на модуль внешнего интерфейса, контроллер и действие по умолчанию, поэтому в URL-адресе нет controllrt / action чтобы позволить ZF выяснить, где он находится.)
Обновление:
Гм ... Похоже, код, который я предложил, действительно работает, и его можно сделать немного проще, используя методы магического поиска ...:
$nav->findOneById($currentPageId)->setActive(true);