1: <?php
2:
3: namespace Zippy;
4:
5: use Zippy\Html\WebPage;
6:
7: /**
8: * Менеджер страниц. Содержит состояние объектов классов
9: * страниц и их историю.
10: *
11: */
12: class PageManager
13: {
14: public const HISTORY_SIZE = 50;
15:
16: private $pages = array();
17: private $index = 0;
18: private $pchain = array();
19: private $curpage = '';
20: private $prevpage = '';
21:
22: /**
23: * Добавляет новую страницу (объект WebPage) в список.
24: * @param WebPage страница
25: * @return int номер страницы
26: * @deprecated
27: */
28: final public function putPage(WebPage $page) {
29: $page->beforeSaveToSession();
30:
31:
32: $this->pages[++$this->index] = ($page);
33: if ($this->index > self::HISTORY_SIZE) {
34: $this->pages[$this->index - self::HISTORY_SIZE] = null;
35: }
36:
37: $prevpage = $this->unpack($this->pages[$this->index - 1]);
38: if ($prevpage instanceof \Zippy\Html\WebPage) {
39:
40: if (get_class($prevpage) != get_class($page)) {
41: // если страница изменилась запоминаем
42:
43: $this->pchain[] = get_class($page);
44: }
45: }
46:
47: return $this->index;
48: }
49: /**
50: * Обновляет персистентные данные страницы.
51: * @param WebPage Экземпляр класса страницы
52: * @param int Номер страницы
53: * @param mixed Версия страницы
54: */
55: final public function updatePage(WebPage $page) {
56:
57: $page->beforeSaveToSession();
58: $pname = get_class($page) ;
59: if($this->curpage != $pname) {
60: $this->prevpage = $this->curpage;
61: $this->pchain[] = $pname;
62: }
63: $this->curpage = $pname ;
64: $this->pages[$pname] = $page;
65: return $pname;
66: }
67: /**
68: * Возвращает из сессии страницу по номеру и версии
69: * @param Integer Номер страницы
70: * @param int Версия страницы
71: * @return WebPage страница
72: */
73: final public function getPage($number) {
74: if (isset($this->pages[$number])) {
75:
76: if ($this->pages[$number] instanceof WebPage) {
77: $page = ($this->pages[$number]);
78: } else {
79: $page = $this->unpack($this->pages[$number]);
80: }
81:
82:
83: if ($page instanceof WebPage) {
84: $page->afterRestoreFromSession();
85: } else {
86: $page = null;
87: }
88: return $page;
89: }
90:
91: return null;
92: }
93:
94: /**
95: * Возвращает из сессии последнюю добавленую страницу
96: * @return WebPage страница
97: */
98: final public function getLastPage() {
99: return array_pop($this->pchain);
100: }
101:
102:
103:
104: public function __sleep() {
105: //упаковываем страницы
106: $pl = array();
107: foreach ($this->pages as $n => $p) {
108: if ($p instanceof WebPage) {
109: $pl[] = $n;
110: }
111: }
112: foreach ($pl as $n) {
113: $this->pages[$n] = $this->pack($this->pages[$n]);
114: }
115: return array('pages', 'index', 'pchain','curpage','prevpage');
116: }
117:
118: public function __wakeup() {
119: if (is_array($this->pages)) {
120: return;
121: }
122: // $this->pages = @unserialize(@gzuncompress($this->pages));
123: }
124:
125: /**
126: * возвращает класс предыдущей страницы
127: *
128: */
129: public function getPrevPage() {
130: array_pop($this->pchain);
131: return array_pop($this->pchain);
132: }
133:
134:
135: private function pack($page) {
136: return gzcompress(serialize($page));
137: }
138:
139: private function unpack($page) {
140: $p = @gzuncompress($page);
141: if (strlen($p) == 0) {
142: return null;
143: }
144: return unserialize($p);
145: }
146:
147: }
148: