1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Http;
9:
10: use Nette;
11:
12:
13: 14: 15: 16: 17:
18: class SessionSection extends Nette\Object implements \IteratorAggregate, \ArrayAccess
19: {
20:
21: private $session;
22:
23:
24: private $name;
25:
26:
27: private $data;
28:
29:
30: private $meta = FALSE;
31:
32:
33: public $warnOnUndefined = FALSE;
34:
35:
36: 37: 38:
39: public function __construct(Session $session, $name)
40: {
41: if (!is_string($name)) {
42: throw new Nette\InvalidArgumentException("Session namespace must be a string, " . gettype($name) . " given.");
43: }
44:
45: $this->session = $session;
46: $this->name = $name;
47: }
48:
49:
50: 51: 52:
53: private function start()
54: {
55: if ($this->meta === FALSE) {
56: $this->session->start();
57: $this->data = & $_SESSION['__NF']['DATA'][$this->name];
58: $this->meta = & $_SESSION['__NF']['META'][$this->name];
59: }
60: }
61:
62:
63: 64: 65: 66:
67: public function getIterator()
68: {
69: $this->start();
70: if (isset($this->data)) {
71: return new \ArrayIterator($this->data);
72: } else {
73: return new \ArrayIterator;
74: }
75: }
76:
77:
78: 79: 80: 81: 82: 83:
84: public function __set($name, $value)
85: {
86: $this->start();
87: $this->data[$name] = $value;
88: if (is_object($value)) {
89: $this->meta[$name]['V'] = Nette\Reflection\ClassType::from($value)->getAnnotation('serializationVersion');
90: }
91: }
92:
93:
94: 95: 96: 97: 98:
99: public function &__get($name)
100: {
101: $this->start();
102: if ($this->warnOnUndefined && !array_key_exists($name, $this->data)) {
103: trigger_error("The variable '$name' does not exist in session section", E_USER_NOTICE);
104: }
105:
106: return $this->data[$name];
107: }
108:
109:
110: 111: 112: 113: 114:
115: public function __isset($name)
116: {
117: if ($this->session->exists()) {
118: $this->start();
119: }
120: return isset($this->data[$name]);
121: }
122:
123:
124: 125: 126: 127: 128:
129: public function __unset($name)
130: {
131: $this->start();
132: unset($this->data[$name], $this->meta[$name]);
133: }
134:
135:
136: 137: 138: 139: 140: 141:
142: public function offsetSet($name, $value)
143: {
144: $this->__set($name, $value);
145: }
146:
147:
148: 149: 150: 151: 152:
153: public function offsetGet($name)
154: {
155: return $this->__get($name);
156: }
157:
158:
159: 160: 161: 162: 163:
164: public function offsetExists($name)
165: {
166: return $this->__isset($name);
167: }
168:
169:
170: 171: 172: 173: 174:
175: public function offsetUnset($name)
176: {
177: $this->__unset($name);
178: }
179:
180:
181: 182: 183: 184: 185: 186:
187: public function setExpiration($time, $variables = NULL)
188: {
189: $this->start();
190: if (empty($time)) {
191: $time = NULL;
192: $whenBrowserIsClosed = TRUE;
193: } else {
194: $time = Nette\DateTime::from($time)->format('U');
195: $max = ini_get('session.gc_maxlifetime');
196: if ($max !== 0 && ($time - time() > $max + 3)) {
197: trigger_error("The expiration time is greater than the session expiration $max seconds", E_USER_NOTICE);
198: }
199: $whenBrowserIsClosed = FALSE;
200: }
201:
202: if ($variables === NULL) {
203: $this->meta['']['T'] = $time;
204: $this->meta['']['B'] = $whenBrowserIsClosed;
205:
206: } elseif (is_array($variables)) {
207: foreach ($variables as $variable) {
208: $this->meta[$variable]['T'] = $time;
209: $this->meta[$variable]['B'] = $whenBrowserIsClosed;
210: }
211:
212: } else {
213: $this->meta[$variables]['T'] = $time;
214: $this->meta[$variables]['B'] = $whenBrowserIsClosed;
215: }
216: return $this;
217: }
218:
219:
220: 221: 222: 223: 224:
225: public function removeExpiration($variables = NULL)
226: {
227: $this->start();
228: if ($variables === NULL) {
229:
230: unset($this->meta['']['T'], $this->meta['']['B']);
231:
232: } elseif (is_array($variables)) {
233:
234: foreach ($variables as $variable) {
235: unset($this->meta[$variable]['T'], $this->meta[$variable]['B']);
236: }
237: } else {
238: unset($this->meta[$variables]['T'], $this->meta[$variables]['B']);
239: }
240: }
241:
242:
243: 244: 245: 246:
247: public function remove()
248: {
249: $this->start();
250: $this->data = NULL;
251: $this->meta = NULL;
252: }
253:
254: }
255: