Установка активной страницы при кэшировании Zend_Navigation? - PullRequest
2 голосов
/ 14 июля 2011

Обновление - см. Обновление ниже.

Я пытаюсь улучшить производительность нашей 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);

1 Ответ

0 голосов
/ 17 августа 2011

Как отмечено выше, это действительно работает:

$nav->findOneById($currentPageId)->setActive(true);
...