1: <?php
2:
3: namespace PHPixie\ORM\Data\Types;
4:
5: class Map extends \PHPixie\ORM\Data\Type\Implementation
6: implements \PHPixie\ORM\Data\Type\Diffable
7: {
8: protected $dataBuilder;
9: protected $data;
10: protected $originalData;
11:
12: public function __construct($dataBuilder, $data = null)
13: {
14: $this->dataBuilder = $dataBuilder;
15:
16: $this->data = (array) $data;
17: $this->originalData = $data;
18: }
19:
20: public function get($key, $default = null)
21: {
22: if(array_key_exists($key, $this->data))
23: return $this->data[$key];
24:
25: return $default;
26: }
27:
28: public function getRequired($key)
29: {
30: if(array_key_exists($key, $this->data))
31: return $this->data[$key];
32:
33: throw new \PHPixie\ORM\Exception\Data("Field '$key' is not set");
34: }
35:
36: protected function setValue($key, $value)
37: {
38: $this->data[$key] = $value;
39: }
40:
41: public function data()
42: {
43: return (object) $this->data;
44: }
45:
46: public function originalData()
47: {
48: return $this->originalData;
49: }
50:
51: public function setCurrentAsOriginal()
52: {
53: $this->originalData = $this->data();
54: }
55:
56: public function diff()
57: {
58: $currentData = $this->data;
59: $originalData = (array) $this->originalData;
60: $unset = array_diff(array_keys($originalData), array_keys($currentData));
61: $data = array_fill_keys($unset, null);
62:
63: foreach ($currentData as $key => $value) {
64: if (!array_key_exists($key, $originalData) || $value !== $originalData[$key])
65: $data[$key] = $value;
66: }
67:
68: return $this->dataBuilder->diff((object) $data);
69: }
70: }