Commit | Line | Data |
---|---|---|
6d4b9264 TO |
1 | <?php /* |
2 | +--------------------------------------------------------------------+ | |
bc77d7c0 | 3 | | Copyright CiviCRM LLC. All rights reserved. | |
6d4b9264 | 4 | | | |
bc77d7c0 TO |
5 | | This work is published under the GNU AGPLv3 license with some | |
6 | | permitted exceptions and without any warranty. For full license | | |
7 | | and copyright information, see https://civicrm.org/licensing | | |
6d4b9264 | 8 | +--------------------------------------------------------------------+ |
d25dd0ee | 9 | */ |
6d4b9264 | 10 | |
50bfb460 SB |
11 | /** |
12 | * | |
13 | * @package CRM | |
ca5cec67 | 14 | * @copyright CiviCRM LLC https://civicrm.org/licensing |
50bfb460 SB |
15 | */ |
16 | ||
6d4b9264 TO |
17 | /** |
18 | * Temporarily change a global variable. | |
19 | * | |
0b882a86 | 20 | * ``` |
6d4b9264 TO |
21 | * $globals = CRM_Utils_GlobalStack::singleton(); |
22 | * $globals->push(array( | |
23 | * '_GET' => array( | |
24 | * 'q' => 'some-value | |
25 | * ), | |
26 | * )); | |
27 | * ...do stuff... | |
28 | * $globals->pop(); | |
0b882a86 | 29 | * ``` |
6d4b9264 TO |
30 | * |
31 | * Note: for purposes of this class, we'll refer to the array passed into | |
32 | * push() as a frame. | |
33 | */ | |
34 | class CRM_Utils_GlobalStack { | |
35 | /** | |
36 | * We don't have a container or dependency-injection, so use singleton instead | |
37 | * | |
38 | * @var object | |
6d4b9264 TO |
39 | */ |
40 | private static $_singleton = NULL; | |
41 | ||
be2fb01f | 42 | private $backups = []; |
6d4b9264 TO |
43 | |
44 | /** | |
fe482240 | 45 | * Get or set the single instance of CRM_Utils_GlobalStack. |
6d4b9264 TO |
46 | * |
47 | * @return CRM_Utils_GlobalStack | |
48 | */ | |
6714d8d2 | 49 | public static function singleton() { |
6d4b9264 TO |
50 | if (self::$_singleton === NULL) { |
51 | self::$_singleton = new CRM_Utils_GlobalStack(); | |
52 | } | |
53 | return self::$_singleton; | |
54 | } | |
55 | ||
5bc392e6 EM |
56 | /** |
57 | * @param $newFrame | |
58 | */ | |
6d4b9264 TO |
59 | public function push($newFrame) { |
60 | $this->backups[] = $this->createBackup($newFrame); | |
61 | $this->applyFrame($newFrame); | |
62 | } | |
63 | ||
64 | public function pop() { | |
65 | $this->applyFrame(array_pop($this->backups)); | |
66 | } | |
67 | ||
68 | /** | |
77855840 TO |
69 | * @param array $new |
70 | * The new, incoming frame. | |
a6c01b45 CW |
71 | * @return array |
72 | * frame | |
6d4b9264 TO |
73 | */ |
74 | public function createBackup($new) { | |
be2fb01f | 75 | $frame = []; |
6d4b9264 | 76 | foreach ($new as $globalKey => $values) { |
25c8f5c6 TO |
77 | if (is_array($values)) { |
78 | foreach ($values as $key => $value) { | |
9c1bc317 | 79 | $frame[$globalKey][$key] = $GLOBALS[$globalKey][$key] ?? NULL; |
25c8f5c6 | 80 | } |
0db6c3e1 TO |
81 | } |
82 | else { | |
9c1bc317 | 83 | $frame[$globalKey] = $GLOBALS[$globalKey] ?? NULL; |
6d4b9264 TO |
84 | } |
85 | } | |
86 | return $frame; | |
87 | } | |
88 | ||
5bc392e6 EM |
89 | /** |
90 | * @param $newFrame | |
91 | */ | |
6d4b9264 TO |
92 | public function applyFrame($newFrame) { |
93 | foreach ($newFrame as $globalKey => $values) { | |
25c8f5c6 TO |
94 | if (is_array($values)) { |
95 | foreach ($values as $key => $value) { | |
96 | $GLOBALS[$globalKey][$key] = $value; | |
97 | } | |
0db6c3e1 TO |
98 | } |
99 | else { | |
25c8f5c6 | 100 | $GLOBALS[$globalKey] = $values; |
6d4b9264 TO |
101 | } |
102 | } | |
103 | } | |
96025800 | 104 | |
232624b1 | 105 | } |