Używając buforowania fragmentarycznego lub buforowania stron często spotykamy się z sytuacją, gdzie cała porcja wyjścia jest relatywnie statyczna za wyjątkiem jednego lub kilku miejsc. Na przykład, strona pomocy może wyświetlać statyczną pomoc wraz z nazwą użytkownika aktualnie zalogowanego, wyświetlaną na górze strony.
Aby rozwiązać ten problem, możemy uzmiennić zawartość bufora w zależności od użytkownika, jednakże jest to bardzo duża strata naszej cennej przestrzeni bufora, ponieważ większość zawartości, poza nazwą użytkownika jest taka sama. Możemy również podzielić stronę na kilka części i buforować je osobno, ale to komplikuje nasz widok i czyni nasz kod bardziej skomplikowanym. Lepszym podejściem jest używanie funkcjonalności dynamicznej zawartości (ang. dynamic content) dostarczanej przez CController.
Dynamiczna zawartość oznacza część wyjścia, która nie powinna być buforowana nawet jeśli jest ona zawarta wewnątrz buforowania fragmentarycznego. Aby uczynić zawartość dynamiczną przez cały czas, musi być ona generowana za każdym razem, nawet jeśli ta zamknięta zawartość została dostarczona przez bufor. Z tego powodu, potrzebujemy aby dynamiczna zawartość była generowana przez jakąś metodę bądź funkcję.
Wywołujemy CController::renderDynamic() do wstawiania dynamicznej zawartości w wybranym miejscu:
...pozostała zawartość HTML... if($this->beginCache($id)) { ...część zawartości, która będzie buforowana... $this->renderDynamic($callback); ...część zawartości, która będzie buforowana... $this->endCache(); } ...pozostała zawartość HTML...
Powyżej, $callback
odpowiada poprawnej funkcji tylko callback w PHP. Może to być
łańcuch znaków odpowiadający nazwie metody w klasie aktualnego kontrolera lub też
globalna funkcja. Może to być również tablica wskazująca na metodę klasy. Każdy dodatkowy
parametr metody renderDynamic() będzie przekazany
do funkcji callback. Callback powinien zwrócić dynamiczną zawartość zamiast ją wyświetlać.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.