Когда мы используем кэширование фрагментов или кэширование страниц, то часто попадаем в ситуацию, когда целые части содержимого на выходе относительно статичны, кроме одного или нескольких мест. Например, страница помощи может отображать статичную вспомогательную информацию наряду с именем авторизованного пользователя, отображаемого вверху.
Для решения этой проблемы мы можем варьировать содержимое кэша в зависимости от имени пользователя, но это было бы очень большой тратой драгоценного места (на диске) для кэширования практически одинакового содержимого, кроме имени пользователя. Мы также можем разделить страницу на несколько фрагментов и кэшировать их по отдельности, но это усложняет наше представление и делает код слишком сложным. Наилучший способ - использование возможности динамического содержимого, обеспечиваемой классом CController.
Динамическое содержимое означает фрагмент содержимого на выходе, который не должен кэшироваться, даже если он включен в кэшированный фрагмент. Для обеспечения динамичности содержимого, его нужно генерировать каждый раз, даже если окружающий контент взят из кэша. Для решения этой задачи, нам требуется, чтобы динамическое содержимое генерировалось некой функцией или методом.
Мы вызываем метод CController::renderDynamic() для вставки динамического содержимого в нужное место.
...другое HTML-содержимое... if($this->beginCache($id)) { ...фрагмент кэшируемого содержимого... $this->renderDynamic($callback); ...фрагмент кэшируемого содержимого... $this->endCache(); } ...другое HTML-содержимое...
В коде выше, $callback
- это корректный обратный PHP-вызов. Это
может быть строка с именем метода текущего контроллера или глобальной функции.
Также это может быть массив, ссылающийся на метод класса. Любые дополнительные
параметры в методе renderDynamic() должны быть
переданы обратному вызову. Обратный вызов должен не отображать динамическое
содержимое, а вернуть его.
Signup or Login in order to comment.